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

?

新冠肺炎疫情信息累積更新采集系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)

2021-06-18 07:27馬樂(lè)榮
關(guān)鍵詞:網(wǎng)頁(yè)頁(yè)面衛(wèi)生

王 君,馬樂(lè)榮

(延安大學(xué) 數(shù)學(xué)與計(jì)算機(jī)科學(xué)學(xué)院,陜西 延安 716000)

新型冠狀病毒(2019-nCov)[1]是一類具有囊膜、基因組為線性單股正鏈的RNA病毒,是自然界廣泛存在的一大類病毒[2]。該病毒在爆發(fā)前期,感染人數(shù)迅速上升,病毒在感染者身上會(huì)有一定時(shí)間的潛伏期,在此期間容易傳染到接觸者。由于新冠肺炎疫情在武漢的集中爆發(fā),并迅速向全國(guó)各地蔓延,各省(自治區(qū)、直轄市)衛(wèi)生健康委員會(huì)每天定時(shí)發(fā)布前一天的疫情相關(guān)數(shù)據(jù),包括新增確診病例、累計(jì)確診病例、新增出院病例等,為人們的生活、出行、工作提供信息支持。

盡管也有一些平臺(tái)收集資料并進(jìn)行發(fā)布,但是想要第一時(shí)間獲取數(shù)據(jù)最好的方式還需要在官網(wǎng)上進(jìn)行查看。如果采用人工的方式收集數(shù)據(jù),由于數(shù)據(jù)量龐大,這會(huì)花費(fèi)大量時(shí)間,而且會(huì)存在手工整合數(shù)據(jù)錯(cuò)誤的問(wèn)題。因網(wǎng)絡(luò)平臺(tái)不同、數(shù)據(jù)格式不同,且數(shù)據(jù)每日都在更新,這樣給及時(shí)獲取數(shù)據(jù)帶來(lái)了巨大的挑戰(zhàn)。數(shù)據(jù)是分析、可視化、預(yù)測(cè)的基礎(chǔ),第一時(shí)間獲取數(shù)據(jù)可以更方便的顯示疫情數(shù)據(jù)的變化,了解國(guó)家對(duì)疫情把控的及時(shí)性。因此,本文使用Python語(yǔ)言、Scrapy庫(kù)爬蟲庫(kù)和MongoDB[3]數(shù)據(jù)庫(kù),設(shè)計(jì)并實(shí)現(xiàn)了新冠肺炎疫情信息累積更新采集系統(tǒng)。該系統(tǒng)能對(duì)不同的網(wǎng)頁(yè)結(jié)構(gòu)采取不同的獲取數(shù)據(jù)策略,并采用正則表達(dá)式對(duì)獲取的文本進(jìn)行數(shù)據(jù)清洗。實(shí)驗(yàn)結(jié)果表明,該系統(tǒng)具有良好的性能,并可推廣使用。

1 實(shí)驗(yàn)設(shè)計(jì)

國(guó)家衛(wèi)生健康委員會(huì)和31個(gè)省(自治區(qū)、直轄市)衛(wèi)生健康委員會(huì)網(wǎng)站上設(shè)有疫情通報(bào)欄目,點(diǎn)擊后會(huì)出現(xiàn)當(dāng)日以前每一天的疫情情況。本文需要獲取上述網(wǎng)頁(yè)中新增確診病例、新增疑似病例、新增出院病例、新增死亡病例和以上四項(xiàng)累計(jì)病例及累計(jì)報(bào)告病例、累計(jì)追蹤密切接觸者、尚在接受醫(yī)學(xué)觀察人數(shù)。

1.1 頁(yè)面分析

