柚子快報(bào)邀請(qǐng)碼778899分享:爬蟲的第一個(gè)小程序
柚子快報(bào)邀請(qǐng)碼778899分享:爬蟲的第一個(gè)小程序
1.爬蟲三大庫
?因?yàn)榕老x需要用到這三個(gè)Requests,BeautifulSoup和Lxml庫,所以先說一下我是如何安裝,和使用的。
1.1 Requests庫
1.1.1 requests庫的安裝
我是通過pycharm下載的第三方庫requests
打開pycharm后點(diǎn)擊File>>Settings>>Project>>Project>>Python Interpreter>>點(diǎn)擊右方“+”號(hào)>>在搜索欄中輸入requests>>下方的選項(xiàng)欄中出現(xiàn)requests后點(diǎn)擊requests>>點(diǎn)擊下方的Install Package
最后在這一欄中出現(xiàn)了requests就算安裝完成了
1.1.2 Requests庫的介紹和使用
1.Requests庫的作用就是請(qǐng)求網(wǎng)站獲取網(wǎng)頁數(shù)據(jù)的。
2.reqests是一個(gè)很強(qiáng)大的第三方庫,可以發(fā)送http請(qǐng)求和處理響應(yīng)。常用的有:
1).發(fā)送get請(qǐng)求requests.get()
2).發(fā)送post請(qǐng)求,requests.post()
3).設(shè)置請(qǐng)求頭,例如:User-Agent、Authorization等
import requests
# 使用get方法發(fā)送get請(qǐng)求,并獲取響應(yīng)內(nèi)容
res = requests.get('http://bj.xiaozhu.com/')
# pycharm中返回結(jié)果為
print(res)
3.時(shí)候爬蟲需要加入請(qǐng)求頭來偽裝成瀏覽器,以便更好的抓取數(shù)據(jù)。
所以為什么要加入請(qǐng)求頭呢?
第一、先了解請(qǐng)求頭是什么東西
請(qǐng)求頭是在http請(qǐng)求中發(fā)送的一系列額外的信息,它們提供了關(guān)于請(qǐng)求本身、客戶端環(huán)境 、以及請(qǐng)求上下文的信息。請(qǐng)求頭在客戶端與服務(wù)器之間的通信中起到了重要的作用。 我對(duì)請(qǐng)求頭的理解:瀏覽器是人,服務(wù)器是保險(xiǎn)柜,而請(qǐng)求頭就是鑰匙或者說是密碼,沒有相應(yīng)的密碼是無法打開保險(xiǎn)柜的。 如果請(qǐng)求頭不對(duì),瀏覽器就會(huì)覺得你是不對(duì)密碼不會(huì)給你響應(yīng)(開門),你就拿不到信息(錢) 而其中我們最常用的請(qǐng)求頭就是User-Agent:標(biāo)識(shí)客戶端的瀏覽器或應(yīng)用程序類型,以便服務(wù)器能夠針對(duì)不同客戶端進(jìn)行適配。 服務(wù)器可以使用 User-Agent 頭來識(shí)別客戶端的類型和版本,以便為不同的客戶端提供適當(dāng)?shù)捻憫?yīng)。
請(qǐng)求頭的使用方法:
在網(wǎng)頁頁面右擊,點(diǎn)擊檢查,選擇Network,如果沒有刷新一下。復(fù)制User-Agent的內(nèi)容
import requests
headers = {
'User-Agent':
'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.5735.289 Safari/537.36'
}
res = requests.get('http://bj.xiaozhu.com/',headers=headers)
print(res.text)
4.Requests庫有時(shí)候也會(huì)出現(xiàn)問題,而requests庫的錯(cuò)誤和異常主要有:?
ConnectionError:網(wǎng)絡(luò)問題 HTTPError:HTTP請(qǐng)求返回不了成功的狀態(tài)碼 Timeout:請(qǐng)求超時(shí) TooManyRedirects:請(qǐng)求超過了設(shè)定的最大重定向次數(shù) 當(dāng)發(fā)現(xiàn)這些錯(cuò)誤和異常而進(jìn)行代碼修改重新再來時(shí),爬蟲程序又開始重新運(yùn)行了,爬取到的數(shù)據(jù)又會(huì)重新爬取一次, 這對(duì)于爬蟲效率和質(zhì)量來說都是不利的。 這時(shí)可以通過python的try來避免異常了
import requests
headers = {
'User-Agent':
'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.5735.289 Safari/537.36'
}
res = requests.get('http://bj.xiaozhu.com/',headers=headers)
try:
print(res.text)
except ConnectionError: # 出現(xiàn)ConnectionError時(shí),會(huì)執(zhí)行下面的操作
print('拒絕連接')
1.2 BeautifulSoup庫
1.2.1 bs4庫的安裝
Beautiful庫和requests庫的安裝過程
有點(diǎn)不一樣,因?yàn)?BeautifulSoup 庫屬于 bs4,或者說 bs4 是 BeautifulSoup 庫的一個(gè)特定版本。所以我們?cè)趐ycharm中下載bs4,同下載requests庫一樣只需要將搜索的requests換成bs4
1.2.2 BeautifulSoup庫的介紹和使用
1. BeautifulSoup庫的介紹?
通過BeautifulSoup庫可以很輕松地解析Requests庫請(qǐng)求的網(wǎng)頁, 并把網(wǎng)頁源代碼解析為Soup文檔,以便過濾提取數(shù)據(jù)。
2. BeautifulSoup庫的使用
import requests
from bs4 import BeautifulSoup
headers = {'User-Agent':
'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.5735.289 Safari/537.36'
}
res = requests.get('http://bj.xiaozhu.com/',headers = headers)
# BeautifulSoup是一個(gè)Python庫,用于從HTML或XML文檔中提取數(shù)據(jù)。
# res.text是一個(gè)包含HTML代碼的字符串,'html.parser'是解析器的名稱,它告訴BeautifulSoup使用HTML解析器來解析HTML代碼。
soup = BeautifulSoup(res.text,'html.parser') # 對(duì)返回的結(jié)果進(jìn)行解析
print(soup.prettify())
# soup.prettify 是 BeautifulSoup庫中的一個(gè)方法,用于將解析后的HTML代碼格式化為易于閱讀的格式。
1.3 Lxml庫
1.3.1lxml庫的安裝
同上一樣。
1.3.2 lxml庫的介紹
Lxml庫是基于libxml12這一個(gè)XML解析庫的Python封裝。該模塊使用C語言編寫,解析速度比BeautifulSoup更快。
2.綜合實(shí)例———爬取酷狗TOP500的數(shù)據(jù)
import requests
from bs4 import BeautifulSoup
import time
# 爬蟲思路分析
# (1)爬取的內(nèi)容為酷狗榜單中TOP500的音樂信息
# (2)網(wǎng)頁版的酷狗不能手動(dòng)翻頁進(jìn)行下一步的瀏覽,但通過觀察第一頁的URL:
# https://www.kugou.com/yy/rank/home/1-8888.html
# 這里嘗試把數(shù)字1換成2再進(jìn)行瀏覽,恰好返回的是第二頁信息。
# 每頁顯示22首歌,所以總共需要23個(gè)URL
# (3)需要爬取的信息有
# 排名情況
# 歌手
# 歌曲名
# 歌曲時(shí)間
headers = {'User-Agent':
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36'
}
def kugou_info(url):
res = requests.get(url, headers=headers)
res.encoding = 'utf-8'
soup = BeautifulSoup(res.text, 'html.parser')
ranks = soup.select('#rankWrap > div.pc_temp_songlist > ul > li> span.pc_temp_num')
titles = soup.select('#rankWrap > div.pc_temp_songlist > ul > li > a')
times = soup.select('#rankWrap > div.pc_temp_songlist > ul > li > span.pc_temp_tips_r > span')
for rank, title, time in zip(ranks, titles, times):
data = {
'rank': rank.get_text().strip(), # strip()是python中的一個(gè)字符串方法,
# 用于去除字符串的兩端空白字符(包括空格、換行符、制表符)。
# 他不會(huì)刪除字符串中間的空白字符。
'singer': title.get_text().split('-')[1].strip(),
'song': title.get_text().split('-')[0].strip(),
'time': time.get_text().strip()
}
print(data)
if __name__ == '__main__':
urls = ['https://www.kugou.com/yy/rank/home/{}-8888.html'.format(str(i)) for i in range(1, 24)] # 列表推導(dǎo)式
for url in urls:
kugou_info(url)
time.sleep(1)
小拓展:
1.在python中,if_name_=="_main_":是一個(gè)特殊的條件語句,用于判斷當(dāng)前文件是否作為 主程序運(yùn)行,它的主要作用有以下幾點(diǎn): 1.組織代碼:使用這個(gè)語句可以將主程序的邏輯與被導(dǎo)入文件的邏輯分開。在主程序中, 你可以編寫與程序整體運(yùn)行相關(guān)的代碼,而在被導(dǎo)入文件中,你可以編寫模塊級(jí)的函數(shù)和變量
2.避免重復(fù)執(zhí)行:當(dāng)一個(gè)文件被其他文件導(dǎo)入時(shí),_name_的值為文件名,條件語句為假, 后續(xù)代碼不會(huì)被執(zhí)行。這可以避免在導(dǎo)入文件時(shí)執(zhí)行不必要的代碼,提高代碼的效率和可讀性。
3.方便測(cè)試:通過將測(cè)試代碼放在if_name_=="_main_":塊中,可以在單獨(dú)運(yùn)行主程序時(shí)進(jìn)行測(cè)試, 而不會(huì)影響其他文件的導(dǎo)入和使用。
總的來說,if_name_=="_main_":語句提供了一種方便的方式來組織和測(cè)試代碼,使你的代碼更加 模塊化和易于維護(hù)。 ?
2.列表推導(dǎo)式 是一種簡(jiǎn)潔的方式來創(chuàng)新一個(gè)新的列表,其中包含滿足某些條件的元素。它的語法類似于循環(huán),但將 循環(huán)和條件合并到一行中。
列表推導(dǎo)式的基本結(jié)構(gòu)是:[expression for item in iterable] 其中: expression是一個(gè)計(jì)算機(jī)每個(gè)元素的表達(dá)式 item是從可迭代對(duì)象(如列表、元組等)中取出的每個(gè)元素 iterable是可迭代對(duì)象本身
示例: numbers=[1,2,3,4,5] squares=[number ** 2 for number in numbers] print(squares) ?
柚子快報(bào)邀請(qǐng)碼778899分享:爬蟲的第一個(gè)小程序
文章鏈接
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場(chǎng)。
轉(zhuǎn)載請(qǐng)注明,如有侵權(quán),聯(lián)系刪除。