1.1秘症、爬蟲分類
(1)通用爬蟲
通常是對(duì)搜索引擎的內(nèi)容,全部爬取下來爬范,速度較快
(2)聚焦爬蟲
聚焦爬蟲的工作流程較為復(fù)雜邦危,需要根據(jù)一定的網(wǎng)頁分析算法過濾與主題無關(guān)的鏈接洋侨,保留有用的鏈接并將其放入等待抓取的URL隊(duì)列。然后倦蚪,它將根據(jù)一定的搜索策略從隊(duì)列中選擇下一步要抓取的網(wǎng)頁URL希坚,并重復(fù)上述過程,直到達(dá)到系統(tǒng)的某一條件時(shí)停止
1.2 爬蟲的工作原理
Web網(wǎng)絡(luò)爬蟲系統(tǒng)的功能是下載網(wǎng)頁數(shù)據(jù)陵且,為搜索引擎系統(tǒng)提供數(shù)據(jù)來源裁僧。很多大型的網(wǎng)絡(luò)搜索引擎系統(tǒng)都被稱為基于 Web數(shù)據(jù)采集的搜索引擎系統(tǒng)个束,比如 Google、Baidu聊疲。由此可見Web 網(wǎng)絡(luò)爬蟲系統(tǒng)在搜索引擎中的重要性茬底。網(wǎng)頁中除了包含供用戶閱讀的文字信息外,還包含一些超鏈接信息获洲。Web網(wǎng)絡(luò)爬蟲系統(tǒng)正是通過網(wǎng)頁中的超連接信息不斷獲得網(wǎng)絡(luò)上的其它網(wǎng)頁阱表。正是因?yàn)檫@種采集過程像一個(gè)爬蟲或者蜘蛛在網(wǎng)絡(luò)上漫游,所以它才被稱為網(wǎng)絡(luò)爬蟲系統(tǒng)或者網(wǎng)絡(luò)蜘蛛系統(tǒng)贡珊,在英文中稱為Spider或者Crawler最爬。
1.3 網(wǎng)絡(luò)爬蟲基本流程
1、發(fā)起請(qǐng)求:通過HTTP庫(如urllib门岔、requests庫)向目標(biāo)網(wǎng)站發(fā)起請(qǐng)求爱致,即發(fā)送一個(gè)Request,請(qǐng)求可以包含額外的headers等信息寒随,等待服務(wù)器響應(yīng)糠悯。
2、獲取響應(yīng)內(nèi)容:如果服務(wù)器能正常響應(yīng)妻往,會(huì)得到一個(gè)Response互艾,Response的內(nèi)容便是所要獲取的頁面內(nèi)容,類型可能有HTML讯泣,Json字符串忘朝,二進(jìn)制數(shù)據(jù)(如圖片視頻)等類型。
3判帮、解析內(nèi)容:得到的內(nèi)容可能是HTML,可以用正則表達(dá)式溉箕、網(wǎng)頁解析庫(Beautifulsoup晦墙、Xpath等)進(jìn)行解析‰惹眩可能是Json晌畅,可以直接轉(zhuǎn)為Json對(duì)象解析,可能是二進(jìn)制數(shù)據(jù)寡痰,可以做保存或者進(jìn)一步的處理抗楔。
4、保存數(shù)據(jù):保存形式多樣拦坠,可以存為文本连躏,也可以保存至數(shù)據(jù)庫(MongoDB/Mysql/Redis等),或者保存特定格式的文件贞滨。
1.4 Request和Response
(1)Request:瀏覽器就發(fā)送消息給該網(wǎng)址所在的服務(wù)器入热,這個(gè)過程叫做HTTP Request。
Request詳解
請(qǐng)求方式:主要有GET、POST兩種類型勺良,另外還有HEAD绰播、PUT、DELETE尚困、OPTIONS等蠢箩。
GET請(qǐng)求和POST請(qǐng)求方式的區(qū)別:
GET 請(qǐng)求中的參數(shù)包含在URL 里面,數(shù)據(jù)可以在URL 中看到事甜,而POST 請(qǐng)求的URL 不會(huì)包
含這些數(shù)據(jù)谬泌,數(shù)據(jù)都是通過表單形式傳輸?shù)模瑫?huì)包含在請(qǐng)求體中讳侨。
GET 請(qǐng)求提交的數(shù)據(jù)最多只有1024 字節(jié)呵萨,而POST 方式?jīng)]有限制。
POST請(qǐng)求一般發(fā)送表單數(shù)據(jù)
請(qǐng)求URL:URL全稱統(tǒng)一資源定位符跨跨,如一個(gè)網(wǎng)頁文檔潮峦、一張圖片、一個(gè)視頻等都可以用URL唯一來確定勇婴。
請(qǐng)求頭:包含請(qǐng)求時(shí)的頭部信息忱嘹,如User-Agent、Host耕渴、Cookies等信息拘悦。
請(qǐng)求體:請(qǐng)求時(shí)額外攜帶的數(shù)據(jù)如表單提交時(shí)的表單數(shù)據(jù)。
(2)Response:服務(wù)器收到瀏覽器發(fā)送的消息后橱脸,能夠根據(jù)瀏覽器發(fā)送消息的內(nèi)容础米,做相應(yīng)處理,然后把消息回傳給瀏覽器添诉。這個(gè)過程叫做HTTP Response屁桑。瀏覽器收到服務(wù)器的Response信息后,會(huì)對(duì)信息進(jìn)行相應(yīng)處理栏赴,然后展示蘑斧。
Response詳解
響應(yīng)狀態(tài):有多種響應(yīng)狀態(tài),如200代表成功须眷、301跳轉(zhuǎn)竖瘾、404找不到頁面、502服務(wù)器錯(cuò)誤花颗。
響應(yīng)頭:如內(nèi)容類型捕传、內(nèi)容長(zhǎng)度、服務(wù)器信息扩劝、設(shè)置Cookie等等乐横。
響應(yīng)體:最主要的部分求橄,包含了請(qǐng)求資源的內(nèi)容,如網(wǎng)頁HTML葡公、圖片二進(jìn)制數(shù)據(jù)等罐农。
1.5 JavaScript渲染頁面
部分網(wǎng)站在使用urllib或requests抓取網(wǎng)頁時(shí),獲取的源代碼和瀏覽器中看到的不一致催什,源代碼中包含<script src=’xx.js’></script>涵亏,這就是采用了Ajax或者其他模塊化工具構(gòu)建的,整個(gè)網(wǎng)頁都是有JS渲染出來的蒲凶,瀏覽器就會(huì)去請(qǐng)求JS文件气筋。這時(shí)需要分析發(fā)送給后臺(tái)的Ajax接口,也可以使用Selenium旋圆、Splash這樣的庫來模擬JS渲染后的頁面宠默,從而獲取數(shù)據(jù)。后面會(huì)詳細(xì)說明灵巧,如何獲取JS搀矫、Ajax網(wǎng)頁的數(shù)據(jù)。
1.6 會(huì)話和Cookies
有些網(wǎng)站需要登錄之后才能抓取數(shù)據(jù)刻肄,如豆瓣這些網(wǎng)站瓤球。
這時(shí)兩個(gè)用于保持HTTP 連接狀態(tài)的技術(shù)就出現(xiàn)了,它們分別是會(huì)話和Cookies 敏弃。會(huì)話在服務(wù)端卦羡,
也就是網(wǎng)站的服務(wù)器,用來保存用戶的會(huì)話信息麦到; Cookies 在客戶端绿饵,也可以理解為瀏覽器端,有了Cookies 瓶颠,瀏覽器在下次訪問網(wǎng)頁時(shí)會(huì)自動(dòng)附帶上它發(fā)送給服務(wù)器蝴罪,服務(wù)器通過識(shí)別Cookjes 并鑒定出是哪個(gè)用戶,然后再判斷用戶是否是登錄狀態(tài)步清,然后返回對(duì)應(yīng)的響應(yīng)。
我們可以理解為Cookies 里面保存了登錄的憑證指黎,有了它港庄,只需要在下次請(qǐng)求攜帶Cookies 發(fā)送
請(qǐng)求而不必重新輸入用戶名梯浪、密碼等信息重新登錄了。
因此在爬蟲中谴轮,有時(shí)候處理需要登錄才能訪問的頁面時(shí),我們一般會(huì)直接將登錄成功后獲取的
Cookies 放在請(qǐng)求頭里面直接請(qǐng)求吹埠,而不必重新模擬登錄第步。
1.7 爬蟲代理
由于單個(gè)IP請(qǐng)求某個(gè)網(wǎng)站的訪問次數(shù)太多疮装,會(huì)出現(xiàn)403的錯(cuò)誤,這種情況稱為封IP粘都。這時(shí)需要用到代理IP廓推。
1.7.1 基本原理
代理實(shí)際上指的就是代理服務(wù)器,英文叫作proxy server 翩隧,它的功能是代理網(wǎng)絡(luò)用戶去取得網(wǎng)絡(luò)信
息樊展。形象地說,它是網(wǎng)絡(luò)信息的中轉(zhuǎn)站堆生。在我們正常請(qǐng)求一個(gè)網(wǎng)站時(shí)专缠, 是發(fā)送了請(qǐng)求給Web 服務(wù)器,Web 服務(wù)器把響應(yīng)傳回給我們淑仆。如果設(shè)置了代理服務(wù)器涝婉, 實(shí)際上就是在本機(jī)和服務(wù)器之間搭建了一個(gè)橋, 此時(shí)本機(jī)不是直接向Web 服務(wù)器發(fā)起請(qǐng)求蔗怠,而是向代理服務(wù)器發(fā)出請(qǐng)求墩弯,請(qǐng)求會(huì)發(fā)送給代理服務(wù)器,然后由代理服務(wù)器再發(fā)送給Web 服務(wù)器蟀淮,接著由代理服務(wù)器再把Web 服務(wù)器返回的響應(yīng)轉(zhuǎn)發(fā)給本機(jī)最住。這樣我們同樣可以正常訪問網(wǎng)頁,但這個(gè)過程中Web 服務(wù)器識(shí)別出的真實(shí)IP 就不再是我們本機(jī)的IP 了怠惶,就成功實(shí)現(xiàn)了IP 偽裝涨缚,這就是代理的基本原理。
1.7.2 常見代理設(shè)置
(1)使用網(wǎng)上免費(fèi)的代理:最好使用高匿代理策治,需要在使用前篩選下可用代理脓魏,也可以進(jìn)一步維護(hù)一個(gè)代理池。
(2)付費(fèi)代理服務(wù):通過代理商通惫,付費(fèi)使用