在對(duì)網(wǎng)站頁(yè)面進(jìn)行爬取時(shí),首先要對(duì)網(wǎng)頁(yè)進(jìn)行分析,各省(區(qū)、市)的網(wǎng)頁(yè)結(jié)構(gòu)不一樣,內(nèi)容上有的網(wǎng)站不僅包括了疫情情況而且還有當(dāng)?shù)氐恼吆屯ㄖ?。結(jié)構(gòu)上有js動(dòng)態(tài)加載內(nèi)容,如吉林省衛(wèi)生健康委員會(huì)疫情發(fā)布網(wǎng)頁(yè)下一頁(yè)按鈕用js動(dòng)態(tài)加載,福建省衛(wèi)生健康委員會(huì)疫情發(fā)布網(wǎng)頁(yè)統(tǒng)一在一個(gè)網(wǎng)址下,浙江省衛(wèi)生健康委員疫情發(fā)布網(wǎng)頁(yè)存在重定向問(wèn)題。各網(wǎng)站發(fā)布的內(nèi)容格式不同,如新增出院病人多少例和新增出院多少例,當(dāng)出現(xiàn)境外輸入病例時(shí),累計(jì)確診人數(shù)描述格式出現(xiàn)了變化。如陜西省衛(wèi)生健康委員會(huì)網(wǎng)站對(duì)于新增病例出現(xiàn)過(guò)以下描述:新增**例新型冠狀病毒感染的肺炎確診病例,新增**例新冠肺炎確診病例;對(duì)于累計(jì)確診人數(shù)出現(xiàn)過(guò)以下描述:累計(jì)報(bào)告新冠肺炎確診病例**例,累計(jì)報(bào)告本地確診病例**例。

1.2 算法設(shè)計(jì)

圖1是實(shí)驗(yàn)對(duì)應(yīng)的程序流程圖。

(1)首先訪問(wèn)start_urls中的地址。

(2)獲取需要的每日疫情數(shù)據(jù)頁(yè)面page_url,疫情通報(bào)欄目可能存在其他通知內(nèi)容,在獲取url時(shí)需要進(jìn)行判別。

(3)如果未訪問(wèn)過(guò),程序繼續(xù)執(zhí)行,如果訪問(wèn)過(guò)單條page_url,該地址不再訪問(wèn),程序訪問(wèn)下一條page_url。

(4)訪問(wèn)數(shù)據(jù)詳情頁(yè),獲取疫情相關(guān)的數(shù)據(jù)。

(5)將數(shù)據(jù)存入到數(shù)據(jù)庫(kù)。

(6)start_urls如果完成訪問(wèn),則程序結(jié)束。否則繼續(xù)(2)—(6)步驟。

1.3 數(shù)據(jù)篩選

每個(gè)網(wǎng)頁(yè)爬蟲爬取到的內(nèi)容是包含所需數(shù)據(jù)的文本,不能直接使用,文本中含有特殊字符等使文本格式不整齊的內(nèi)容,這就需要進(jìn)行篩選和判別哪些是需要的數(shù)據(jù)。實(shí)驗(yàn)使用正則表達(dá)式匹配所需的內(nèi)容,以鍵值對(duì)的形式對(duì)數(shù)據(jù)進(jìn)行清洗,如鍵為new_care(新增出院),值為人數(shù)。

2 采用技術(shù)

本實(shí)驗(yàn)中使用Python3.6作為編程語(yǔ)言,使用Scrapy框架對(duì)網(wǎng)頁(yè)數(shù)據(jù)進(jìn)行爬取,并用Splash對(duì)頁(yè)面中的JavaScript進(jìn)行渲染,選擇MongoDB數(shù)據(jù)庫(kù)進(jìn)行數(shù)據(jù)的存儲(chǔ)。圖2描述了系統(tǒng)組件圖。

圖2 系統(tǒng)組件圖

2.1 組件介紹

Python是一門跨平臺(tái)、開(kāi)源、免費(fèi)的解釋性高級(jí)動(dòng)態(tài)通用編程語(yǔ)言[4],支持面向?qū)ο蟪绦蛟O(shè)計(jì),有大量在各領(lǐng)域可以調(diào)用的軟件包。

