国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

基于Python和Scrapy框架的網(wǎng)頁爬蟲設(shè)計與實現(xiàn)

2021-07-19 08:32:22陳皓周傳生
電腦知識與技術(shù) 2021年13期
關(guān)鍵詞:網(wǎng)絡(luò)爬蟲數(shù)據(jù)采集大數(shù)據(jù)

陳皓 周傳生

摘要:針對不同的網(wǎng)頁數(shù)據(jù)環(huán)境設(shè)計有效的爬蟲方案,更加有助于爬取信息的準(zhǔn)度和效度。文中以Python及其Scrapy框架為基礎(chǔ),以貝殼網(wǎng)為例,通過對網(wǎng)站的頁面源碼結(jié)構(gòu)進行深入分析,編寫了行之有效的爬蟲文件來獲取目標(biāo)網(wǎng)站信息。該設(shè)計方法可以應(yīng)用到不同的多級頁面信息類型網(wǎng)站,為基于Web的數(shù)據(jù)分析提供策略采集和分析支持。

關(guān)鍵詞:大數(shù)據(jù);網(wǎng)絡(luò)爬蟲;scrapy框架;數(shù)據(jù)采集

中圖分類號:TP3? ? ? ? 文獻標(biāo)識碼: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

如今正值人工智能和物聯(lián)網(wǎng)高速發(fā)展時期,大數(shù)據(jù)正是由于網(wǎng)絡(luò)時代發(fā)展而衍生的必然產(chǎn)物,亞馬遜網(wǎng)絡(luò)服務(wù)(AWS)的大數(shù)據(jù)科學(xué)家John Rauser給這樣定義:“大數(shù)據(jù)是任何超過了一臺計算機處理能力的龐大數(shù)據(jù)量”。由于它是一個體量巨大,數(shù)據(jù)類別巨大的數(shù)據(jù)集,所以如何快速從中獲取有效信息正是大數(shù)據(jù)所需研究的重點問題。網(wǎng)絡(luò)爬蟲則是解決這些重點問題的關(guān)鍵技術(shù)中的一種。網(wǎng)絡(luò)爬蟲是一種按照一定規(guī)則,自動地抓取網(wǎng)絡(luò)信息的程序或腳本,另外還有一些不常使用的名字:螞蟻、自動索引、模擬程序、蠕蟲[1]。從本質(zhì)上來說,爬蟲就是利用自動化程序從網(wǎng)上批量抓取我們所需要的數(shù)據(jù)。

1 Web爬蟲設(shè)計的技術(shù)基礎(chǔ)

1.1 網(wǎng)頁抓取策略

在爬取網(wǎng)頁數(shù)據(jù)的過程中,待抓取的URL隊列以什么樣的順序排列,在爬蟲系統(tǒng)中是一個很重要的問題,因為涉及抓取頁面的先后順序,而這種決定URL排列順序的方法,被稱之為抓取策略[2]。網(wǎng)頁的抓取策略主要分為兩種:基于深度優(yōu)先的遍歷和基于廣度優(yōu)先的遍歷。深度優(yōu)先遍歷在于能夠?qū)⑺猩顚拥腢RL全部找到,缺點是有可能一旦開始搜索或許會陷入永久搜索無法跳出[3-4]。而廣度優(yōu)先遍歷的好處是降低了重復(fù)率而不用反復(fù)爬取,但頁面更新后,信息的更新會不及時,并且每次的判斷可能會消耗較多資源和時間。

1.2 Scrapy框架組成及數(shù)據(jù)流向

Scrapy具有功能強大、爬取效率高、相關(guān)擴展組件多、可配置和可擴展程度強的爬蟲框架。它基于Twisted的異步處理框架,是純Python實現(xiàn)的爬蟲框架,其架構(gòu)清晰,模塊耦合程度低,可以靈活的完成各種需求[5]。簡單來說,Scrapy是一個為了爬取網(wǎng)站數(shù)據(jù),提取數(shù)據(jù)而編寫的應(yīng)用框架。

