今天跟大家出的這篇文章,是從爬蟲(chóng)的起點(diǎn)開(kāi)始講起,這里的Python學(xué)習(xí)教程,一篇文章帶你貫穿爬蟲(chóng)始末!之前也夠跟大家出過(guò)相關(guān)的Python相關(guān)的Python學(xué)習(xí)教程,伙伴們也可以翻閱一下以前的!
爬蟲(chóng)系列文章的第一篇,這里便為大家講解了HTTP原理,很多人好奇:好好的講爬蟲(chóng)和HTTP有什么關(guān)系?其實(shí)我們常說(shuō)的爬蟲(chóng)(也叫網(wǎng)絡(luò)爬蟲(chóng))就是使用一些網(wǎng)絡(luò)協(xié)議發(fā)起的網(wǎng)絡(luò)請(qǐng)求,而目前使用最多的網(wǎng)絡(luò)協(xié)議便是HTTP/S網(wǎng)絡(luò)協(xié)議簇。
一、Python有哪些網(wǎng)絡(luò)庫(kù)
在真實(shí)瀏覽網(wǎng)頁(yè)我們是通過(guò)鼠標(biāo)點(diǎn)擊網(wǎng)頁(yè)然后由瀏覽器幫我們發(fā)起網(wǎng)絡(luò)請(qǐng)求,那在Python中我們又如何發(fā)起網(wǎng)絡(luò)請(qǐng)求的呢?答案當(dāng)然是庫(kù),具體哪些庫(kù)?豬哥給大家列一下:
Python2: httplib、httplib2、urllib、urllib2、urllib3、requests
Python3: httplib2、urllib、urllib3、requests
Python網(wǎng)絡(luò)請(qǐng)求庫(kù)有點(diǎn)多,而且還看見(jiàn)網(wǎng)上還都有用過(guò)的,那他們之間有何關(guān)系?又該如何選擇?
httplib/2:
這是一個(gè)Python內(nèi)置http庫(kù),但是它是偏于底層的庫(kù),一般不直接用。
而httplib2是一個(gè)基于httplib的第三方庫(kù),比httplib實(shí)現(xiàn)更完整,支持緩存、壓縮等功能。
一般這兩個(gè)庫(kù)都用不到,如果需要自己 封裝網(wǎng)絡(luò)請(qǐng)求可能會(huì)需要用到。
urllib/urllib2/urllib3:
urlliib是一個(gè)基于httplib的上層庫(kù),而urllib2和urllib3都是第三方庫(kù),urllib2相對(duì)于urllib增加一些高級(jí)功能,如:HTTP身份驗(yàn)證或Cookie等,在Python3中將urllib2合并到了urllib中。urllib3提供線(xiàn)程安全連接池和文件post等支持,與urllib及urllib2的關(guān)系不大。
requests:
requests庫(kù)是一個(gè)基于urllib/3的第三方網(wǎng)絡(luò)庫(kù),它的特點(diǎn)是功能強(qiáng)大,API優(yōu)雅。由上圖我們可以看到,對(duì)于http客戶(hù)端python官方文檔也推薦我們使用requests庫(kù),實(shí)際工作中requests庫(kù)也是使用的比較多的庫(kù)。
綜上所述,我們選擇選擇requests庫(kù)作為我們爬蟲(chóng)入門(mén)的起點(diǎn)。另外以上的這些庫(kù)都是同步網(wǎng)絡(luò)庫(kù),如果需要高并發(fā)請(qǐng)求的話(huà)可以使用異步網(wǎng)絡(luò)庫(kù):aiohttp,這個(gè)后面豬哥也會(huì)為大家講解。
二、requests介紹
希望大家永遠(yuǎn)記?。簩W(xué)任何一門(mén)語(yǔ)言,都不要忘記去看看官方文檔。也許官方文檔不是最好的入門(mén)教程,但絕對(duì)是最新、最全的教學(xué)文檔!
1.首頁(yè)
requests核心宗旨便是讓用戶(hù)使用方便,間接表達(dá)了他們?cè)O(shè)計(jì)優(yōu)雅的理念。
【注意】:非專(zhuān)業(yè)使用其他 HTTP 庫(kù)會(huì)導(dǎo)致危險(xiǎn)的副作用,包括:安全缺陷癥、冗余代碼癥、重新發(fā)明輪子癥、啃文檔癥、抑郁、頭疼、甚至死亡。
2.功能特性
都說(shuō)requests功能強(qiáng)大,那我們來(lái)看看requests到底有哪些功能特性吧:
Keep-Alive & 連接池
國(guó)際化域名和 URL
帶持久 Cookie 的會(huì)話(huà)
瀏覽器式的 SSL 認(rèn)證
自動(dòng)內(nèi)容解碼
基本/摘要式的身份認(rèn)證
優(yōu)雅的 key/value Cookie
自動(dòng)解壓
Unicode 響應(yīng)體
HTTP(S) 代理支持
文件分塊上傳
流下載
連接超時(shí)
分塊請(qǐng)求
支持 .netrc
requests 完全滿(mǎn)足今日 web 的需求。Requests 支持 Python 2.6—2.7以及3.3—3.7,而且能在 PyPy 下完美運(yùn)行。
三、安裝requests
pip 安裝:
pip install requests
如果是pip3則使用
pip3 install requests
如果你使用anaconda則可以
conda install requests
如果你不想用命令行,可在pycharm中這樣下載庫(kù)
四、爬蟲(chóng)流程
下圖是之前工作總結(jié)的一個(gè)項(xiàng)目開(kāi)發(fā)流程,算是比較詳細(xì),在開(kāi)發(fā)一個(gè)大型的項(xiàng)目真的需要這么詳細(xì),不然項(xiàng)目上線(xiàn)出故障或者修改需求都無(wú)法做項(xiàng)目復(fù)盤(pán),到時(shí)候程序員就有可能背鍋祭天。。。
言歸正傳,給大家看項(xiàng)目的開(kāi)發(fā)流程是想引出爬蟲(chóng)爬取數(shù)據(jù)的流程:
確定需要爬取的網(wǎng)頁(yè)
瀏覽器檢查數(shù)據(jù)來(lái)源(靜態(tài)網(wǎng)頁(yè)or動(dòng)態(tài)加載)
尋找加載數(shù)據(jù)url的參數(shù)規(guī)律(如分頁(yè))
代碼模擬請(qǐng)求爬取數(shù)據(jù)
五、爬取某東商品頁(yè)
以某東商品頁(yè)為例子帶大家學(xué)習(xí)爬蟲(chóng)的簡(jiǎn)單流程,為什么以某東下手而不是某寶?因?yàn)槟硸|瀏覽商品頁(yè)不需要登錄,簡(jiǎn)單便于大家快速入門(mén)!
1.第一步:瀏覽器中找到你想爬取的商品
ps:并不是在開(kāi)車(chē)哦,為什么選這款商品?因?yàn)楹竺鏁?huì)爬取這款商品的評(píng)價(jià)做數(shù)據(jù)分析,是不是很刺激!
2.第二步:瀏覽器檢查數(shù)據(jù)來(lái)源
打開(kāi)瀏覽器調(diào)試窗口是為了查看網(wǎng)絡(luò)請(qǐng)求,看看數(shù)據(jù)是怎么加載的?是直接返回靜態(tài)頁(yè)面呢,還是js動(dòng)態(tài)加載呢?
鼠標(biāo)右鍵然后點(diǎn)檢查或者直接F12即可打開(kāi)調(diào)試窗口,這里豬哥推薦大家使用Chrome瀏覽器,為什么?因?yàn)楹糜?,程序員都在用!具體的Chrome如何調(diào)試,大家自行網(wǎng)上看教程!
打開(kāi)調(diào)試窗口之后,我們就可以重新請(qǐng)求數(shù)據(jù),然后查看返回的數(shù)據(jù),確定數(shù)據(jù)來(lái)源。
3.第三步:尋找加載數(shù)據(jù)url的參數(shù)規(guī)律
我們可以看到第一個(gè)請(qǐng)求鏈接:https://item.jd.com/1263013576.html 返回的數(shù)據(jù)便是我們要的網(wǎng)頁(yè)數(shù)據(jù)。因?yàn)槲覀兪桥廊∩唐讽?yè),所以不存在分頁(yè)之說(shuō)。
當(dāng)然價(jià)格和一些優(yōu)惠券等核心信息是通過(guò)另外的請(qǐng)求加載,這里我們暫時(shí)不討論,先完成我們的第一個(gè)小例子!
4.第四步:代碼模擬請(qǐng)求爬取數(shù)據(jù)
獲取url鏈接之后我們來(lái)開(kāi)始寫(xiě)代碼吧
import requestsdef spider_jd():
"""爬取京東商品頁(yè)"""
url = 'https://item.jd.com/1263013576.html'
try:
r = requests.get(url) # 有時(shí)候請(qǐng)求錯(cuò)誤也會(huì)有返回?cái)?shù)據(jù)
# raise_for_status會(huì)判斷返回狀態(tài)碼,如果4XX或5XX則會(huì)拋出異常
r.raise_for_status()
print(r.text[:500]) except:
print('爬取失敗')if __name__ == '__main__':
spider_jd()
檢查返回結(jié)果
至此我們就完成了某東商品頁(yè)的爬取,雖然案例簡(jiǎn)單,代碼很少,但是爬蟲(chóng)的流程基本差不多,希望想學(xué)爬蟲(chóng)的同學(xué)自己動(dòng)動(dòng)手實(shí)踐一把,選擇自己喜歡的商品抓取一下,只有自己動(dòng)手才能真的學(xué)到知識(shí)!
六、requests庫(kù)介紹
上面我們使用了requests的get方法,我們可以查看源碼發(fā)現(xiàn)還有其他幾個(gè)方法:post、put、patch、delete、options、head,他們就是對(duì)應(yīng)HTTP的請(qǐng)求方法。
這里簡(jiǎn)單給大家列一下,后面會(huì)用大量的案例來(lái)用而后學(xué),畢竟枯燥的講解沒(méi)人愿意看。
requests.post('http://httpbin.org/post', data = {'key':'value'})
requests.patch('http://httpbin.org/post', data = {'key':'value'})
requests.put('http://httpbin.org/put', data = {'key':'value'})
requests.delete('http://httpbin.org/delete')
requests.head('http://httpbin.org/get')
requests.options('http://httpbin.org/get')
注:httpbin.org是一個(gè)測(cè)試http請(qǐng)求的網(wǎng)站,能正?;貞?yīng)請(qǐng)求
七、總結(jié)
今天為大家簡(jiǎn)單介紹了一下這個(gè)非常重要的庫(kù):requests,requests可以勝任很多簡(jiǎn)單的爬蟲(chóng)需求,它強(qiáng)大的功能以及優(yōu)美的api得到一致的認(rèn)同。
有人多同學(xué)會(huì)問(wèn):Python爬蟲(chóng)到什么境界才算是入門(mén)?你會(huì)熟練使用requests庫(kù)去實(shí)現(xiàn)一些簡(jiǎn)單的爬蟲(chóng)功能就算入門(mén),并不是說(shuō)需要會(huì)各種框架才算是入門(mén),相反能使用低級(jí)工具實(shí)現(xiàn)功能的才更具潛力!
如果你有 有趣的爬蟲(chóng)案例或者想法,可以留言哈,根大家分享一下你的騷操作~
更多的Python學(xué)習(xí)教程也會(huì)繼續(xù)為大家更新!
聯(lián)系客服