王碧瑤
摘要:專用型的網(wǎng)絡(luò)爬蟲能夠得到想要的返回結(jié)果,本文就以拉勾網(wǎng)作為例子,對(duì)基于Python的網(wǎng)絡(luò)爬蟲技術(shù)進(jìn)行研究和分析。
關(guān)鍵詞:Python;網(wǎng)絡(luò)爬蟲技術(shù);搜索引擎
中圖分類號(hào):TP393 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1007-9416(2017)05-0076-01
1 爬蟲系統(tǒng)需求的分析和設(shè)計(jì)
利用模塊化的設(shè)計(jì)來(lái)對(duì)網(wǎng)絡(luò)爬蟲系統(tǒng)進(jìn)行開(kāi)發(fā),一個(gè)通用的爬蟲架構(gòu)需要有爬蟲調(diào)度端,URL管理器,網(wǎng)頁(yè)下載器,網(wǎng)頁(yè)解析器這4個(gè)模塊。爬蟲調(diào)度端去啟動(dòng)、停止或者監(jiān)視爬蟲運(yùn)行情況,URL管理器去對(duì)將要爬取的URL和已經(jīng)爬取過(guò)的URL進(jìn)行管理,網(wǎng)頁(yè)下載器將URL管理器指定的URL網(wǎng)頁(yè)下載下來(lái)存儲(chǔ)為字符串,字符串傳送給網(wǎng)頁(yè)解析器進(jìn)行解析,并將其中未被抓取過(guò)的URL送入U(xiǎn)RL管理器中。
公司名、地址以及薪水等都需要被抓取然后保存到文件中。拉勾網(wǎng)加載職位信息采用異步加載方式,所以對(duì)一系列網(wǎng)絡(luò)請(qǐng)求分析之后,發(fā)現(xiàn)是positionAjax.json請(qǐng)求去響應(yīng)職位信息,網(wǎng)頁(yè)存儲(chǔ)職位信息采用的是json格式,并且json的層級(jí)結(jié)構(gòu)為content-positionResult-result,所以采用json格式讀取這種層級(jí)結(jié)構(gòu)下的數(shù)據(jù)。其次就是分頁(yè)的設(shè)計(jì),在json格式content-positionResult-totalCount下存儲(chǔ)著該種搜索下職位信息的總個(gè)數(shù),發(fā)現(xiàn)每頁(yè)的職位個(gè)數(shù)為15,只要totalCount/15就可以得出爬取的頁(yè)數(shù)。
2 基于Python的網(wǎng)絡(luò)爬蟲技術(shù)的實(shí)現(xiàn)
下面就利用拉勾網(wǎng)來(lái)進(jìn)行基于Python的網(wǎng)絡(luò)爬蟲的實(shí)現(xiàn)。爬蟲首先要獲取的是所有待抓取的鏈接地址,再就是對(duì)鏈接地址中的職位信息進(jìn)行有效解析,隨后保存在文件當(dāng)中。
2.1 抓取與解析的實(shí)現(xiàn)
首先確定URL為'https://www.lagou.com/jobs/positionAjax.json',瀏覽器提交的FormData有三個(gè)參數(shù)first、pn、kd,后兩個(gè)分別代表當(dāng)前頁(yè)數(shù)和搜索的關(guān)鍵詞,頁(yè)數(shù)每次增加1,并需要模仿瀏覽器發(fā)送post請(qǐng)求,并將headers進(jìn)行偽裝,如下所示:
headers={'User-Agent':'Mozilla/5.0(Windows;U;Windows NT 6.0) Gecko/20070309 Firefox/2.0.0.3'}
得到頁(yè)面信息之后再對(duì)我們想要的信息進(jìn)行抓取,對(duì)于這次要爬取的信息,json是非常適合的方法,僅列出薪水部分實(shí)現(xiàn)如下:
for posi in self.json['content']['positionResult']['result']
i['positionSalary']=position['salary']
2.2 爬蟲的抓取策略概述
策略一是深度的優(yōu)先遍歷策略,起始的URL會(huì)被網(wǎng)絡(luò)爬蟲最先開(kāi)始,隨后對(duì)每個(gè)URL進(jìn)行追蹤直到處理結(jié)束該處的URL,隨后就轉(zhuǎn)向下一處的URL繼續(xù)追蹤;策略二是反向的鏈接數(shù),其是其他的URL指向一個(gè)網(wǎng)頁(yè)的數(shù)量并以此對(duì)網(wǎng)頁(yè)重要程度進(jìn)行評(píng)價(jià),優(yōu)點(diǎn)是能夠根據(jù)重要性的網(wǎng)頁(yè)進(jìn)行優(yōu)先爬??;策略三就是寬度優(yōu)點(diǎn)的遍歷策略,將新下載網(wǎng)頁(yè)包含的鏈接直接追加到待抓取URL隊(duì)列末尾;策略四是最佳的優(yōu)先搜索策略,通過(guò)分析目標(biāo)網(wǎng)頁(yè)主體和目前的URL的關(guān)聯(lián)性,并對(duì)評(píng)價(jià)好的URL進(jìn)行擇優(yōu)抓??;總而言之,采取不同爬取策略是殊途同歸的,達(dá)到重要網(wǎng)頁(yè)的優(yōu)先爬取。
2.3 反爬蟲的策略采取概述
如果認(rèn)為單線程爬蟲設(shè)計(jì)方法速度較慢,不會(huì)發(fā)生被封的情況,其實(shí)是不對(duì)的,必須利用其他有效策略來(lái)操作才行,下面簡(jiǎn)要分析相關(guān)的策略。
策略一是禁止cookies,若有些網(wǎng)站發(fā)現(xiàn)某個(gè)訪問(wèn)頻繁發(fā)生,可能會(huì)將其視作爬蟲,并且通過(guò)cookies去識(shí)別訪問(wèn)者的身份而拒絕該用戶的訪問(wèn),所以在scrapy爬蟲框架中設(shè)置COOKIES_ENABLES= FALSE即可禁止網(wǎng)站訪問(wèn)cookie,對(duì)于通過(guò)cookie識(shí)別來(lái)禁止爬取數(shù)據(jù)的網(wǎng)站非常的有效。策略二,HTTP協(xié)議中的一個(gè)字段是User agent,偽裝其在瀏覽器是個(gè)很好的策略。策略三,可以對(duì)訪問(wèn)頻率進(jìn)行降低,讓對(duì)方無(wú)法從訪問(wèn)量中看得出來(lái)。有眾多的辦法去實(shí)現(xiàn):對(duì)每個(gè)頁(yè)面間歇抓取、每天抓取的頁(yè)面數(shù)量進(jìn)行限制等,其實(shí)scrapy爬蟲框架中,就可以設(shè)置下載等待時(shí)間download_delay來(lái)減少被禁止爬取的風(fēng)險(xiǎn)。
3 結(jié)語(yǔ)
網(wǎng)頁(yè)的內(nèi)容以及網(wǎng)站的信息可以利用Python自帶的框架進(jìn)行獲得,然后利用正則的表達(dá)式等對(duì)需要的信息進(jìn)行提取以及分析?;ヂ?lián)網(wǎng)站點(diǎn)無(wú)數(shù),其開(kāi)發(fā)過(guò)程遵循的原則、代碼的風(fēng)格也不一樣,所以處理不同風(fēng)格的代碼確實(shí)存在不小的挑戰(zhàn)。
參考文獻(xiàn)
[1]錢程,陽(yáng)小蘭,朱福喜.基于Python的網(wǎng)絡(luò)爬蟲技術(shù)[J].黑龍江科技信息,2016,36:273.
[2]姜杉彪,黃凱林,盧昱江,張俊杰,曾志高,劉強(qiáng).基于Python的專業(yè)網(wǎng)絡(luò)爬蟲的設(shè)計(jì)與實(shí)現(xiàn)[J].企業(yè)科技與發(fā)展,2016,08:17-19.endprint
數(shù)字技術(shù)與應(yīng)用2017年5期