Scrapy主要組件有Scrapy Engine(引擎),Scheduler(調(diào)度器),Downloader(下載器),Spider(爬蟲器),Item Pipeline(管道)。還有兩個中間件:Downloader Middlewares(下載器中間件)和Spider Middlewares(爬蟲器中間件),箭頭代表Scrapy的數(shù)據(jù)流,數(shù)據(jù)流有引擎控制。詳細(xì)架構(gòu)及數(shù)據(jù)流向如圖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:根據(jù)request下載頁面,返回response給Scrapy Engine。

(7)Scrapy Engine:接收到response,并通過Spider Middlewares給Spider處理。

(8)Spider:處理response,提取網(wǎng)站數(shù)據(jù),返回結(jié)構(gòu)item給Scrapy Engine,如果有跟進的request也會給Scrapy Engine。

(9)Scrapy Engine:接收到item,交給Item Pipeline。

(10)Item Pipeline:如有新的request交給Scheduler處理,并從第2步開始重復(fù)直到調(diào)度器沒有request,引擎就會關(guān)閉本次爬蟲。

1.3 Xpath頁面解析

通過Scrapy將數(shù)據(jù)從網(wǎng)頁爬去下來之后,需要從每個網(wǎng)頁解析并提取出數(shù)據(jù),常用提取網(wǎng)頁數(shù)據(jù)主要有三種方式:正則表達式、Beautiful Soup和Xpath,三種方法各有千秋,本文選擇Xpath來提取網(wǎng)頁數(shù)據(jù)。

Xpath全稱XML path Language,即XML路徑語言,最初用于搜索XML文檔,同樣也適用于HTML文檔搜索。使用Xpath頁面解析的特點在于:一是Scrapy提供了簡潔明了的路徑選擇表達式以及豐富的內(nèi)建函數(shù),用于對字符串、數(shù)值、時間的匹配。二是Xpath提供的路徑表達式可以進行順暢的序列化處理,所有想要定位的標(biāo)簽節(jié)點,都可以使用Xpath來選擇。三是當(dāng)面對比較復(fù)雜的網(wǎng)頁源代碼時,Xpath更容易對源數(shù)據(jù)進行解析,并且較之Beautiful Soup速度更快。

Xpath使用路徑表達式可以在網(wǎng)頁源代碼中選取節(jié)點,可以說它是沿著路徑來截取數(shù)據(jù)的,常用表達式如表1所示。

2 Web爬蟲的設(shè)計

2.1 爬取數(shù)據(jù)的基本流程

爬取目標(biāo)網(wǎng)站之前,首先要確定采集目標(biāo),明確采集字段的位置信息和邏輯結(jié)構(gòu)。通過整體布局,需確定是否制定采集策略,如需植入采集策略,可根據(jù)源碼字段的邏輯結(jié)構(gòu)進行設(shè)置。其次對已確定的采集字段進行頁面和源碼之間的關(guān)系分析,檢查采集字段所處頁面位置,并依據(jù)其關(guān)系實施相應(yīng)的采集方法。最后通過以上分析,選擇符合該頁面特點的路徑表達式進行數(shù)據(jù)解析,并通過編寫爬蟲各功能模塊來分步實現(xiàn)該網(wǎng)站的數(shù)據(jù)爬取。圖2描述的是一個爬取網(wǎng)頁數(shù)據(jù)的基本流程。

2.2 基于Scrapy框架的目標(biāo)網(wǎng)站數(shù)據(jù)采集

