陳皓 周傳生
摘要:針對(duì)不同的網(wǎng)頁(yè)數(shù)據(jù)環(huán)境設(shè)計(jì)有效的爬蟲方案,更加有助于爬取信息的準(zhǔn)度和效度。文中以Python及其Scrapy框架為基礎(chǔ),以貝殼網(wǎng)為例,通過(guò)對(duì)網(wǎng)站的頁(yè)面源碼結(jié)構(gòu)進(jìn)行深入分析,編寫了行之有效的爬蟲文件來(lái)獲取目標(biāo)網(wǎng)站信息。該設(shè)計(jì)方法可以應(yīng)用到不同的多級(jí)頁(yè)面信息類型網(wǎng)站,為基于Web的數(shù)據(jù)分析提供策略采集和分析支持。
關(guān)鍵詞:大數(shù)據(jù);網(wǎng)絡(luò)爬蟲;scrapy框架;數(shù)據(jù)采集
中圖分類號(hào):TP3? ? ? ? 文獻(xiàn)標(biāo)識(shí)碼:A
文章編號(hào):1009-3044(2021)13-0003-03
Abstract: Designing effective crawling strategies for different network data environments can enhance the accuracy and validity of crawling information. Taking Bakclass.com as an example, this paper analyzes the structure of the source code of the website page based on Python and its Scrapy framework environment, and then composes effective crawler files to obtain target website information. Targeting the type of different multi-level information websites, this designing method supports network data analysis based on Web by acquiring and analyzing strategies.
Key words: big data; web crawler; scrapy framework; data acquisition
如今正值人工智能和物聯(lián)網(wǎng)高速發(fā)展時(shí)期,大數(shù)據(jù)正是由于網(wǎng)絡(luò)時(shí)代發(fā)展而衍生的必然產(chǎn)物,亞馬遜網(wǎng)絡(luò)服務(wù)(AWS)的大數(shù)據(jù)科學(xué)家John Rauser給這樣定義:“大數(shù)據(jù)是任何超過(guò)了一臺(tái)計(jì)算機(jī)處理能力的龐大數(shù)據(jù)量”。由于它是一個(gè)體量巨大,數(shù)據(jù)類別巨大的數(shù)據(jù)集,所以如何快速?gòu)闹蝎@取有效信息正是大數(shù)據(jù)所需研究的重點(diǎn)問(wèn)題。網(wǎng)絡(luò)爬蟲則是解決這些重點(diǎn)問(wèn)題的關(guān)鍵技術(shù)中的一種。網(wǎng)絡(luò)爬蟲是一種按照一定規(guī)則,自動(dòng)地抓取網(wǎng)絡(luò)信息的程序或腳本,另外還有一些不常使用的名字:螞蟻、自動(dòng)索引、模擬程序、蠕蟲[1]。從本質(zhì)上來(lái)說(shuō),爬蟲就是利用自動(dòng)化程序從網(wǎng)上批量抓取我們所需要的數(shù)據(jù)。
1 Web爬蟲設(shè)計(jì)的技術(shù)基礎(chǔ)
1.1 網(wǎng)頁(yè)抓取策略
在爬取網(wǎng)頁(yè)數(shù)據(jù)的過(guò)程中,待抓取的URL隊(duì)列以什么樣的順序排列,在爬蟲系統(tǒng)中是一個(gè)很重要的問(wèn)題,因?yàn)樯婕白ト№?yè)面的先后順序,而這種決定URL排列順序的方法,被稱之為抓取策略[2]。網(wǎng)頁(yè)的抓取策略主要分為兩種:基于深度優(yōu)先的遍歷和基于廣度優(yōu)先的遍歷。深度優(yōu)先遍歷在于能夠?qū)⑺猩顚拥腢RL全部找到,缺點(diǎn)是有可能一旦開始搜索或許會(huì)陷入永久搜索無(wú)法跳出[3-4]。而廣度優(yōu)先遍歷的好處是降低了重復(fù)率而不用反復(fù)爬取,但頁(yè)面更新后,信息的更新會(huì)不及時(shí),并且每次的判斷可能會(huì)消耗較多資源和時(shí)間。
1.2 Scrapy框架組成及數(shù)據(jù)流向
Scrapy具有功能強(qiáng)大、爬取效率高、相關(guān)擴(kuò)展組件多、可配置和可擴(kuò)展程度強(qiáng)的爬蟲框架。它基于Twisted的異步處理框架,是純Python實(shí)現(xiàn)的爬蟲框架,其架構(gòu)清晰,模塊耦合程度低,可以靈活的完成各種需求[5]。簡(jiǎn)單來(lái)說(shuō),Scrapy是一個(gè)為了爬取網(wǎng)站數(shù)據(jù),提取數(shù)據(jù)而編寫的應(yīng)用框架。
Scrapy主要組件有Scrapy Engine(引擎),Scheduler(調(diào)度器),Downloader(下載器),Spider(爬蟲器),Item Pipeline(管道)。還有兩個(gè)中間件:Downloader Middlewares(下載器中間件)和Spider Middlewares(爬蟲器中間件),箭頭代表Scrapy的數(shù)據(jù)流,數(shù)據(jù)流有引擎控制。詳細(xì)架構(gòu)及數(shù)據(jù)流向如圖1所示。
(1)Scrapy Engine:向Spider請(qǐng)求第一個(gè)要抓取的URL。
(2)Spider:提供URL給引擎。
(3)Scrapy Engine:接收到URL,交給Scheduler排序入隊(duì)。
(4)Scheduler:將URL處理成request給Scrapy Engine。
(5)Scrapy Engine:接收到request,并通過(guò)Downloader Middlewares給Downloader下載。
(6)Downloader:根據(jù)request下載頁(yè)面,返回response給Scrapy Engine。
(7)Scrapy Engine:接收到response,并通過(guò)Spider Middlewares給Spider處理。
(8)Spider:處理response,提取網(wǎng)站數(shù)據(jù),返回結(jié)構(gòu)item給Scrapy Engine,如果有跟進(jìn)的request也會(huì)給Scrapy Engine。
(9)Scrapy Engine:接收到item,交給Item Pipeline。
(10)Item Pipeline:如有新的request交給Scheduler處理,并從第2步開始重復(fù)直到調(diào)度器沒有request,引擎就會(huì)關(guān)閉本次爬蟲。
1.3 Xpath頁(yè)面解析
通過(guò)Scrapy將數(shù)據(jù)從網(wǎng)頁(yè)爬去下來(lái)之后,需要從每個(gè)網(wǎng)頁(yè)解析并提取出數(shù)據(jù),常用提取網(wǎng)頁(yè)數(shù)據(jù)主要有三種方式:正則表達(dá)式、Beautiful Soup和Xpath,三種方法各有千秋,本文選擇Xpath來(lái)提取網(wǎng)頁(yè)數(shù)據(jù)。
Xpath全稱XML path Language,即XML路徑語(yǔ)言,最初用于搜索XML文檔,同樣也適用于HTML文檔搜索。使用Xpath頁(yè)面解析的特點(diǎn)在于:一是Scrapy提供了簡(jiǎn)潔明了的路徑選擇表達(dá)式以及豐富的內(nèi)建函數(shù),用于對(duì)字符串、數(shù)值、時(shí)間的匹配。二是Xpath提供的路徑表達(dá)式可以進(jìn)行順暢的序列化處理,所有想要定位的標(biāo)簽節(jié)點(diǎn),都可以使用Xpath來(lái)選擇。三是當(dāng)面對(duì)比較復(fù)雜的網(wǎng)頁(yè)源代碼時(shí),Xpath更容易對(duì)源數(shù)據(jù)進(jìn)行解析,并且較之Beautiful Soup速度更快。
Xpath使用路徑表達(dá)式可以在網(wǎng)頁(yè)源代碼中選取節(jié)點(diǎn),可以說(shuō)它是沿著路徑來(lái)截取數(shù)據(jù)的,常用表達(dá)式如表1所示。
2 Web爬蟲的設(shè)計(jì)
2.1 爬取數(shù)據(jù)的基本流程
爬取目標(biāo)網(wǎng)站之前,首先要確定采集目標(biāo),明確采集字段的位置信息和邏輯結(jié)構(gòu)。通過(guò)整體布局,需確定是否制定采集策略,如需植入采集策略,可根據(jù)源碼字段的邏輯結(jié)構(gòu)進(jìn)行設(shè)置。其次對(duì)已確定的采集字段進(jìn)行頁(yè)面和源碼之間的關(guān)系分析,檢查采集字段所處頁(yè)面位置,并依據(jù)其關(guān)系實(shí)施相應(yīng)的采集方法。最后通過(guò)以上分析,選擇符合該頁(yè)面特點(diǎn)的路徑表達(dá)式進(jìn)行數(shù)據(jù)解析,并通過(guò)編寫爬蟲各功能模塊來(lái)分步實(shí)現(xiàn)該網(wǎng)站的數(shù)據(jù)爬取。圖2描述的是一個(gè)爬取網(wǎng)頁(yè)數(shù)據(jù)的基本流程。
2.2 基于Scrapy框架的目標(biāo)網(wǎng)站數(shù)據(jù)采集
為了描述本W(wǎng)eb爬蟲的具體實(shí)現(xiàn),本文結(jié)合國(guó)內(nèi)知名房屋交易網(wǎng)站貝殼網(wǎng)(https://sy.ke.com/ershoufang/)分布說(shuō)明。
2.2.1 確定目標(biāo)
實(shí)施操作之前,需確定數(shù)據(jù)目標(biāo)。通過(guò)觀察頁(yè)面得出,列表頁(yè)展示的是房屋基本信息,對(duì)應(yīng)的詳細(xì)信息需要進(jìn)入到詳情頁(yè)面才可以看到。所以列表頁(yè)中并沒有顯示全部的數(shù)據(jù)信息,如果想要提取這些數(shù)據(jù),必須進(jìn)入詳情頁(yè)采集。本次所采集的數(shù)據(jù)共有8個(gè)字段,列表頁(yè)采集總價(jià)、單價(jià)、小區(qū)名稱;詳情頁(yè)則采集戶型、裝修情況、面積和所在區(qū)域。
采集策略方面,Scrapy采用后進(jìn)先出隊(duì)列的方式,在默認(rèn)情況下該框架為深度優(yōu)先遍歷來(lái)爬取網(wǎng)頁(yè)數(shù)據(jù),但根據(jù)信息位置和邏輯結(jié)構(gòu)不同,可將遍歷方式更改為廣度優(yōu)先,具體操作需要在settings文件中設(shè)置DEPTH_PRIORITY=1完成策略更改。爬取數(shù)據(jù)時(shí),0表示深度優(yōu)先,1表示廣度優(yōu)先。
2.2.2 網(wǎng)站頁(yè)面分析
通過(guò)觀察目標(biāo)URL可以發(fā)現(xiàn),第二頁(yè)為:https://sy.ke.com/ershoufang/pg2,第三頁(yè)為:https://sy.ke.com/ershoufang/pg3,而第一頁(yè)的內(nèi)容使用https://sy.ke.com/ershoufang/pg1同樣可以訪問(wèn),所以可以得出頁(yè)面是通過(guò)一個(gè)參數(shù)pn*來(lái)確定的,修改*即可以實(shí)現(xiàn)爬取翻頁(yè)操作。在房屋信息方面,可以找到列表中總價(jià)、單價(jià)、小區(qū)名稱等字段均包含在屬性值為class的li標(biāo)簽中,所以列表頁(yè)的數(shù)據(jù)可以直接采集,而詳情頁(yè)數(shù)據(jù)需先采集列表頁(yè)中詳情頁(yè)的URL字段,再通過(guò)回調(diào)URL來(lái)實(shí)現(xiàn)采集剩余字段。
2.2.3 分步實(shí)現(xiàn)
首先創(chuàng)建一個(gè)新的Scrapy項(xiàng)目建立爬蟲,編碼爬蟲文件。系統(tǒng)自動(dòng)生成文件時(shí),定義的爬蟲類必須繼承于Scrapy.Spider類,并且文件中已經(jīng)提前設(shè)置好了爬蟲器唯一的名字name,規(guī)定了爬蟲爬取域名的范圍allow_domains=[],并建立parse方法,用于獲取下載的response來(lái)解析網(wǎng)頁(yè)。通過(guò)循環(huán)遍歷構(gòu)造出每個(gè)頁(yè)面的網(wǎng)址,將網(wǎng)址添加進(jìn)start_urls列表中。
然后,定義兩個(gè)函數(shù)分別為parse和parse_detail用來(lái)解析列表頁(yè)數(shù)據(jù)和詳情頁(yè)數(shù)據(jù)。在parse方法中,運(yùn)用Xpath解析出列表頁(yè)字段所在標(biāo)簽位置,同時(shí)通過(guò)relsult字典保存遍歷出的詳情頁(yè)URL、小區(qū)名稱、總價(jià)和單價(jià)字段,并傳遞下去。
最后爬蟲深入詳情頁(yè)采集其他字段,在 parse方法中需使用yield來(lái)實(shí)現(xiàn)多級(jí)頁(yè)面爬取,通過(guò)運(yùn)用scrapy.Request()構(gòu)造一個(gè)新的請(qǐng)求對(duì)象,使用callback參數(shù)定義回調(diào)函數(shù),來(lái)決定使用parse_detail方法處理這次新的請(qǐng)求響應(yīng)。
本爬蟲設(shè)計(jì)關(guān)鍵在于從列表頁(yè)進(jìn)入到詳情頁(yè)采集數(shù)據(jù)的實(shí)現(xiàn)。通過(guò)運(yùn)用Scrapy自身并行獲取的能力,運(yùn)用yield發(fā)起新的請(qǐng)求,定義詳情頁(yè)URL是鏈接,使用meta傳遞item參數(shù),并使用callback參數(shù)為這個(gè)請(qǐng)求添加回調(diào)函數(shù)。而parse_detail用來(lái)處理新鏈接的response,使用meta={‘result:result}接收傳遞的字典數(shù)據(jù)(即列表頁(yè)字段數(shù)據(jù)),同時(shí)解析詳情頁(yè)字段內(nèi)容。最后使用yield item返回item,將列表頁(yè)和詳情頁(yè)的數(shù)據(jù)統(tǒng)一交給item pipeline做后續(xù)處理。圖3描述的為本文所采用的基于Scrapy框架的爬蟲流程圖。
3 Web爬蟲的應(yīng)用示例
為了測(cè)試本W(wǎng)eb爬蟲的應(yīng)用效果,結(jié)合貝殼網(wǎng)(https://sy.ke.com/ershoufang/)做出了如下測(cè)試。在管道模塊中運(yùn)用openpyxl庫(kù)進(jìn)行數(shù)據(jù)存儲(chǔ),將已經(jīng)爬取到的數(shù)據(jù)保存到文件中。通過(guò)修改robots默認(rèn)協(xié)議為ROBOTSTXT_OBEY=False,設(shè)置爬取速度DOWNLOAD=3,并配置相應(yīng)USER_AGENT來(lái)實(shí)現(xiàn)數(shù)據(jù)爬取,啟動(dòng)爬蟲命令后,會(huì)顯示大量輸出信息。該項(xiàng)目測(cè)試運(yùn)行后成功獲取了網(wǎng)站上3000多條房源的目標(biāo)數(shù)據(jù),達(dá)到了預(yù)期的爬取速度和爬取質(zhì)量,打開文件可看到直觀的數(shù)據(jù)信息。提取數(shù)據(jù)最后保存結(jié)果如圖4所示。
4 結(jié)束語(yǔ)
隨著大數(shù)據(jù)在各個(gè)領(lǐng)域和環(huán)節(jié)的應(yīng)用逐步深入與發(fā)展,各類完整及快速的數(shù)據(jù)采集技術(shù)需求更加迫切和專業(yè),本文基于Scrapy框架對(duì)爬蟲文件進(jìn)行設(shè)計(jì),根據(jù)爬取網(wǎng)站數(shù)據(jù)的基本流程,運(yùn)用Scrapy框架強(qiáng)大的并行獲取數(shù)據(jù)能力,完成了對(duì)貝殼網(wǎng)房產(chǎn)數(shù)據(jù)的多級(jí)頁(yè)面提取,實(shí)現(xiàn)了對(duì)網(wǎng)站龐大數(shù)據(jù)信息的批量獲取。
參考文獻(xiàn):
[1] 王芳.基于Python的招聘網(wǎng)站信息爬取與數(shù)據(jù)分析[J].信息技術(shù)與網(wǎng)絡(luò)安全,2019,38(8):42-46,57.
[2] 謝克武.大數(shù)據(jù)環(huán)境下基于python的網(wǎng)絡(luò)爬蟲技術(shù)[J].電子制作,2017(9):44-45.
[3] 杜雷,辛陽(yáng).基于規(guī)則庫(kù)和網(wǎng)絡(luò)爬蟲的漏洞檢測(cè)技術(shù)研究與實(shí)現(xiàn)[J].信息網(wǎng)絡(luò)安全,2014(10):38-43.
[4] 揭秋明.基于Ajax的深層網(wǎng)絡(luò)爬蟲研究[D].武漢:中國(guó)地質(zhì)大學(xué)(武漢),2013.
[5] 杜鵬輝,仇繼揚(yáng),彭書濤,等.基于Scrapy的網(wǎng)絡(luò)爬蟲的設(shè)計(jì)與實(shí)現(xiàn)[J].電子設(shè)計(jì)工程,2019,27(22):120-123,132.
[6] 溫佐承,侯帥.基于Python的網(wǎng)絡(luò)爬蟲設(shè)計(jì)與實(shí)現(xiàn)[J].電腦編程技巧與維護(hù),2020(7):21-23,42.
[7] 柴喚友,劉三女牙,康令云,等.教育大數(shù)據(jù)采集機(jī)制與關(guān)鍵技術(shù)研究[J].大數(shù)據(jù),2020,6(6):14-25
[8] Kausar M A,Dhaka V S,Singh S K.Webcrawler:A review[J].International Journal of Computer Applications,2013,63(2):31-36.
[9] 劉智慧,張泉靈.大數(shù)據(jù)技術(shù)研究綜述[J].浙江大學(xué)學(xué)報(bào)(工學(xué)版),2014,48(6):957-972.
【通聯(lián)編輯:代影】