網(wǎng)絡(luò)爬蟲(Web crawler)
網(wǎng)絡(luò)爬蟲又稱為爬蟲早处,是一種系統(tǒng)地瀏覽萬維網(wǎng)的互聯(lián)網(wǎng)機(jī)器人沪饺,通常由搜索引擎操作用于建立網(wǎng)頁索引浪册。又被稱為網(wǎng)絡(luò)蜘蛛鼻百,是由于互聯(lián)網(wǎng)是由無數(shù)個(gè)服務(wù)器自主運(yùn)行充當(dāng)網(wǎng)絡(luò)節(jié)點(diǎn),而通過網(wǎng)絡(luò)協(xié)議將其鏈接的一個(gè)網(wǎng)絡(luò)严望,爬蟲在搜索查找的過程就像是蜘蛛在不同節(jié)點(diǎn)走動(dòng)多艇,故稱為網(wǎng)網(wǎng)絡(luò)蜘蛛。針對(duì)小規(guī)模的網(wǎng)頁爬蟲可以使用Requests庫像吻,對(duì)于網(wǎng)站等中規(guī)模爬蟲對(duì)爬取速度敏感需要用Scrapy庫峻黍,而全網(wǎng)爬取是用于構(gòu)建搜索引擎索引則需要定制開發(fā)复隆。
HTTP協(xié)議(超文本傳輸協(xié)議)
超文本傳輸協(xié)議用于規(guī)范萬維網(wǎng)上服務(wù)器與瀏覽器間信息傳遞的一種協(xié)議(請(qǐng)求-響應(yīng)協(xié)議),以TCP傳輸層協(xié)議為基礎(chǔ)是一種應(yīng)用層協(xié)議奸披。
具體內(nèi)容看圖解HTTP 了解Web及網(wǎng)絡(luò)基礎(chǔ)
Requests框架
Requests框架是一個(gè)通用簡便的爬蟲框架昏名,對(duì)urllib3進(jìn)行了高層封裝讓你更便捷地發(fā)出HTTP請(qǐng)求涮雷,號(hào)稱是“為人類準(zhǔn)備的HTTP庫”阵面。Requests官網(wǎng)
requests庫有7個(gè)主要方法,但本質(zhì)上只有一個(gè)主要方法request()洪鸭,其他的方法都是出于使用方便考慮依照HTTP協(xié)議的6大方式封裝出來的(函數(shù)內(nèi)部就是在方法request()中通過第一個(gè)參數(shù)指定方式)样刷。
在這6個(gè)方法中需要重點(diǎn)掌握get(),該方法構(gòu)造一個(gè)向服務(wù)器請(qǐng)求資源的Requests對(duì)象览爵,提交后返回包含服務(wù)器資源的Response對(duì)象(該對(duì)象包含服務(wù)器返回的所有信息置鼻,包括Request的請(qǐng)求信息)。以下是Response對(duì)象的屬性:
其中的content屬性說是二進(jìn)制形式的內(nèi)容是指圖像蜓竹、音頻等文件
爬取網(wǎng)頁的通用代碼框架
import requests
try:
r = requests.get("http://www.baidu.com", timeout=30)
r.raise_for_status() # 返回值不是200的話會(huì)引發(fā)HTTPError
print(r.encoding)
print(r.apparent_encoding)
r.encoding = r.apparent_encoding # 將從內(nèi)容猜測(cè)出來的文本編碼方式作為此文檔的編碼方式
print(r.text[:10])
except:
print("異常")
網(wǎng)絡(luò)爬蟲合法指南
網(wǎng)絡(luò)爬蟲的風(fēng)險(xiǎn)
- 性能騷擾:web服務(wù)器是面向人類訪問開發(fā)箕母,而爬蟲利用計(jì)算機(jī)模擬訪問機(jī)制向服務(wù)器發(fā)送了大量的請(qǐng)求,可能對(duì)服務(wù)器帶來巨大的資源消耗
- 法律分險(xiǎn):服務(wù)器的數(shù)據(jù)具有產(chǎn)權(quán)歸屬俱济,爬取的數(shù)據(jù)用于牟利將可能帶來法律分險(xiǎn)
- 網(wǎng)絡(luò)爬蟲可能具備突破簡單訪問控制的能力嘶是,獲得被保護(hù)資源而泄露個(gè)人隱私
網(wǎng)絡(luò)爬蟲的限制及規(guī)范
- 來源審查:在請(qǐng)求頭部中包含了用戶代理信息(代理人類需求發(fā)起請(qǐng)求的代理器),檢查HTTP協(xié)議頭的User-Agent域蛛碌,只響應(yīng)瀏覽器和友好爬蟲的訪問(技術(shù)限制)
- 協(xié)議公告:在網(wǎng)站根目錄下發(fā)布Robots協(xié)議聂喇,告知服務(wù)器上網(wǎng)站對(duì)應(yīng)被爬取的限制,要求爬蟲遵守(非技術(shù)強(qiáng)制但不遵守可能會(huì)有法律分險(xiǎn))
京東的Robots協(xié)議
當(dāng)你的爬蟲訪問頻次低數(shù)據(jù)量小類似人類訪問行為時(shí)可以不參考robots協(xié)議
當(dāng)你帶著友好爬蟲的心態(tài)遇到了來源審查時(shí)蔚携,我們可以手動(dòng)修改HTTP頭中的User-Agent域?yàn)镸ozilla/5.0(瀏覽器默認(rèn))
import requests
url = "https://www.amazon.cn/dp/B0895R6GDK"
kv = {"user-agent":"Mozilla/5.0"}
try:
r = requests.get(url,headers=kv)
r.raise_for_status()
r.encoding = r.apparent_encoding
print(r.text[:100])
except:
print("有問題")