999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

基于Scrapy的水利數據爬蟲設計與實現

2020-07-09 21:53:20游攀利楊琳喻淼
水利水電快報 2020年5期
關鍵詞:數據采集

游攀利 楊琳 喻淼

摘要:為解決目前各級水利部門數據共享能力弱、數據格式不統一的問題,建立了一種水利數據整合方法。針對互聯網公開的水利數據特點,結合水利行業標準規范,介紹了基于Scrapy框架設計和開發的水利數據爬蟲,并規范化存儲數據。在總結各種水利數據的獲取和解析原理及方法基礎上,提出了使用Scra-pyd部署爬蟲和SpiderKeeper管理爬蟲的方法,并成功應用于長江大數據中心的建設,為水雨情預警、防汛抗旱、應急管理提供了重要支持。

關鍵詞:水利數據;網絡爬蟲;Scrapy;數據采集

中圖法分類號:TP391

文獻標志碼:A

DOI:10. 15974/j .cnki.slsdkb.2020.05.014

水利信息化經過多年的發展,全國各水利廳局及流域機構積累了大量的水利數據,包括水雨情數據、水質數據、水澇災害數據、遙感數據、防汛抗旱知識和應急管理知識等,這些數據可為防汛抗旱決策支持、水利工程建設、水文水資源研究等提供重要支持[1]。然而,水利數據分散在各水利機構內,結構復雜、種類繁多,即便是同一種類的業務數據,數據結構也有所差異,阻礙了水利數據的開發、利用與研究。因此,本文從各水利政務網站的公開數據人手,結合水利部發布的數據庫規范設計數據庫表,以水雨情數據為例,基于爬蟲框架Scrapy設計和開發水利爬蟲,著重介紹了各種水雨情網頁的獲取和解析過程,包括Scrapy Selector CSS選擇器解析HTML結構數據、正則表達式解析JavaScript數據、獲取和解析Ajax數據、Selenium結合瀏覽器驅動解析網頁加密數據等;并對爬取的數據進行規范化存儲,最后使用SpiderKeeper對分布于不同服務器的爬蟲進行統一管理。

1 網絡爬蟲

網絡爬蟲( web crawler),又稱作網絡機器人(web robot)或網絡蜘蛛(web spider),是以一定的規則自動抓取互聯網資源的計算機應用程序[2]。網絡爬蟲通常由調度器( scheduler)、下載器(download-er)、解析器(parser)、待爬行隊列(URL queue)4個部分組成,如圖1所示[3-4]。調度器首先將設定的初始URL傳遞給下載器,下載器從互聯網下載信息并傳給解析器,解析器根據既定規則提取信息和待爬取的URL,提取的信息經處理后存人數據庫或文件,URL經去重后傳輸給待爬行隊列.等待調度器調用,循環往復[5-7]。

網絡爬蟲分為通用( General Purpose)網絡爬蟲和聚焦(Focused)網絡爬蟲[8]。通用網絡爬蟲又稱作全網爬蟲,爬取整個互聯網資源以供搜索引擎建立索引;聚焦網絡爬蟲又稱作主題網絡爬蟲,爬取用戶需要的特定主題網頁(經相關網站許可)收集數據,并在標注出處的前提下加以數據分析、用于建模及展示。水雨情爬蟲為聚焦網絡爬蟲,目標是爬取各級水利部門網站公開的水雨情信息。

網絡爬蟲技術伴隨著搜索引擎共同發展,在網絡爬蟲發展初期,開發者需考慮很多底層功能的實現,例如,模擬HTTP請求、下載網頁、解析數據、隊列管理等。搜索引擎面對的問題日趨復雜,促使爬蟲程序的編寫難度越來越大。為了提高爬蟲的編寫效率,逐漸出現了網絡請求庫urllib、urllib2、re-quests等和解析庫Xpath、Beautiful Soup、pyquery等,進而抽象出模塊的概念,有了爬蟲框架的雛形。此時,開發者雖不需考慮這些常用模塊的實現,但仍需考慮爬蟲的流程、異常處理及任務調度等。對于今后進一步出現的pyspider、scrapy等爬蟲框架,開發者只需考慮爬蟲的業務邏輯部分。而且,pyspi-der、scrapy的可配置性更高,異常處理能力更強,故水利數據采集系統采用scrapy作為爬蟲框架。

2 Scrapy框架

