◇新疆交通職業(yè)技術(shù)學(xué)院 李文華
本文首先對Python與網(wǎng)絡(luò)爬蟲的概念進(jìn)行了簡要闡釋,并分析了基于Python的網(wǎng)絡(luò)爬蟲系統(tǒng)的基本原理;其后從關(guān)鍵設(shè)計原則與模塊結(jié)構(gòu)設(shè)計角度入手,提出了基于Python的網(wǎng)絡(luò)爬蟲系統(tǒng)的設(shè)計思路;最后對基于Python的網(wǎng)絡(luò)爬蟲系統(tǒng)的編程實(shí)現(xiàn)進(jìn)行了研究。
在“互聯(lián)網(wǎng)+”的新時代中,大數(shù)據(jù)技術(shù)、人工智能技術(shù)、應(yīng)用程序技術(shù)等現(xiàn)代科技與現(xiàn)代社會的融合關(guān)系日益緊密。在此背景下,Python逐漸從編程語言領(lǐng)域中脫穎而出,以其低成本、低難度、開放化、簡潔化等特點(diǎn)受到了人們的青睞與好評,并長期占據(jù)各大編程語言排行榜的領(lǐng)先地位。據(jù)此,我們有必要對基于Python的網(wǎng)絡(luò)爬蟲系統(tǒng)的設(shè)計與實(shí)現(xiàn)展開探究討論。
網(wǎng)絡(luò)爬蟲亦稱“網(wǎng)頁追逐者”或“網(wǎng)頁蜘蛛”,是一種基于預(yù)設(shè)規(guī)則進(jìn)行網(wǎng)絡(luò)信息自動抓取的程序工具。現(xiàn)階段,網(wǎng)絡(luò)爬蟲還可根據(jù)應(yīng)用功能的不同,分化為全網(wǎng)爬蟲、聚焦爬蟲、增量爬蟲、深層爬蟲等多個種類,并在搜索引擎搭建、網(wǎng)絡(luò)信息檢索、網(wǎng)絡(luò)數(shù)據(jù)分析等領(lǐng)域發(fā)揮著重要作用。從基本結(jié)構(gòu)來看,網(wǎng)絡(luò)爬蟲系統(tǒng)主要由頁面采集模塊、頁面解析模塊、連接處理模塊等部分組成,其應(yīng)用運(yùn)行的主要流程為:首先,對待爬取的目標(biāo)網(wǎng)站進(jìn)行確定,并從已給定的初始URL鏈接中提取出一個,對該鏈接上的信息內(nèi)容進(jìn)行分析采集,最終儲存到數(shù)據(jù)庫當(dāng)中。其后,將網(wǎng)站中未經(jīng)訪問的鏈接納入到待爬行列表當(dāng)中,按照特定順序逐個進(jìn)行鏈接頁面的提取、訪問、分析、采集、儲存。最后,在循環(huán)執(zhí)行爬行動作并達(dá)到程序預(yù)設(shè)的停止條件時,網(wǎng)絡(luò)爬蟲系統(tǒng)即可自動終止運(yùn)行[1]。
在此基礎(chǔ)上,網(wǎng)絡(luò)爬蟲系統(tǒng)還可根據(jù)URL鏈接爬行路線的不同,分為遞歸網(wǎng)絡(luò)爬蟲與非遞歸網(wǎng)絡(luò)爬蟲兩種。其中,前者為單一性的線程設(shè)計,即在同一動作周期中只能對一個鏈接進(jìn)行分析處理;后者則為多線程設(shè)計,即以URL隊(duì)列為運(yùn)行支持,按照“初始URL鏈接→等待隊(duì)列→運(yùn)行隊(duì)列→錯誤隊(duì)列/完成隊(duì)列→完成URL爬行”的流程執(zhí)行網(wǎng)絡(luò)爬行任務(wù)。在此過程中,若判定某URL鏈接在信息采集的過程中出現(xiàn)下載錯誤、爬行失敗的情況,將會將該URL鏈接加入到錯誤隊(duì)列中,該隊(duì)列的URL鏈接將不會參與后續(xù)系統(tǒng)循環(huán)。
Python是目前應(yīng)用最廣泛的計算機(jī)編程語言之一,其本身攜帶有requests、bs4、pyspider等多個基礎(chǔ)庫,可為網(wǎng)絡(luò)爬蟲系統(tǒng)的代碼編寫與結(jié)構(gòu)搭建提供優(yōu)質(zhì)環(huán)境條件。因此,以Python為基礎(chǔ)進(jìn)行網(wǎng)絡(luò)爬蟲系統(tǒng)的設(shè)計與實(shí)現(xiàn),具有良好的可行性與適應(yīng)性。
為了實(shí)現(xiàn)Python編程語言下網(wǎng)絡(luò)爬蟲系統(tǒng)的順利產(chǎn)出,并確保網(wǎng)絡(luò)爬蟲系統(tǒng)在實(shí)際投用中的高效可靠、合法合規(guī),相關(guān)人員在設(shè)計實(shí)踐中應(yīng)遵循以下幾點(diǎn)關(guān)鍵設(shè)計原則。
第一,可行性原則。眾所周知,互聯(lián)網(wǎng)中的數(shù)據(jù)信息具有海量化特點(diǎn),若采取全網(wǎng)爬蟲的系統(tǒng)設(shè)計方式,將會形成大量不必要的時間浪費(fèi)與成本損耗。所以,相關(guān)人員在正式開展設(shè)計實(shí)踐之前,必須要明確網(wǎng)絡(luò)爬蟲系統(tǒng)的應(yīng)用目標(biāo)與爬行對象,以此實(shí)現(xiàn)網(wǎng)絡(luò)爬蟲系統(tǒng)爬取信息主題、爬行動作范圍的精準(zhǔn)確定,保證網(wǎng)絡(luò)爬蟲系統(tǒng)在設(shè)計完成后具有高度的應(yīng)用可行性。同時,還需做好URL鏈接過濾機(jī)制、評價標(biāo)準(zhǔn)的合理設(shè)置,以進(jìn)一步確保網(wǎng)絡(luò)爬蟲系統(tǒng)設(shè)計與實(shí)現(xiàn)的“有的放矢”。
第二,避險性原則。在目前,為了保護(hù)網(wǎng)頁信息,很多網(wǎng)站會設(shè)計出一定的“反爬取”機(jī)制,進(jìn)而導(dǎo)致網(wǎng)絡(luò)爬蟲系統(tǒng)在運(yùn)行過程中出現(xiàn)異常,不僅難以達(dá)到預(yù)期的網(wǎng)絡(luò)信息采集效果,還會對爬蟲系統(tǒng)本身的爬取有效性產(chǎn)生影響。例如,一些網(wǎng)頁會依托動態(tài)技術(shù)構(gòu)建出“爬蟲陷阱”。當(dāng)網(wǎng)絡(luò)爬蟲系統(tǒng)在此類網(wǎng)絡(luò)中執(zhí)行信息爬取任務(wù)時,該URL鏈接的地址日歷會發(fā)生頻繁更改,進(jìn)而導(dǎo)致網(wǎng)絡(luò)爬蟲系統(tǒng)循環(huán)往復(fù)地登入同一個地址,陷入到重復(fù)抓取、無法跳出的境地當(dāng)中。在基于Python的網(wǎng)絡(luò)爬蟲系統(tǒng)設(shè)計當(dāng)中,為了防止此類情況出現(xiàn),相關(guān)人員務(wù)必要貫徹落實(shí)避險性原則,對反爬取的陷阱風(fēng)險進(jìn)行提前感知、預(yù)先防范。例如,可設(shè)置出網(wǎng)絡(luò)爬蟲系統(tǒng)對同一網(wǎng)站的最大抓取次數(shù),當(dāng)網(wǎng)絡(luò)爬蟲系統(tǒng)在單一網(wǎng)頁中重復(fù)抓取信息的次數(shù)超過預(yù)設(shè)限值,該任務(wù)就會主動結(jié)束,從而使網(wǎng)絡(luò)爬蟲系統(tǒng)及時跳出陷阱網(wǎng)頁,轉(zhuǎn)而進(jìn)行URL隊(duì)列中其他鏈接的信息爬取[2]。
第三,合理性原則。在網(wǎng)絡(luò)爬蟲系統(tǒng)的應(yīng)用實(shí)踐中,會涉及到一種名為“robots”的安全協(xié)議,其對爬取行為具有約束性作用。當(dāng)網(wǎng)絡(luò)爬蟲系統(tǒng)作用于某一網(wǎng)站時,會首先訪問該網(wǎng)站的robots.txt文本,以得知該網(wǎng)站中不被允許搜索采集的具體內(nèi)容,或網(wǎng)絡(luò)爬蟲系統(tǒng)被賦予的有限權(quán)限。然后,網(wǎng)絡(luò)爬蟲系統(tǒng)便可依據(jù)協(xié)議內(nèi)容,實(shí)施有選擇、有約束的信息爬取行為。同理,若網(wǎng)絡(luò)爬蟲系統(tǒng)在爬取某網(wǎng)站時,并未檢測到robots.txt文本存在,也就意味著該網(wǎng)站的所有信息均處于無協(xié)議保護(hù)的狀態(tài),網(wǎng)絡(luò)爬蟲系統(tǒng)可進(jìn)行自由無拘的采集活動。基于此,由于robots在本質(zhì)上是網(wǎng)站與網(wǎng)絡(luò)爬蟲系統(tǒng)之間的一種通俗協(xié)議,而非強(qiáng)制性的規(guī)定。所以,相關(guān)設(shè)計人員應(yīng)將robots.txt文本的檢測與約束機(jī)制納入到設(shè)計過程中,以保證網(wǎng)絡(luò)爬蟲系統(tǒng)投用運(yùn)行的合理性與禮貌性。
在實(shí)踐中,相關(guān)人員可以如圖1的網(wǎng)絡(luò)信息爬取流程為基礎(chǔ),進(jìn)行網(wǎng)絡(luò)爬蟲系統(tǒng)總體結(jié)構(gòu)的設(shè)計。具體來講,應(yīng)包含系統(tǒng)調(diào)度、URL鏈接管理、網(wǎng)頁下載、網(wǎng)頁解析、數(shù)據(jù)儲存、robots管理、線程管理以及風(fēng)險處理八個功能部分。
第一,系統(tǒng)調(diào)度模塊為網(wǎng)絡(luò)爬蟲系統(tǒng)的“頭腦”,主要負(fù)責(zé)其他功能模塊的調(diào)度控制與指令管理。在系統(tǒng)運(yùn)行的過程當(dāng)中,系統(tǒng)調(diào)度模塊應(yīng)與其他模塊持續(xù)建立反饋連接,當(dāng)某一模塊的動作結(jié)束后,系統(tǒng)調(diào)度模塊可同步向下一環(huán)節(jié)模塊發(fā)出驅(qū)動指令,以推動網(wǎng)絡(luò)信息爬取流程的進(jìn)展,直至滿足預(yù)設(shè)程序的全部條件,即爬取任務(wù)完全結(jié)束。
第二,URL鏈接管理模塊主要作用于網(wǎng)絡(luò)爬蟲系統(tǒng)涉及到的所有URL鏈接,如待爬取URL鏈接、已爬取URL鏈接、新URL鏈接對象等。
第三,網(wǎng)頁下載模塊為網(wǎng)絡(luò)爬蟲系統(tǒng)獲取網(wǎng)頁信息的工具,當(dāng)網(wǎng)絡(luò)爬蟲系統(tǒng)進(jìn)入到URL鏈接的網(wǎng)頁界面后,網(wǎng)頁下載模塊會自動啟動下載功能,對HTML、XML、JSON等多種數(shù)據(jù)文件進(jìn)行下載爬取。
第四,網(wǎng)頁解析模塊位于網(wǎng)頁下載模塊后端,當(dāng)網(wǎng)絡(luò)爬蟲系統(tǒng)獲取到網(wǎng)頁中的海量數(shù)據(jù)信息后,網(wǎng)頁解析模塊可對數(shù)據(jù)信息進(jìn)行去噪處理,從而實(shí)現(xiàn)冗余性文件的有效剔除,僅保留用戶所需的相關(guān)數(shù)據(jù)。
第五,數(shù)據(jù)存儲模塊主要作為計算機(jī)存儲空間與網(wǎng)絡(luò)爬蟲系統(tǒng)的連接紐帶。當(dāng)目標(biāo)信息采集、處理完成后,數(shù)據(jù)存儲模塊即可對數(shù)據(jù)信息的類型進(jìn)行判斷。若數(shù)據(jù)具備結(jié)構(gòu)化特點(diǎn),則將其導(dǎo)入到數(shù)據(jù)庫當(dāng)中;若數(shù)據(jù)為非結(jié)構(gòu)化,則將其直接導(dǎo)入計算機(jī)的本地硬盤。在此基礎(chǔ)上,再輔以簡潔合理的索引機(jī)制,即可滿足已爬取信息的檢索利用需求。
第六,robots管理模塊主要用于檢測、下載與更新目標(biāo)網(wǎng)站的robots.txt文本文件,并對robots文本中的允許訪問目錄或限制訪問目錄進(jìn)行感知。當(dāng)系統(tǒng)調(diào)度模塊獲得robots管理模塊的信息反饋后,即可按照相應(yīng)權(quán)限進(jìn)行爬取指令的下達(dá),以保證網(wǎng)絡(luò)爬蟲系統(tǒng)的運(yùn)行邊界持續(xù)處在網(wǎng)站允許范圍內(nèi),從而將網(wǎng)絡(luò)爬蟲系統(tǒng)的信息爬取行為維持在較高的合理性與禮貌性水平當(dāng)中。
第七,線程管理模塊主要用于多線程的網(wǎng)絡(luò)爬蟲系統(tǒng),相關(guān)人員在設(shè)計時,應(yīng)保證系統(tǒng)線程具備良好的靈活性,即用戶可根據(jù)具體的URL鏈接數(shù)量進(jìn)行線程數(shù)調(diào)整,以確保網(wǎng)絡(luò)爬蟲系統(tǒng)運(yùn)行資源的有效分配,達(dá)成較高網(wǎng)絡(luò)爬蟲系統(tǒng)的網(wǎng)絡(luò)信息爬取效率。
第八,風(fēng)險處理模塊主要是為了應(yīng)對各類反爬取機(jī)制而形成的。在基于Python的網(wǎng)絡(luò)爬蟲系統(tǒng)設(shè)計中,相關(guān)人員應(yīng)制定出多種風(fēng)險處理方案,如爬蟲陷阱循環(huán)訪問風(fēng)險的有效規(guī)避、同一URL鏈接下網(wǎng)站內(nèi)容的變更適應(yīng)等,并落實(shí)到Python語言的代碼編程當(dāng)中。

