陳皓 周傳生



摘要:針對不同的網頁數據環境設計有效的爬蟲方案,更加有助于爬取信息的準度和效度。文中以Python及其Scrapy框架為基礎,以貝殼網為例,通過對網站的頁面源碼結構進行深入分析,編寫了行之有效的爬蟲文件來獲取目標網站信息。該設計方法可以應用到不同的多級頁面信息類型網站,為基于Web的數據分析提供策略采集和分析支持。
關鍵詞:大數據;網絡爬蟲;scrapy框架;數據采集
中圖分類號:TP3? ? ? ? 文獻標識碼:A
文章編號: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
如今正值人工智能和物聯網高速發展時期,大數據正是由于網絡時代發展而衍生的必然產物,亞馬遜網絡服務(AWS)的大數據科學家John Rauser給這樣定義:“大數據是任何超過了一臺計算機處理能力的龐大數據量”。由于它是一個體量巨大,數據類別巨大的數據集,所以如何快速從中獲取有效信息正是大數據所需研究的重點問題。網絡爬蟲則是解決這些重點問題的關鍵技術中的一種。網絡爬蟲是一種按照一定規則,自動地抓取網絡信息的程序或腳本,另外還有一些不常使用的名字:螞蟻、自動索引、模擬程序、蠕蟲[1]。從本質上來說,爬蟲就是利用自動化程序從網上批量抓取我們所需要的數據。
1 Web爬蟲設計的技術基礎
1.1 網頁抓取策略
在爬取網頁數據的過程中,待抓取的URL隊列以什么樣的順序排列,在爬蟲系統中是一個很重要的問題,因為涉及抓取頁面的先后順序,而這種決定URL排列順序的方法,被稱之為抓取策略[2]。網頁的抓取策略主要分為兩種:基于深度優先的遍歷和基于廣度優先的遍歷。深度優先遍歷在于能夠將所有深層的URL全部找到,缺點是有可能一旦開始搜索或許會陷入永久搜索無法跳出[3-4]。而廣度優先遍歷的好處是降低了重復率而不用反復爬取,但頁面更新后,信息的更新會不及時,并且每次的判斷可能會消耗較多資源和時間。
1.2 Scrapy框架組成及數據流向
Scrapy具有功能強大、爬取效率高、相關擴展組件多、可配置和可擴展程度強的爬蟲框架。它基于Twisted的異步處理框架,是純Python實現的爬蟲框架,其架構清晰,模塊耦合程度低,可以靈活的完成各種需求[5]。簡單來說,Scrapy是一個為了爬取網站數據,提取數據而編寫的應用框架。
Scrapy主要組件有Scrapy Engine(引擎),Scheduler(調度器),Downloader(下載器),Spider(爬蟲器),Item Pipeline(管道)。還有兩個中間件:Downloader Middlewares(下載器中間件)和Spider Middlewares(爬蟲器中間件),箭頭代表Scrapy的數據流,數據流有引擎控制。詳細架構及數據流向如圖1所示。
(1)Scrapy Engine:向Spider請求第一個要抓取的URL。
(2)Spider:提供URL給引擎。
(3)Scrapy Engine:接收到URL,交給Scheduler排序入隊。
(4)Scheduler:將URL處理成request給Scrapy Engine。
(5)Scrapy Engine:接收到request,并通過Downloader Middlewares給Downloader下載。
(6)Downloader:根據request下載頁面,返回response給Scrapy Engine。
(7)Scrapy Engine:接收到response,并通過Spider Middlewares給Spider處理。
(8)Spider:處理response,提取網站數據,返回結構item給Scrapy Engine,如果有跟進的request也會給Scrapy Engine。
(9)Scrapy Engine:接收到item,交給Item Pipeline。
(10)Item Pipeline:如有新的request交給Scheduler處理,并從第2步開始重復直到調度器沒有request,引擎就會關閉本次爬蟲。
1.3 Xpath頁面解析
通過Scrapy將數據從網頁爬去下來之后,需要從每個網頁解析并提取出數據,常用提取網頁數據主要有三種方式:正則表達式、Beautiful Soup和Xpath,三種方法各有千秋,本文選擇Xpath來提取網頁數據。
Xpath全稱XML path Language,即XML路徑語言,最初用于搜索XML文檔,同樣也適用于HTML文檔搜索。使用Xpath頁面解析的特點在于:一是Scrapy提供了簡潔明了的路徑選擇表達式以及豐富的內建函數,用于對字符串、數值、時間的匹配。二是Xpath提供的路徑表達式可以進行順暢的序列化處理,所有想要定位的標簽節點,都可以使用Xpath來選擇。三是當面對比較復雜的網頁源代碼時,Xpath更容易對源數據進行解析,并且較之Beautiful Soup速度更快。
Xpath使用路徑表達式可以在網頁源代碼中選取節點,可以說它是沿著路徑來截取數據的,常用表達式如表1所示。
2 Web爬蟲的設計
2.1 爬取數據的基本流程
爬取目標網站之前,首先要確定采集目標,明確采集字段的位置信息和邏輯結構。通過整體布局,需確定是否制定采集策略,如需植入采集策略,可根據源碼字段的邏輯結構進行設置。其次對已確定的采集字段進行頁面和源碼之間的關系分析,檢查采集字段所處頁面位置,并依據其關系實施相應的采集方法。最后通過以上分析,選擇符合該頁面特點的路徑表達式進行數據解析,并通過編寫爬蟲各功能模塊來分步實現該網站的數據爬取。圖2描述的是一個爬取網頁數據的基本流程。
2.2 基于Scrapy框架的目標網站數據采集
為了描述本Web爬蟲的具體實現,本文結合國內知名房屋交易網站貝殼網(https://sy.ke.com/ershoufang/)分布說明。
2.2.1 確定目標
實施操作之前,需確定數據目標。通過觀察頁面得出,列表頁展示的是房屋基本信息,對應的詳細信息需要進入到詳情頁面才可以看到。所以列表頁中并沒有顯示全部的數據信息,如果想要提取這些數據,必須進入詳情頁采集。本次所采集的數據共有8個字段,列表頁采集總價、單價、小區名稱;詳情頁則采集戶型、裝修情況、面積和所在區域。
采集策略方面,Scrapy采用后進先出隊列的方式,在默認情況下該框架為深度優先遍歷來爬取網頁數據,但根據信息位置和邏輯結構不同,可將遍歷方式更改為廣度優先,具體操作需要在settings文件中設置DEPTH_PRIORITY=1完成策略更改。爬取數據時,0表示深度優先,1表示廣度優先。
2.2.2 網站頁面分析
通過觀察目標URL可以發現,第二頁為:https://sy.ke.com/ershoufang/pg2,第三頁為:https://sy.ke.com/ershoufang/pg3,而第一頁的內容使用https://sy.ke.com/ershoufang/pg1同樣可以訪問,所以可以得出頁面是通過一個參數pn*來確定的,修改*即可以實現爬取翻頁操作。在房屋信息方面,可以找到列表中總價、單價、小區名稱等字段均包含在屬性值為class的li標簽中,所以列表頁的數據可以直接采集,而詳情頁數據需先采集列表頁中詳情頁的URL字段,再通過回調URL來實現采集剩余字段。
2.2.3 分步實現
首先創建一個新的Scrapy項目建立爬蟲,編碼爬蟲文件。系統自動生成文件時,定義的爬蟲類必須繼承于Scrapy.Spider類,并且文件中已經提前設置好了爬蟲器唯一的名字name,規定了爬蟲爬取域名的范圍allow_domains=[],并建立parse方法,用于獲取下載的response來解析網頁。通過循環遍歷構造出每個頁面的網址,將網址添加進start_urls列表中。
然后,定義兩個函數分別為parse和parse_detail用來解析列表頁數據和詳情頁數據。在parse方法中,運用Xpath解析出列表頁字段所在標簽位置,同時通過relsult字典保存遍歷出的詳情頁URL、小區名稱、總價和單價字段,并傳遞下去。
最后爬蟲深入詳情頁采集其他字段,在 parse方法中需使用yield來實現多級頁面爬取,通過運用scrapy.Request()構造一個新的請求對象,使用callback參數定義回調函數,來決定使用parse_detail方法處理這次新的請求響應。
本爬蟲設計關鍵在于從列表頁進入到詳情頁采集數據的實現。通過運用Scrapy自身并行獲取的能力,運用yield發起新的請求,定義詳情頁URL是鏈接,使用meta傳遞item參數,并使用callback參數為這個請求添加回調函數。而parse_detail用來處理新鏈接的response,使用meta={‘result:result}接收傳遞的字典數據(即列表頁字段數據),同時解析詳情頁字段內容。最后使用yield item返回item,將列表頁和詳情頁的數據統一交給item pipeline做后續處理。圖3描述的為本文所采用的基于Scrapy框架的爬蟲流程圖。
3 Web爬蟲的應用示例
為了測試本Web爬蟲的應用效果,結合貝殼網(https://sy.ke.com/ershoufang/)做出了如下測試。在管道模塊中運用openpyxl庫進行數據存儲,將已經爬取到的數據保存到文件中。通過修改robots默認協議為ROBOTSTXT_OBEY=False,設置爬取速度DOWNLOAD=3,并配置相應USER_AGENT來實現數據爬取,啟動爬蟲命令后,會顯示大量輸出信息。該項目測試運行后成功獲取了網站上3000多條房源的目標數據,達到了預期的爬取速度和爬取質量,打開文件可看到直觀的數據信息。提取數據最后保存結果如圖4所示。
4 結束語
隨著大數據在各個領域和環節的應用逐步深入與發展,各類完整及快速的數據采集技術需求更加迫切和專業,本文基于Scrapy框架對爬蟲文件進行設計,根據爬取網站數據的基本流程,運用Scrapy框架強大的并行獲取數據能力,完成了對貝殼網房產數據的多級頁面提取,實現了對網站龐大數據信息的批量獲取。
參考文獻:
[1] 王芳.基于Python的招聘網站信息爬取與數據分析[J].信息技術與網絡安全,2019,38(8):42-46,57.
[2] 謝克武.大數據環境下基于python的網絡爬蟲技術[J].電子制作,2017(9):44-45.
[3] 杜雷,辛陽.基于規則庫和網絡爬蟲的漏洞檢測技術研究與實現[J].信息網絡安全,2014(10):38-43.
[4] 揭秋明.基于Ajax的深層網絡爬蟲研究[D].武漢:中國地質大學(武漢),2013.
[5] 杜鵬輝,仇繼揚,彭書濤,等.基于Scrapy的網絡爬蟲的設計與實現[J].電子設計工程,2019,27(22):120-123,132.
[6] 溫佐承,侯帥.基于Python的網絡爬蟲設計與實現[J].電腦編程技巧與維護,2020(7):21-23,42.
[7] 柴喚友,劉三女牙,康令云,等.教育大數據采集機制與關鍵技術研究[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] 劉智慧,張泉靈.大數據技術研究綜述[J].浙江大學學報(工學版),2014,48(6):957-972.
【通聯編輯:代影】