Scrapy是使用Python語言實現的一種爬蟲框架,它將網絡爬蟲工程化、模塊化,幫助開發人員方便地構建網絡請求、解析網頁響應,從而快速實現特定業務的爬蟲[8-9]。Scrapy基于Twisted異步網絡庫處理網絡通訊,實現了分布式爬取。

2.1 Scrapy組件

Scrapy爬蟲框架結構如圖2所示[10],包括以下6個主要組件:

(1)Scrapy引擎(engine)。負責控制數據在組件中流動,并在相應動作發生時觸發事件,是整個框架的核心。

(2)調度器。從Scrapy引擎接受請求,并將其加入到隊列中,以便之后請求它們時提供。

(3)下載器。接受請求,負責獲取數據并提供給引擎,而后提供給爬蟲。

(4)爬蟲。用戶編寫的針對特定業務的爬蟲程序,定義了初始請求網址、網頁的爬取邏輯和解析規則,用于發起初始請求和解析返回的數據并提取項目(Item,定義了爬取結果的數據結構,可對應web開發中的實體類)和生成新的請求,每個爬蟲負責處理某個特定或一些網站。

(5)項目管道(Item Pipeline)。負責處理爬蟲提取出來的項目,典型的處理有數據清洗、驗證數據完整性、數據重復及數據持久化(例如按指定格式保存到文件或存取到數據庫中)。

(6)中間件(middleware)。包括下載器中間件( downloader middleware)和爬蟲中間件(spider mid-dleware)。下載器中間件是在引擎與下載器之間的特定鉤子( specific hook),主要處理引擎發過來的請求,用戶可編寫程序擴展Scrapy的功能,以自定義的方式協調下載器的工作;爬蟲中間件是在引擎與爬蟲之間的特定鉤子,處理爬蟲的輸入響應(response)和輸出條目及請求。同下載器中間件一樣,用戶可擴展Scrapy功能,以協調爬蟲工作。

2.2 Scrapy數據流

Scrapy的數據流向是由引擎控制的,數據流動的過程如下:

(1)引擎找到處理該網站的爬蟲,向爬蟲請求初始要爬取的URL,根據URL解析域名。

(2)引擎從爬蟲中獲取到第一個要爬取的URL,并通過調度器以請求的形式調度。

(3)引擎向調度器請求下一個要爬取的URL。

(4)調度器返回下一個要爬取的URL給引擎,引擎將URL通過下載器中間件轉發給下載器。

(5)-旦頁面下載完畢,下載器生成該頁面的響應,并將其通過下載器中間件發送給引擎。

(6)引擎從下載器處接收到響應,并通過爬蟲中間件發送給爬蟲處理。

(7)爬蟲處理響應,解析數據并封裝成條目,返回條目及新的請求給引擎。

(8)引擎將爬蟲返回的條目給項目管道處理,將新的請求加入到調度器的待爬隊列中。

(9)重復步驟(2)~(8),直到調度器中沒有請求,待爬隊列為空,或者滿足自定義的停止條件,引擎則關閉該網站,爬行結束。

通過多個組件的分工協作、組件對異步處理的支持,Scrapy充分利用了帶寬,提高了數據爬取效率。

3 水雨情爬蟲設計

3.1 網頁獲取

爬蟲設計的首要工作即是得到獲取目標數據的網絡請求。訪問水雨情網頁,查看網頁的源代碼會發現,其中可能根本不存在水雨情數據,這是因為現在很多網頁是由JavaScript渲染出來,原始的HTML代碼可能只是一個僅有水雨情表頭的表格。向網站發送一個HTTP請求,返回的就是網頁源代碼。綜合分析各級水利部門網站公開的水雨情網頁,存在以下幾種情況。

(1)網頁源代碼中的HTML代碼包含目標數據,該網頁的URL就是獲取目標數據的URL;

(2)網頁源代碼中的JavaScript代碼包含目標數據,該網頁的URL就是獲取目標數據的URL;

(3)網頁源代碼不包含目標數據,通過Ajax加載數據渲染網頁,Ajax請求的URL即是獲取目標數據的URL;

(4)網頁源代碼不包含目標數據,通過JavaS-cript算法生成數據渲染網頁,該網頁的URL即是獲取目標數據的URL;

(5)網頁源代碼不包含目標數據,網頁數據被加密,該網頁的URL即是獲取目標數據的URL;

(6)網頁源代碼不包含目標數據,而是使用if-rame嵌入另一個HTML網頁展示數據,這種情況下,為了確認獲取目標數據的URL,需再次分析,以確定是上述(1)~(5)中的哪種情況。