Scrapy是一種用于抓取網(wǎng)站和提取結(jié)構(gòu)化數(shù)據(jù)的應(yīng)用程序框架[5],是基于Python實(shí)現(xiàn)的。Scrapy帶有的選擇器可以讓用戶通過(guò)xpah或者css選擇器從網(wǎng)頁(yè)中選擇和提取數(shù)據(jù)[6]。提供了交互式的終端命令方式,可以用于提取數(shù)據(jù)的測(cè)試。它的middlewares.py可以按照實(shí)際需求定義自己的中間件,實(shí)用性強(qiáng)。

Splash可用于爬取動(dòng)態(tài)網(wǎng)頁(yè),通過(guò)渲染JavaScript實(shí)現(xiàn)對(duì)網(wǎng)頁(yè)的解析,Splash可以很好與Scrapy結(jié)合,經(jīng)過(guò)渲染后可以直接用Scrapy分析網(wǎng)頁(yè)。它需要在Docker中運(yùn)行,使用時(shí)需要下載Scrapy-Splash庫(kù)。

MongoDB數(shù)據(jù)庫(kù)是介于關(guān)系數(shù)據(jù)庫(kù)和非關(guān)系數(shù)據(jù)庫(kù)之間的數(shù)據(jù)庫(kù),具備兩者的某些有用的功能[3]。它由C++語(yǔ)言編寫,是基于分布式文件存儲(chǔ)的數(shù)據(jù)庫(kù)。

2.2 技術(shù)實(shí)現(xiàn)要點(diǎn)

做實(shí)驗(yàn)之前首先要搭建好環(huán)境并進(jìn)行測(cè)試。實(shí)驗(yàn)中創(chuàng)建新Python環(huán)境存放需要的第三方Python庫(kù)。安裝Python庫(kù)若出現(xiàn)異常無(wú)法成功下載,可以考慮選擇國(guó)內(nèi)鏡像進(jìn)行下載,文獻(xiàn)[7]中列有常見(jiàn)的Python鏡像站。關(guān)于Scrapy-Splash庫(kù)安裝時(shí)需要首先安裝Docker容器,對(duì)于Windows系統(tǒng),Windows7和Windows8采用Docker Toolbox來(lái)安裝,Windows10采用Docker Hub方式安裝。

對(duì)于網(wǎng)絡(luò)結(jié)構(gòu)的不同,數(shù)據(jù)獲取方式主要分為兩大類:一類是不需要使用Scrapy-Splash進(jìn)行渲染,可以直接進(jìn)行獲??;另一類是需要Scrapy-Splash預(yù)渲染。由于瀏覽器中的部分?jǐn)?shù)據(jù)是通過(guò)js動(dòng)態(tài)加載出來(lái)的,如果直接使用Scrapy的Response獲取數(shù)據(jù),會(huì)得到一個(gè)空的列表。經(jīng)過(guò)Scrapy-Splash的SplashRequest對(duì)象,由Splash訪問(wèn)對(duì)象的頁(yè)面后返回渲染之后的頁(yè)面,在這一類問(wèn)題中存在需要用Scrapy-Splash進(jìn)行分頁(yè)。部分網(wǎng)頁(yè)存在重定向到第一頁(yè)的問(wèn)題,可以用js方式模擬鼠標(biāo)點(diǎn)擊解決。

3 關(guān)鍵問(wèn)題及解決方案

本部分列舉實(shí)驗(yàn)中遇到的問(wèn)題及解決方案,總結(jié)如下:

問(wèn)題1:代碼沒(méi)有編輯錯(cuò)誤和運(yùn)行錯(cuò)誤,無(wú)法獲取數(shù)據(jù)

