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