圖1 網(wǎng)絡(luò)爬蟲系統(tǒng)的基本流程
在運(yùn)行流程、模塊結(jié)構(gòu)設(shè)計完成后,相關(guān)人員即可依托Python開發(fā)平臺,進(jìn)行網(wǎng)絡(luò)爬蟲系統(tǒng)的開發(fā)實(shí)現(xiàn)。具體來講,各類模塊的實(shí)現(xiàn)策略如下所示。
第一,系統(tǒng)調(diào)度模塊的實(shí)現(xiàn)。在Python開發(fā)環(huán)境中建立初始模塊“__main__”,并在該模塊中建立Spidermain類。然后,按照圖1的系統(tǒng)運(yùn)行流程,開放信息爬區(qū)目標(biāo)選定、系統(tǒng)參數(shù)設(shè)置、robots.txt導(dǎo)入、URL鏈接提取、robots.txt目錄檢查、頁面信息下載、頁面信息解析、爬取信息儲存等環(huán)節(jié)模塊的調(diào)度權(quán)限。最后,對各項(xiàng)模塊參數(shù)進(jìn)行初始化,即可正式啟動網(wǎng)絡(luò)爬蟲系統(tǒng)。
第二,URL鏈接管理模塊的實(shí)現(xiàn)。以Python開發(fā)平臺的set去重功能為基礎(chǔ),創(chuàng)建出“已爬取”與“待爬取”兩個URL隊(duì)列。然后,使用set的pop算法,對待爬取隊(duì)列中的URL隊(duì)列進(jìn)行隨機(jī)選取,以此作為網(wǎng)絡(luò)爬蟲系統(tǒng)下一環(huán)節(jié)的信息爬取目標(biāo)[3]。
第三,網(wǎng)頁下載模塊的實(shí)現(xiàn)。依托request基礎(chǔ)庫的urlopen工具,對目標(biāo)網(wǎng)頁中的數(shù)據(jù)信息進(jìn)行下載獲取。在此基礎(chǔ)上,可進(jìn)一步設(shè)置headers代碼,從而在實(shí)現(xiàn)網(wǎng)頁下載功能的同時,將網(wǎng)絡(luò)爬蟲系統(tǒng)的行為偽裝為瀏覽器訪問,以進(jìn)一步提高信息獲取的成功幾率。
第四,網(wǎng)頁解析模塊的實(shí)現(xiàn)。在Python平臺中,網(wǎng)頁解析模塊可依托Beautiful Soup基礎(chǔ)庫以及l(fā)xml?解析器進(jìn)行搭建實(shí)現(xiàn)。其程序代碼包括“soup=BeautifulSoup(data,“l(fā)xml”)”、“urls=soup.find_all('a',href=re.compile(pattern[,flag])”等。
第五,數(shù)據(jù)存儲模塊的實(shí)現(xiàn)。數(shù)據(jù)存儲模塊在網(wǎng)絡(luò)爬蟲系統(tǒng)與MySQL數(shù)據(jù)庫之間建立連接,實(shí)現(xiàn)爬取信息向pymysql模塊的導(dǎo)入。其程序代碼包括“sql=“insert into `table(`datal`,`data2`,`data3`)values(%s,%s,%s)”、“connnection.cmmit()”等。
第六,其他功能模塊的實(shí)現(xiàn)。線程管理、風(fēng)險處理等其他模塊可依托Python平臺的threading、urllib.error等基礎(chǔ)庫實(shí)現(xiàn)。
總而言之,在利用Python編程語言及開發(fā)平臺進(jìn)行網(wǎng)絡(luò)爬蟲系統(tǒng)的設(shè)計與實(shí)現(xiàn)時,相關(guān)人員需要充分考慮到網(wǎng)絡(luò)爬蟲系統(tǒng)復(fù)雜多樣的功能需求,以及其在應(yīng)用過程中可能遇到的陷阱風(fēng)險、robots協(xié)議等問題,繼而設(shè)計出功能完善的模塊結(jié)構(gòu)方案與系統(tǒng)運(yùn)行流程,并付諸于編程實(shí)踐當(dāng)中,以確保網(wǎng)絡(luò)爬蟲系統(tǒng)可行性、避險性、合理性等原則的充分體現(xiàn)。