這類問(wèn)題的原因是網(wǎng)頁(yè)是由js動(dòng)態(tài)加載的,雖然在網(wǎng)頁(yè)中可以查看到數(shù)據(jù),但當(dāng)查看源文件時(shí)搜索不到數(shù)據(jù)。解決辦法是使用Scrapy-Splash對(duì)網(wǎng)頁(yè)進(jìn)行渲染。如果在Windows10系統(tǒng)上使用Docker toolbox方式安裝,打開(kāi)Docker Quickstart啟動(dòng)Docker Toolbox會(huì)出錯(cuò);如果Windows10系統(tǒng)安裝方式Docker不帶有專門的命令終端,直接使用Windows系統(tǒng)的命令提示符運(yùn)行命令docker pull scrapinghub/splash,下載鏡像完成后使用命令docker run-it-p8050:8050--rm scrapinghub/splash,啟動(dòng)Splash服務(wù)。

問(wèn)題2:網(wǎng)頁(yè)中點(diǎn)擊下一頁(yè),瀏覽器url地址不變

這類問(wèn)題是由于實(shí)驗(yàn)中只有第一頁(yè)的url地址,所以無(wú)法獲取后面頁(yè)面的信息。解決辦法是在Splash的參數(shù)lua_source中模擬手動(dòng)點(diǎn)擊操作,第一頁(yè)的后面頁(yè)面都以第一頁(yè)為基礎(chǔ),比如第二頁(yè)在第一頁(yè)的基礎(chǔ)上模擬點(diǎn)擊第一頁(yè)一次,第三頁(yè)在第一頁(yè)的基礎(chǔ)上模擬點(diǎn)擊第一頁(yè)兩次,依次類推。由于Splash使用的是LUA語(yǔ)言,開(kāi)啟Splash服務(wù)后可以在本地瀏覽器上先進(jìn)行測(cè)試。

問(wèn)題3:如何判定某條頁(yè)面數(shù)據(jù)是否抓取過(guò)

如果存在有重復(fù)數(shù)據(jù),一是會(huì)增加數(shù)據(jù)庫(kù)存儲(chǔ)量,二是爬取效率不高。本實(shí)驗(yàn)嘗試過(guò)三種方式。第一種是實(shí)驗(yàn)開(kāi)始時(shí)首先查詢數(shù)據(jù)庫(kù),以json格式保存爬取過(guò)所有的url,json的名稱是城市的拼音,值是城市對(duì)應(yīng)爬過(guò)的url,其次每獲取到一個(gè)url與json文件的url進(jìn)行比對(duì),如果存在則不繼續(xù)獲取數(shù)據(jù),反之程序繼續(xù)運(yùn)行,這種方式的好處是每次程序開(kāi)始只需要訪問(wèn)一次數(shù)據(jù)庫(kù);第二種是每次獲取到一個(gè)url都與數(shù)據(jù)庫(kù)進(jìn)行比對(duì);第三種方式是采取多布隆過(guò)濾器進(jìn)行url去重。多布隆過(guò)濾器的基本思想是:有一個(gè)固定長(zhǎng)度的列表,初始時(shí)每個(gè)位置都為0,有多個(gè)哈希函數(shù),每個(gè)哈希函數(shù)將一個(gè)元素映射到列表中的一個(gè)位置,并將該位置置為1,如果某個(gè)位置為1,我們就可以知道集合中有該元素。文獻(xiàn)[7]中使用到了多布隆過(guò)濾器進(jìn)行url去重。

4 實(shí)驗(yàn)結(jié)果

