淺談網(wǎng)絡(luò)爬蟲(chóng)技術(shù)
一、網(wǎng)絡(luò)爬蟲(chóng)技術(shù)概述
網(wǎng)絡(luò)爬蟲(chóng)又叫網(wǎng)絡(luò)蜘蛛、網(wǎng)絡(luò)機(jī)器人等,可以將其理解為一個(gè)在互聯(lián)網(wǎng)上自動(dòng)提取網(wǎng)頁(yè)信息并進(jìn)行解析抓取的程序。網(wǎng)絡(luò)爬蟲(chóng)不僅能夠復(fù)制網(wǎng)頁(yè)信息和下載音視頻,還可以做到行為鏈執(zhí)行與網(wǎng)站的模擬登錄。身處大數(shù)據(jù)時(shí)代,不論是人工智能還是數(shù)據(jù)分析,都需要有海量的數(shù)據(jù)在背后做支撐,如果單單是依靠人力去手工采集,不僅成本高昂而且效率低下,在這一需求下,自動(dòng)化且高效可并發(fā)執(zhí)行的網(wǎng)絡(luò)爬蟲(chóng)便擔(dān)起了獲取數(shù)據(jù)的重任。
二、網(wǎng)絡(luò)爬蟲(chóng)基本原理
理論上來(lái)說(shuō),任何編程語(yǔ)言都可以用來(lái)編寫(xiě)網(wǎng)絡(luò)爬蟲(chóng),只有難易之分。因?yàn)榫W(wǎng)絡(luò)爬蟲(chóng)本質(zhì)上只是對(duì)目標(biāo)服務(wù)器發(fā)起HTTP請(qǐng)求,并對(duì)HTTP響應(yīng)做出處理,提取關(guān)鍵信息進(jìn)行清洗入庫(kù)。這里的服務(wù)器可以理解為要爬取的網(wǎng)站站點(diǎn),爬蟲(chóng)程序發(fā)起一次HTTP請(qǐng)求,網(wǎng)站服務(wù)器對(duì)請(qǐng)求做出一次響應(yīng),就構(gòu)成了一次網(wǎng)絡(luò)爬蟲(chóng)行為,但是僅僅發(fā)起請(qǐng)求是不完整的,還需要將網(wǎng)站返回回來(lái)的信息進(jìn)行數(shù)據(jù)解析和數(shù)據(jù)清洗,將最終需要的數(shù)據(jù)存儲(chǔ)到數(shù)據(jù)庫(kù)或是本地文件里才算是完成了一整套的爬蟲(chóng)流程。
如圖1所示,完整的爬蟲(chóng)流程應(yīng)當(dāng)是編寫(xiě)的網(wǎng)絡(luò)爬蟲(chóng)在發(fā)起請(qǐng)求之后,目標(biāo)服務(wù)器返回指定的請(qǐng)求響應(yīng),通過(guò)對(duì)請(qǐng)求響應(yīng)返回的響應(yīng)體進(jìn)行解析,找到需要的信息進(jìn)行數(shù)據(jù)存儲(chǔ)。如果需要翻頁(yè)或者進(jìn)行跳轉(zhuǎn),則從當(dāng)前頁(yè)面或者響應(yīng)體中提取出鏈接再次發(fā)起請(qǐng)求。
圖 1 網(wǎng)絡(luò)爬蟲(chóng)流程
通常來(lái)說(shuō),開(kāi)發(fā)一個(gè)網(wǎng)絡(luò)爬蟲(chóng)主要有兩個(gè)途徑,一個(gè)是根據(jù)請(qǐng)求包和解析包從頭開(kāi)始爬蟲(chóng)編寫(xiě),另一個(gè)是基于現(xiàn)行的爬蟲(chóng)框架,進(jìn)行框架化開(kāi)發(fā)。
1.腳本編寫(xiě)爬蟲(chóng)
Python實(shí)現(xiàn)了許多第三方庫(kù)來(lái)幫開(kāi)發(fā)者完成這個(gè)操作,比如github上開(kāi)源的requests庫(kù)便是發(fā)起HTTP請(qǐng)求的利器,這就省去了實(shí)現(xiàn)請(qǐng)求程序的時(shí)間,bs4解析庫(kù)更是讓開(kāi)發(fā)者只需要專(zhuān)注于網(wǎng)頁(yè)信息的定位,操作網(wǎng)站返回的主體信息就可以了。開(kāi)發(fā)重心也就從協(xié)議處理轉(zhuǎn)化到了具體網(wǎng)頁(yè)的數(shù)據(jù)提取。不過(guò)如果爬蟲(chóng)編寫(xiě)者是要對(duì)有著反爬蟲(chóng)措施的網(wǎng)站進(jìn)行數(shù)據(jù)采集,則需要花費(fèi)精力去應(yīng)對(duì)反爬蟲(chóng)手段,諸如JavaScript逆向、代碼混淆或者指紋風(fēng)控之類(lèi)的手段。
2.基于框架開(kāi)發(fā)爬蟲(chóng)
如今流行的網(wǎng)絡(luò)爬蟲(chóng)框架Scrapy,其基于異步Twisted引擎,將爬蟲(chóng)請(qǐng)求的每個(gè)階段都進(jìn)行了拆分,并建立了鉤子能夠讓開(kāi)發(fā)者在每一階段進(jìn)行定制化開(kāi)發(fā),可以大大加快網(wǎng)絡(luò)爬蟲(chóng)的開(kāi)發(fā)速度,并且其異步特性可以很好地實(shí)現(xiàn)并發(fā)爬取。
Scrapy框架模塊化和程序化的編寫(xiě)方式,符合團(tuán)隊(duì)合作的風(fēng)格,相較于腳本編寫(xiě)爬蟲(chóng),更易于集體開(kāi)發(fā)和維護(hù)。但缺點(diǎn)是需要進(jìn)行第三方的拓展時(shí)不如直接進(jìn)行腳本編寫(xiě)方便,如今的爬蟲(chóng)大多需要進(jìn)行JS逆向、驗(yàn)證碼識(shí)別之類(lèi)的操作,外接其他編程語(yǔ)言進(jìn)行開(kāi)發(fā),這需要對(duì)Scrapy有著深入了解才能做到程序穩(wěn)定運(yùn)行。
三、網(wǎng)絡(luò)爬蟲(chóng)分類(lèi)
實(shí)際開(kāi)發(fā)中根據(jù)具體的代碼實(shí)現(xiàn)與爬蟲(chóng)架構(gòu),網(wǎng)絡(luò)爬蟲(chóng)可以被分為通用網(wǎng)絡(luò)爬蟲(chóng)、聚焦網(wǎng)絡(luò)爬蟲(chóng)、增量式網(wǎng)絡(luò)爬蟲(chóng)與深層網(wǎng)絡(luò)爬蟲(chóng)。
1.通用網(wǎng)絡(luò)爬蟲(chóng)(General Purpose Web Crawler)
通用網(wǎng)絡(luò)爬蟲(chóng)又叫全網(wǎng)爬蟲(chóng),顧名思義,它的目標(biāo)數(shù)據(jù)是整個(gè)互聯(lián)網(wǎng),爬取的數(shù)據(jù)極為豐富,因此常用于搜索引擎當(dāng)中。它們往往從一些種子URL出發(fā),輾轉(zhuǎn)爬取最終拓展到整個(gè)網(wǎng)絡(luò)。在爬蟲(chóng)流程里講過(guò),一個(gè)爬蟲(chóng)程序的設(shè)計(jì)離不開(kāi)發(fā)起請(qǐng)求,解析頁(yè)面和內(nèi)容存儲(chǔ)三個(gè)方面。既然要存儲(chǔ)海量的互聯(lián)網(wǎng)數(shù)據(jù),那這類(lèi)爬蟲(chóng)對(duì)于爬蟲(chóng)的性能和數(shù)據(jù)的存儲(chǔ)空間就會(huì)具有高要求,而且因?yàn)閁RL數(shù)量過(guò)多,通用網(wǎng)絡(luò)爬蟲(chóng)常常會(huì)忽略爬行頁(yè)面的順序,并且采取并發(fā)的模式來(lái)提高爬取速度。
正是因?yàn)樗廊『A康臄?shù)據(jù),所以此類(lèi)爬蟲(chóng)的爬取策略常常需要進(jìn)行嚴(yán)格的設(shè)計(jì)與實(shí)踐。就目前而言,深度優(yōu)先爬取策略和廣度優(yōu)先爬取策略是較為常見(jiàn)的。不過(guò)真正應(yīng)用于實(shí)踐當(dāng)中的通用網(wǎng)絡(luò)爬蟲(chóng)策略往往會(huì)非常復(fù)雜,并且穿插各類(lèi)算法在其中。
(1) 深度優(yōu)先:按照頁(yè)面深度進(jìn)行排序,一次訪(fǎng)問(wèn)下一級(jí)URL,直到觸底無(wú)法深入。
(2) 廣度優(yōu)先:按照頁(yè)面內(nèi)容目錄層次進(jìn)行劃分,爬取完同一層次的URL才會(huì)繼續(xù)進(jìn)入下一層進(jìn)行爬取。
2.聚焦網(wǎng)絡(luò)爬蟲(chóng)(Focused Crawler)
聚焦網(wǎng)絡(luò)爬蟲(chóng)更加適用于日常的爬蟲(chóng)需求,并不需要爬蟲(chóng)程序去獲取整個(gè)互聯(lián)網(wǎng)的資源,那是搜索引擎該做的事。它專(zhuān)注于某一主題,選擇性爬取網(wǎng)頁(yè)上與開(kāi)發(fā)者已經(jīng)定義的規(guī)則相匹配的數(shù)據(jù)資源,能夠滿(mǎn)足對(duì)于特定網(wǎng)站或者領(lǐng)域的信息爬取工作。
聚焦網(wǎng)絡(luò)爬蟲(chóng)的爬取策略有4種:
(1) 基于內(nèi)容評(píng)價(jià):將用戶(hù)輸入的信息作為主題進(jìn)行爬取,頁(yè)面包含用戶(hù)輸入信息則認(rèn)為主題相關(guān)。
(2) 基于鏈接評(píng)價(jià):根據(jù)頁(yè)面結(jié)構(gòu)信息分析爬取的URL重要性,根據(jù)重要程度進(jìn)行爬取優(yōu)先級(jí)的排序。
(3) 基于增強(qiáng)學(xué)習(xí):利用概率統(tǒng)計(jì)中的貝葉斯分類(lèi)器,根據(jù)網(wǎng)頁(yè)內(nèi)容和鏈接文本對(duì)URL進(jìn)行分類(lèi),計(jì)算出URL的權(quán)重,以決定爬取順序。
(4) 基于語(yǔ)境圖:結(jié)合機(jī)器學(xué)習(xí)系統(tǒng),計(jì)算當(dāng)前頁(yè)面到相關(guān)的網(wǎng)頁(yè)的距離,距離越近的頁(yè)面的URL訪(fǎng)問(wèn)越優(yōu)先。
3.增量式網(wǎng)絡(luò)爬蟲(chóng)(Incremental Web Crawler)
增量式網(wǎng)絡(luò)爬蟲(chóng)主要目的是長(zhǎng)久地維持一個(gè)數(shù)據(jù)庫(kù),對(duì)于其中數(shù)據(jù)的穩(wěn)健性和實(shí)時(shí)性具有高要求。簡(jiǎn)單來(lái)說(shuō),它對(duì)已經(jīng)爬取過(guò)的網(wǎng)頁(yè)頁(yè)面采取增量式更新,再次爬取的時(shí)候就會(huì)僅僅爬取新出現(xiàn)的或者發(fā)生改變的數(shù)據(jù),對(duì)于沒(méi)有發(fā)生變化的頁(yè)面或數(shù)據(jù)則不會(huì)爬取。
此類(lèi)爬蟲(chóng)常用的策略有三:
(1) 統(tǒng)一更新:每隔一段時(shí)間將所有的頁(yè)面再次訪(fǎng)問(wèn)一遍,以達(dá)到更新數(shù)據(jù)的目的。
(2) 個(gè)體更新:根據(jù)個(gè)體網(wǎng)站的數(shù)據(jù)變化頻率來(lái)指定重新訪(fǎng)問(wèn)的時(shí)間。
(3) 分類(lèi)更新:將網(wǎng)頁(yè)區(qū)分為數(shù)據(jù)變化迅速的和數(shù)據(jù)變化緩慢的,以不同頻率訪(fǎng)問(wèn)這兩類(lèi)網(wǎng)頁(yè)。
4.深層網(wǎng)絡(luò)爬蟲(chóng)(Deep Web Crawler)
深層網(wǎng)絡(luò)主要指的是沒(méi)辦法直接訪(fǎng)問(wèn)到的頁(yè)面,這類(lèi)網(wǎng)頁(yè)信息通常需要滿(mǎn)足一定的要求才可以瀏覽,隱藏在一些表單之后,不能通過(guò)靜態(tài)鏈接直接獲取。例如日常生活中遇到的一些必須登錄注冊(cè)后才可以訪(fǎng)問(wèn)的網(wǎng)站便屬于深層網(wǎng)絡(luò)的范疇。這類(lèi)爬蟲(chóng)的需求也極其旺盛,不過(guò)只需要搭配GET和POST請(qǐng)求便可以訪(fǎng)問(wèn),主要難點(diǎn)在于破解POST提交信息時(shí)候的網(wǎng)頁(yè)數(shù)據(jù)加密,即JavaScript加密參數(shù)。
四、網(wǎng)絡(luò)爬蟲(chóng)與搜索引擎
首先,搜索引擎的制作離不開(kāi)網(wǎng)絡(luò)爬蟲(chóng),如百度搜索引擎又叫作百度爬蟲(chóng)(BaiduSpider),谷歌搜索引擎又被稱(chēng)為谷歌機(jī)器人(Googlebot),而且通用網(wǎng)絡(luò)爬蟲(chóng)有時(shí)候也可以用來(lái)指代搜索引擎,是否搜索引擎就是網(wǎng)絡(luò)爬蟲(chóng)呢?答案是否定的。搜索引擎是一項(xiàng)綜合性的技術(shù),網(wǎng)絡(luò)爬蟲(chóng)是實(shí)現(xiàn)搜索引擎的比必不可少的一環(huán),爬蟲(chóng)只為搜索引擎提供數(shù)據(jù),除此之外還有建立全文索引,進(jìn)行倒排文件以及提供查詢(xún)服務(wù)等技術(shù)糅合在里邊。
除此之外,搜索引擎更關(guān)注的是大而全,為大多數(shù)用戶(hù)提供檢索服務(wù),所以有些冷門(mén)的沒(méi)有被列入索引的網(wǎng)站就沒(méi)辦法被實(shí)時(shí)獲取到,而網(wǎng)絡(luò)爬蟲(chóng)則可以通過(guò)個(gè)人定制,爬取一些搜索引擎關(guān)照不到的地方,典型的案例便是深層網(wǎng)絡(luò)爬蟲(chóng)以及在robots.txt中明確禁止搜索引擎爬取的網(wǎng)站,而理論上開(kāi)發(fā)者編寫(xiě)的網(wǎng)絡(luò)爬蟲(chóng)可以到達(dá)世界上的任何網(wǎng)站。
雖然開(kāi)發(fā)者日常編寫(xiě)的網(wǎng)絡(luò)爬蟲(chóng)遠(yuǎn)不及搜索引擎那般復(fù)雜與精密,但是卻能夠讓人了解到搜索引擎內(nèi)部的工作原理。而且搜索引擎也可以看作是日常編寫(xiě)的一個(gè)個(gè)定向聚焦的網(wǎng)絡(luò)爬蟲(chóng)聚合而來(lái)的,當(dāng)搜索引擎沒(méi)辦法完成定向的數(shù)據(jù)搜集工作的時(shí)候,編寫(xiě)一個(gè)自己的網(wǎng)絡(luò)爬蟲(chóng)就顯得極為重要了。
五、網(wǎng)絡(luò)爬蟲(chóng)技術(shù)的危害
由于網(wǎng)絡(luò)爬蟲(chóng)可以模擬正常用戶(hù)的訪(fǎng)問(wèn),所以可以完成下單購(gòu)物、搶票秒殺等行為,而且其是從協(xié)議層面實(shí)現(xiàn)的,拋開(kāi)了電腦端和移動(dòng)端的一系列復(fù)雜行為,速度遠(yuǎn)快于正常用戶(hù),會(huì)擠占正常用戶(hù)的需求。此外,網(wǎng)絡(luò)爬蟲(chóng)常被用來(lái)爬取公開(kāi)的數(shù)據(jù),但是爬取行為依然會(huì)占用正常的服務(wù)器資源。而且許多爬蟲(chóng)是追求效率的,是不加節(jié)制地,多線(xiàn)程、分布式地去進(jìn)行數(shù)據(jù)爬取,對(duì)網(wǎng)站造成類(lèi)似DDOS的攻擊,使得正常用戶(hù)也無(wú)法訪(fǎng)問(wèn)到數(shù)據(jù)。
要從互聯(lián)網(wǎng)上根絕網(wǎng)絡(luò)爬蟲(chóng)也是不可能的,因?yàn)榫W(wǎng)絡(luò)爬蟲(chóng)已經(jīng)成為了互聯(lián)網(wǎng)生態(tài)的一部分,搜索引擎便是最大的網(wǎng)絡(luò)爬蟲(chóng)。網(wǎng)站要防止的是來(lái)自個(gè)人或組織的不加節(jié)制的爬蟲(chóng)行為,通過(guò)不斷提高爬蟲(chóng)門(mén)檻,建立反爬蟲(chóng)措施,可以很大程度增加網(wǎng)絡(luò)爬蟲(chóng)的爬取成本,降低網(wǎng)絡(luò)爬蟲(chóng)帶來(lái)的危害。
參考文獻(xiàn)
[1]Tianyi Ma,Ziyang Zhang. Medical Consultation System based on Python Web crawler[C]//.Proceedings of 2021 2nd International Conference on Electronics, Communications and Information Technology (CECIT 2021).,2021:772-776.DOI:10.26914/c.cnkihy.2021.065511.
[2]Addo Prince Clement,Dorgbefu Jnr. Maxwell,Kulbo Nora Bakabbey,Akpatsa Samuel Kofi,Ohemeng Asare Andy,Dagadu Joshua Caleb,Boansi Kufuor Oliver,Kofi Frimpong Adasa Nkrumah. Video Ads in Digital Marketing and Sales: A Big Data Analytics Using Scrapy Web Crawler Mining Technique[J]. Asian Journal of Research in Computer Science,2021.
[3]Ma Xiaoju,Yan Min. Design and Implementation of Craweper Based on Scrapy[J]. Journal of Physics: Conference Series,2021,2033(1).
[4]Deng Kaiying,Chen Senpeng,Deng Jingwei. On optimisation of web crawler system on Scrapy framework[J]. International Journal of Wireless and Mobile Computing,2020,18(4).
[5]Wang Wei,Yu Lihua. UCrawler: A learning-based web crawler using a URL knowledge base[J]. Journal of Computational Methods in Sciences and Engineering,2021,21(2).