為了描述本W(wǎng)eb爬蟲的具體實現(xiàn),本文結(jié)合國內(nèi)知名房屋交易網(wǎng)站貝殼網(wǎng)(https://sy.ke.com/ershoufang/)分布說明。

2.2.1 確定目標(biāo)

實施操作之前,需確定數(shù)據(jù)目標(biāo)。通過觀察頁面得出,列表頁展示的是房屋基本信息,對應(yīng)的詳細(xì)信息需要進入到詳情頁面才可以看到。所以列表頁中并沒有顯示全部的數(shù)據(jù)信息,如果想要提取這些數(shù)據(jù),必須進入詳情頁采集。本次所采集的數(shù)據(jù)共有8個字段,列表頁采集總價、單價、小區(qū)名稱;詳情頁則采集戶型、裝修情況、面積和所在區(qū)域。

采集策略方面,Scrapy采用后進先出隊列的方式,在默認(rèn)情況下該框架為深度優(yōu)先遍歷來爬取網(wǎng)頁數(shù)據(jù),但根據(jù)信息位置和邏輯結(jié)構(gòu)不同,可將遍歷方式更改為廣度優(yōu)先,具體操作需要在settings文件中設(shè)置DEPTH_PRIORITY=1完成策略更改。爬取數(shù)據(jù)時,0表示深度優(yōu)先,1表示廣度優(yōu)先。

2.2.2 網(wǎng)站頁面分析

通過觀察目標(biāo)URL可以發(fā)現(xiàn),第二頁為:https://sy.ke.com/ershoufang/pg2,第三頁為:https://sy.ke.com/ershoufang/pg3,而第一頁的內(nèi)容使用https://sy.ke.com/ershoufang/pg1同樣可以訪問,所以可以得出頁面是通過一個參數(shù)pn*來確定的,修改*即可以實現(xiàn)爬取翻頁操作。在房屋信息方面,可以找到列表中總價、單價、小區(qū)名稱等字段均包含在屬性值為class的li標(biāo)簽中,所以列表頁的數(shù)據(jù)可以直接采集,而詳情頁數(shù)據(jù)需先采集列表頁中詳情頁的URL字段,再通過回調(diào)URL來實現(xiàn)采集剩余字段。

2.2.3 分步實現(xiàn)

首先創(chuàng)建一個新的Scrapy項目建立爬蟲,編碼爬蟲文件。系統(tǒng)自動生成文件時,定義的爬蟲類必須繼承于Scrapy.Spider類,并且文件中已經(jīng)提前設(shè)置好了爬蟲器唯一的名字name,規(guī)定了爬蟲爬取域名的范圍allow_domains=[],并建立parse方法,用于獲取下載的response來解析網(wǎng)頁。通過循環(huán)遍歷構(gòu)造出每個頁面的網(wǎng)址,將網(wǎng)址添加進start_urls列表中。

然后,定義兩個函數(shù)分別為parse和parse_detail用來解析列表頁數(shù)據(jù)和詳情頁數(shù)據(jù)。在parse方法中,運用Xpath解析出列表頁字段所在標(biāo)簽位置,同時通過relsult字典保存遍歷出的詳情頁URL、小區(qū)名稱、總價和單價字段,并傳遞下去。

最后爬蟲深入詳情頁采集其他字段,在 parse方法中需使用yield來實現(xiàn)多級頁面爬取,通過運用scrapy.Request()構(gòu)造一個新的請求對象,使用callback參數(shù)定義回調(diào)函數(shù),來決定使用parse_detail方法處理這次新的請求響應(yīng)。

本爬蟲設(shè)計關(guān)鍵在于從列表頁進入到詳情頁采集數(shù)據(jù)的實現(xiàn)。通過運用Scrapy自身并行獲取的能力,運用yield發(fā)起新的請求,定義詳情頁URL是鏈接,使用meta傳遞item參數(shù),并使用callback參數(shù)為這個請求添加回調(diào)函數(shù)。而parse_detail用來處理新鏈接的response,使用meta={‘result:result}接收傳遞的字典數(shù)據(jù)(即列表頁字段數(shù)據(jù)),同時解析詳情頁字段內(nèi)容。最后使用yield item返回item,將列表頁和詳情頁的數(shù)據(jù)統(tǒng)一交給item pipeline做后續(xù)處理。圖3描述的為本文所采用的基于Scrapy框架的爬蟲流程圖。

3 Web爬蟲的應(yīng)用示例

為了測試本W(wǎng)eb爬蟲的應(yīng)用效果,結(jié)合貝殼網(wǎng)(https://sy.ke.com/ershoufang/)做出了如下測試。在管道模塊中運用openpyxl庫進行數(shù)據(jù)存儲,將已經(jīng)爬取到的數(shù)據(jù)保存到文件中。通過修改robots默認(rèn)協(xié)議為ROBOTSTXT_OBEY=False,設(shè)置爬取速度DOWNLOAD=3,并配置相應(yīng)USER_AGENT來實現(xiàn)數(shù)據(jù)爬取,啟動爬蟲命令后,會顯示大量輸出信息。該項目測試運行后成功獲取了網(wǎng)站上3000多條房源的目標(biāo)數(shù)據(jù),達到了預(yù)期的爬取速度和爬取質(zhì)量,打開文件可看到直觀的數(shù)據(jù)信息。提取數(shù)據(jù)最后保存結(jié)果如圖4所示。

4 結(jié)束語

隨著大數(shù)據(jù)在各個領(lǐng)域和環(huán)節(jié)的應(yīng)用逐步深入與發(fā)展,各類完整及快速的數(shù)據(jù)采集技術(shù)需求更加迫切和專業(yè),本文基于Scrapy框架對爬蟲文件進行設(shè)計,根據(jù)爬取網(wǎng)站數(shù)據(jù)的基本流程,運用Scrapy框架強大的并行獲取數(shù)據(jù)能力,完成了對貝殼網(wǎng)房產(chǎn)數(shù)據(jù)的多級頁面提取,實現(xiàn)了對網(wǎng)站龐大數(shù)據(jù)信息的批量獲取。

參考文獻:

[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] 杜雷,辛陽.基于規(guī)則庫和網(wǎng)絡(luò)爬蟲的漏洞檢測技術(shù)研究與實現(xiàn)[J].信息網(wǎng)絡(luò)安全,2014(10):38-43.

[4] 揭秋明.基于Ajax的深層網(wǎng)絡(luò)爬蟲研究[D].武漢:中國地質(zhì)大學(xué)(武漢),2013.

[5] 杜鵬輝,仇繼揚,彭書濤,等.基于Scrapy的網(wǎng)絡(luò)爬蟲的設(shè)計與實現(xiàn)[J].電子設(shè)計工程,2019,27(22):120-123,132.

[6] 溫佐承,侯帥.基于Python的網(wǎng)絡(luò)爬蟲設(shè)計與實現(xiàn)[J].電腦編程技巧與維護,2020(7):21-23,42.

[7] 柴喚友,劉三女牙,康令云,等.教育大數(shù)據(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é)報(工學(xué)版),2014,48(6):957-972.

【通聯(lián)編輯:代影】

猜你喜歡
網(wǎng)絡(luò)爬蟲數(shù)據(jù)采集大數(shù)據(jù)
煉鐵廠鐵量網(wǎng)頁數(shù)據(jù)獲取系統(tǒng)的設(shè)計與實現(xiàn)
鐵路客流時空分布研究綜述
基于廣播模式的數(shù)據(jù)實時采集與處理系統(tǒng)
軟件工程(2016年8期)2016-10-25 15:54:18
通用Web表單數(shù)據(jù)采集系統(tǒng)的設(shè)計與實現(xiàn)
軟件工程(2016年8期)2016-10-25 15:52:53
基于開源系統(tǒng)的綜合業(yè)務(wù)數(shù)據(jù)采集系統(tǒng)的開發(fā)研究
基于大數(shù)據(jù)背景下的智慧城市建設(shè)研究
科技視界(2016年20期)2016-09-29 10:53:22
基于社會網(wǎng)絡(luò)分析的權(quán)威網(wǎng)頁挖掘研究
主題搜索引擎中網(wǎng)絡(luò)爬蟲的實現(xiàn)研究
淺析如何應(yīng)對網(wǎng)絡(luò)爬蟲流量
中國市場(2016年23期)2016-07-05 04:35:08
台南市| 和平县| 通榆县| 永泰县| 嘉义市| 内黄县| 宣武区| 娄底市| 鄂温| 栾川县| 长武县| 靖江市| 临沭县| 景宁| 赤城县| 长泰县| 霍山县| 资溪县| 通江县| 丰都县| 信宜市| 万载县| 二手房| 华池县| 夹江县| 衢州市| 库尔勒市| 喜德县| 宝应县| 雷波县| 丽水市| 麻栗坡县| 贵定县| 吉林省| 尼木县| 乌海市| 罗江县| 罗平县| 德阳市| 枣阳市| 万年县|