本次實(shí)驗(yàn)以國(guó)家衛(wèi)生健康委員會(huì)和31個(gè)省(自治區(qū)、直轄市)衛(wèi)生健康委員會(huì)官網(wǎng)發(fā)布的疫情通告欄目為數(shù)據(jù)采集對(duì)象。針對(duì)不同網(wǎng)頁(yè)的結(jié)構(gòu)采取不同的策略,不同的網(wǎng)絡(luò)結(jié)構(gòu)有JavaScript動(dòng)態(tài)渲染,包括福建、貴州、江蘇等省(區(qū)、市);浙江省疫情網(wǎng)頁(yè)下一頁(yè)會(huì)重定向到首頁(yè);福建省疫情網(wǎng)頁(yè)點(diǎn)擊下一頁(yè)后,瀏覽器url地址不變。采集每天數(shù)據(jù)并存入數(shù)據(jù)庫(kù)中,另外每條數(shù)據(jù)多加了當(dāng)天的日期、網(wǎng)頁(yè)地址和信息來(lái)源,增加信息來(lái)源的目的是方便后續(xù)核對(duì)。實(shí)驗(yàn)從2020年2月初開(kāi)始,系統(tǒng)第一次從31個(gè)省(自治區(qū)、直轄市)衛(wèi)生健康委員會(huì)官網(wǎng)累計(jì)獲取總共約460條數(shù)據(jù),之后實(shí)驗(yàn)每天訪問(wèn)官網(wǎng)疫情頁(yè)面,程序自動(dòng)判斷哪些是新發(fā)布的數(shù)據(jù),哪些是已經(jīng)訪問(wèn)并存入數(shù)據(jù)庫(kù)中的數(shù)據(jù),實(shí)驗(yàn)只獲取當(dāng)天網(wǎng)上發(fā)布的數(shù)據(jù),累計(jì)更新存入數(shù)據(jù)庫(kù)中。對(duì)每個(gè)省(區(qū)、市)各自爬取約90條數(shù)據(jù),總計(jì)爬蟲2936條數(shù)據(jù)。最終訪問(wèn)數(shù)據(jù)庫(kù)將各省(區(qū)、市)每天的數(shù)據(jù)保存為csv文件格式,以便后續(xù)的查閱和數(shù)據(jù)處理。

5 結(jié)論

本文以國(guó)家衛(wèi)生健康委員會(huì)和31個(gè)省(自治區(qū)、直轄市)衛(wèi)生健康委員會(huì)官網(wǎng)上發(fā)布的疫情通告為采集對(duì)象,給出了一種獲取數(shù)據(jù)的有效方式,將采集的數(shù)據(jù)存入到數(shù)據(jù)庫(kù)中,并且以csv文件方式單獨(dú)存放每個(gè)省(區(qū)、市)的數(shù)據(jù)到本地文件中。實(shí)驗(yàn)證明該系統(tǒng)可以有效的針對(duì)不同網(wǎng)頁(yè)結(jié)構(gòu)采集到數(shù)據(jù),清洗后的數(shù)據(jù)可以直接應(yīng)用到后續(xù)工作,包括數(shù)據(jù)可視化、趨勢(shì)預(yù)測(cè)等。

猜你喜歡
網(wǎng)頁(yè)頁(yè)面衛(wèi)生
刷新生活的頁(yè)面
答案
基于HTML5與CSS3的網(wǎng)頁(yè)設(shè)計(jì)技術(shù)研究
智取紅領(lǐng)巾
讓W(xué)ord同時(shí)擁有橫向頁(yè)和縱向頁(yè)
基于HTML5靜態(tài)網(wǎng)頁(yè)設(shè)計(jì)
搜索引擎怎樣對(duì)網(wǎng)頁(yè)排序
衛(wèi)生歌
講衛(wèi)生
網(wǎng)頁(yè)智能搜索數(shù)據(jù)挖掘的主要任務(wù)
河间市| 泰州市| 黄大仙区| 家居| 房产| 昌乐县| 时尚| 资兴市| 宁乡县| 祁门县| 平南县| 苗栗县| 临沭县| 莱西市| 武鸣县| 永胜县| 永嘉县| 荣昌县| 佛冈县| 洛阳市| 锡林郭勒盟| 远安县| 克东县| 武威市| 惠来县| 博兴县| 绍兴市| 蓬溪县| 汾阳市| 广宁县| 平安县| 芦溪县| 蓬安县| 新巴尔虎右旗| 成都市| 潞西市| 阳泉市| 炎陵县| 青浦区| 太谷县| 灵川县|