3.2 數據解析

確定獲取目標數據的URL之后,使用Scrapy模擬HTTP請求,對返回的響應數據進行解析。根據響應的不同,解析方式也不同。對于3.1節中的情況(l),需要解析的是HTML結構數據,使用Scrapy的Selector CSS選擇器進行解析;對于情況(2),由于JavaScript數據不是結構化的,通常使用正則表達式進行解析;對于情況(3),需要解析的是JSON數據;對于情況(4)和(5),通常JavaScript的算法規律并不容易找到,即使找到,花費的時間代價太大,若網頁數據加密,分析難度更大,所以這兩種情況通常采用Selenium或PhantomjS來驅動瀏覽器加載網頁,直接獲得JavaScript渲染后的網頁,做到“可見即可爬”,接下來解析HTML結構數據即可,與(1)的解析方式相同[11]。對于情況(6),iframe嵌入網頁的數據解析,只需分析iframe嵌入的網頁源代碼即可,后續步驟與(1)~(5)相同。具體的數據解析如下。

(1)HTML結構數據解析。以重慶水利水務網“水文管理”模塊下的“今日八時水情”(URL為http: //slj .cq.gov.cn/swxx/jrbssq/Pages/Default.aspx)為例,如圖3所示。查看源代碼,發現目標數據已包含在HTML代碼結構中,可利用CSS選擇器進行解析。例如使用Scrapy shell提取寸灘和武隆水文站的水位數據,可分別使用如下代碼進行提取,如圖4所示。

需要注意的是,由于代表站占據了第2行的第1列,所以寸灘的水位數據在第2行的第5列,而武隆的水位數據在第4行的第4列。

(2)JavaScript數據解析。以長江水文網的“實時水情”(http://www.cjh.com.cn/)為例,如圖5所示。分析網頁的源代碼,目標數據是通過標簽嵌入的URL(http://www.cjh.com.cn/sqindex.html)加載的,分析此HTML的源代碼,發現目標數據包含在Ja-vaScript代碼中(見圖6),其作為一個JSON字符串賦值給了一個JS變量,這種情況使用正則表達式獲取目標數據最為方便,如圖7所示。

(3)Ajax數據解析。以湖北省水利廳網站的“水旱災害防御”模塊的“江河水情”欄目(http://113.57.190.228: 8001/web/Report/RiverReport)為例,該欄目展示了湖北省56個河道水文站當天08:00的水位、流量信息,如圖8所示。目標是從表格中解析出實時數據(水位、流量)和防洪指標數據(設防水位、警戒水位和歷史最高水位),查看江河水情網頁的源代碼發現表格中并沒有相關數據。打開Chrome開發工具.選擇Network選項卡,通過XHR篩選出Ajax請求,選定請求,點擊Headers可查看請求和響應的頭部詳情。分析可知,請求類型為GET,請求URL為http://113.57.190.228: 8001/Web/Report/GetRiverData? date=2019-11-11+08%3AOO,請求的參數只有1個date,參數值經過了HTML URL編碼,表示的是ASCII字符“:”,所以真實的參數值為:2019-10-30 08:00。據此,可以使用Scrapy模擬Ajax請求,如需獲取歷史數據,只需要按照一定規則改變date參數即可。點擊Preview可預覽返回的JSON數據,如圖9所示,對照網頁數據可知每個字段的業務意義。

(4)加密網頁數據解析。以江蘇水情信息(http://221.226.28.67:88/jsswxxSSI/Web/Default.ht-ml? m=2)為例,使用如圖10所示代碼即可獲取表格數據。后續使用HTML結構數據解析方法即可,不再贅述。

3.3 爬取對象定義

Scrapy的條目類用來定義爬取的對象。綜合分析各級水利部門網站公開的河道水情信息,并結合水利部發布的SL323-2001《實時水雨情數據庫表結構與標識符》數據庫規范,對于河道水文站爬蟲,用StRiverltem定義爬取對象,需定義的屬性有:測站編碼、時間、測站名稱、河流名稱、水位、流量、設防水位、警戒水位、保證水位和歷史最高水位。

3.4 數據存儲

爬蟲將解析的數據封裝成條目之后交給項目管道,進行數據持久化。數據持久化的方式有多種,可直接本地化存儲為文件,如TXT、CSV、JSON等,也可保存至Oracle、MySQL等關系型數據庫或者MongoDB、Redis等非關系型數據庫。本文采用MySQL,根據爬蟲對象StRiverltem設計河道水情數據表結構,如表1所示。

爬取的數據保存至MySQL數據庫,結果如圖11所示。

3.5 異常處理

爬蟲執行一段時間后,可能會出現“403 Forbid-den”的錯誤,這是因為IP訪問頻率過高,網站采取了反爬措施,檢測到某個IP單位時間內訪問次數超過某個設定的閾值,就會拒絕服務。解決辦法包括使用代理和降低訪問頻率,鑒于水利數據每天更新數量不多,可采用降低訪問頻率辦法采集歷史數據,在采集一個時間段的數據后,程序停頓1-2 s。如果采集的是實時數據,水文網站每天更新的數據量并不多,通常不會出現訪問頻率過高的問題。

網站反爬的措施還包括登錄、驗證碼和返回動態網頁等。水雨情等水利數據通常是公開的,無需登陸和輸入驗證碼即可訪問。如果確有登錄和驗證碼的要求,需在爬蟲業務邏輯內增加登陸模塊,并使用圖象識別或接入打碼平臺進行驗證碼識別,成功登陸后獲取cookies信息再對數據進行處理。若服務器返回的是動態網頁,使用前述Selenium進行處理,不再贅述。

4 系統部署

在完成Scrapy爬蟲程序的編寫和測試之后,將其部署在Scrapyd服務器中。Scrapyd是由Scrapy官方提供的用于部署Scrapy爬蟲的服務,用戶可通過它提供的HTTP JSON API控制爬蟲。Scrapyd本身提供了一個簡單的UI界面,用戶使用任何1臺能連接到Scrapyd服務器的計算機即可上傳、啟動、停止爬蟲并查看運行日志,而不必登錄到Scrapyd服務器。但是,這個界面過于簡單,且1臺Scrapyd服務器僅有1個界面,多臺即有多個界面,不能進行統一管理。

水利數據涉及主題非常多,對應的爬蟲數量很大。為了提高爬蟲的性能,通常將不同業務的爬蟲部署在不同的Scrapyd服務器上。為了實現對爬蟲的統一管理,要使用SpiderKeeper和Scrapyweb,兩者均可實現一鍵部署和定時任務,都是對Scrapyd提供的接口的二次封裝。SpiderKeeper是一款可擴展的爬蟲服務可視化管理工具,可快速向多個Scrapyd服務器部署爬蟲,監控爬蟲執行情況,通過儀表盤管理爬蟲,并定制運行策略。Scrapyweb比SpiderKeep-er功能更豐富(例如異常情況郵件通知),但穩定性不及SpiderKeeper,SpiderKeeper可以應付大規模的爬蟲集群。本文采用SpiderKeeper對爬蟲進行統一管理。

使用SpiderKeeper設置爬蟲分兩步,首先創建一個條目,然后添加1個定時任務,如圖12所示。1個爬蟲對應1個定時任務,定時策略又根據業務數據的發布情況決定,如圖13所示。完成對所有爬蟲的設置之后,可對爬蟲進行關閉、運行一次和刪除操作,如圖14所示。

5 結語

本研究基于Scrapy的水利數據爬取,以水雨情為例,將各水利廳局及流域機構公開的水雨情數據解析分為HTML結構數據、JavaScript數據、Ajax數據和加密數據4類。詳細介紹了解析方法和原理,并將提取到的水雨情數據進行規范化存儲,可為水利一張圖和使用大數據方法研究水雨情預警、防汛抗旱、應急管理提供數據支持。

參考文獻:

[1] 張馳恒一.基于多數據源的水利數據獲取及大數據服務[D].西安:西安理工大學,2018.

[2]Castillo C.Effective web crawling[Jl. ACM SIGIR Fo- rum, 2005 .39(1): 55-56.

[3]劉金紅,陸余良.主題網絡爬蟲研究綜述[J].計算機應用研究,2007,24(10):26-29.

[4]周德懋,李舟軍.高性能網絡爬蟲:研究綜述[J].計算機科學,2009,36(8):26-29.

[5]于娟,劉強.主題網絡爬蟲研究綜述[J]計算機工程與科學,2015,37(2):231-237.

[6]Rungsawang A,Angkawattanawit N.Learnable Lopic-spe-cific web crawler[J].Journal of Network&Computer Ap-plications, 2005, 28(2): 97-114.

[7] Kozanidis L.An Ontology-Based Focused Crawler[Cl//Intemational Conference on Natural Language and Infor-mation Systems: Applications of Natural Language to In-formation Systems. Springer-Verlag, 2008: 376-379.

[8]李喬宇,尚明華,王富軍,等.基于Scrapy的農業網絡數據爬取[J].山東農業科學報,2018,50(1):142-147.

[9] 馬聯帥.基于Scrapy的分布式網絡新聞抓取系統設計與實現[D].西安:西安電子科技大學,2015.

[10]

Scrapy developers. Scrapy Architecture overview[DB/OL].

https: //doc.scrapy.org/en/latest/topics/architecture. html, 2018。

[11]杜彬.基于Selenium的定向網絡爬蟲設計與實現[J]金融科技時代,2016(7):35-39.

(編輯:李慧)

作者簡介:游攀利,男,工程師,碩士,主要從水利信息化建設及軟件開發工作。E-mail: youpanli@cjwsjy.com.cn

猜你喜歡
數據采集
Web網絡大數據分類系統的設計與改進
CAN總線通信技術在電梯監控系統中的應用
基于大型嵌入式系統的污水檢測系統設計
社會保障一卡通數據采集與整理技巧
基于AVR單片機的SPI接口設計與實現
CS5463在植栽用電子鎮流器老化監控系統中的應用
大數據時代高校數據管理的思考
科技視界(2016年18期)2016-11-03 22:51:40
鐵路客流時空分布研究綜述
基于廣播模式的數據實時采集與處理系統
軟件工程(2016年8期)2016-10-25 15:54:18
通用Web表單數據采集系統的設計與實現
軟件工程(2016年8期)2016-10-25 15:52:53
主站蜘蛛池模板: 中文字幕啪啪| 日韩欧美视频第一区在线观看| 国产91视频免费观看| 五月婷婷精品| 国产精品免费入口视频| 国产精品人莉莉成在线播放| 超碰精品无码一区二区| 欧美色99| 亚洲国产日韩欧美在线| 亚洲最新在线| 亚洲精品第一在线观看视频| 国产乱人伦精品一区二区| 亚洲aaa视频| 这里只有精品在线| 国产在线视频导航| 无码高潮喷水专区久久| 久久久精品无码一二三区| 欧美午夜理伦三级在线观看| 美女潮喷出白浆在线观看视频| 亚洲日本一本dvd高清| 亚洲国产欧洲精品路线久久| 精品国产一区二区三区在线观看| 成人午夜久久| 国产精品手机在线播放| 波多野吉衣一区二区三区av| 国产乱肥老妇精品视频| 亚洲中文字幕av无码区| 中美日韩在线网免费毛片视频| 国产成人一区| 狠狠躁天天躁夜夜躁婷婷| 青草娱乐极品免费视频| 伊人丁香五月天久久综合| 直接黄91麻豆网站| 中文字幕日韩丝袜一区| 国产成人精品男人的天堂| 午夜精品一区二区蜜桃| 91久久国产综合精品| 麻豆精品在线| 欧美日韩理论| 精品小视频在线观看| 99热这里都是国产精品| 国产制服丝袜91在线| 伊人婷婷色香五月综合缴缴情| 另类重口100页在线播放| 成人免费视频一区| 国产三级精品三级在线观看| 国产拍揄自揄精品视频网站| 超碰91免费人妻| 国产精品人成在线播放| 精品1区2区3区| 精品自拍视频在线观看| 国产成人调教在线视频| 欧洲高清无码在线| 成人小视频在线观看免费| 色综合天天综合| 99中文字幕亚洲一区二区| 欧美成人A视频| a级毛片免费看| 香蕉久人久人青草青草| 99这里只有精品在线| 亚洲天堂色色人体| 欧美精品二区| 亚洲人成网站在线观看播放不卡| 天天干伊人| 欧美第一页在线| 久久国产亚洲偷自| 亚洲伊人电影| 无码aaa视频| aaa国产一级毛片| 亚洲日韩高清在线亚洲专区| 久久精品丝袜| 成人av专区精品无码国产| 久久精品嫩草研究院| 99er精品视频| 免费看美女自慰的网站| 91美女视频在线| 午夜无码一区二区三区在线app| 国产一区二区三区在线观看免费| 99久久精品免费看国产电影| 久久国产精品无码hdav| 久久久久夜色精品波多野结衣| 国产精品午夜电影|