朱梓熙,吳文慶
(廣東水利電力職業(yè)技術(shù)學(xué)院,廣東廣州 510635)
隨著人口老齡化趨勢(shì)的加快,社會(huì)養(yǎng)老、社會(huì)醫(yī)療、社會(huì)消費(fèi)、勞動(dòng)力結(jié)構(gòu)和農(nóng)村老齡問(wèn)題等正面臨前所未有的挑戰(zhàn),養(yǎng)老機(jī)構(gòu)養(yǎng)老正在成為養(yǎng)老方式的一個(gè)重要選擇之一,因此如何快速獲取養(yǎng)老機(jī)構(gòu)信息正是值得研究的問(wèn)題。目前多數(shù)人選擇養(yǎng)老機(jī)構(gòu)往往優(yōu)先考慮的是在網(wǎng)上進(jìn)行相關(guān)養(yǎng)老機(jī)構(gòu)信息的查閱,再到實(shí)地進(jìn)行查看,然而,網(wǎng)上養(yǎng)老機(jī)構(gòu)信息的雜亂使大家應(yīng)接不暇,不知如何下手。本文從養(yǎng)老機(jī)構(gòu)的數(shù)據(jù)自動(dòng)采集、處理和可視化等角度具體介紹實(shí)現(xiàn)方法,讓使用者免除其他信息和操作的干擾,直接看到最有價(jià)值的信息,以滿足使用者的需求。
爬蟲(chóng)就是對(duì)網(wǎng)站請(qǐng)求并提取數(shù)據(jù)的自動(dòng)化程序。其中,請(qǐng)求、提取和自動(dòng)化是爬蟲(chóng)的關(guān)鍵。使用統(tǒng)一資源定位符(uniform resource locator,URL)地址封裝必要的請(qǐng)求參數(shù),以模擬瀏覽器請(qǐng)求訪問(wèn) 網(wǎng)頁(yè)(WEB)服務(wù)器的方式,使用超文本傳輸協(xié)議(HTTP)獲取網(wǎng)站服務(wù)器端的許可,返回原始頁(yè)面并解析數(shù)據(jù)[1]。搜索引擎的網(wǎng)絡(luò)爬蟲(chóng)抓取工具屬于常見(jiàn)網(wǎng)絡(luò)爬蟲(chóng)。本文主要通過(guò)Python1一種廣泛使用的解釋型、高級(jí)編程、通用型編程語(yǔ)言。編寫(xiě)爬蟲(chóng)代碼,以獲取養(yǎng)老網(wǎng)站的數(shù)據(jù),然后對(duì)該數(shù)據(jù)進(jìn)行處理展示。
1.2.1 爬蟲(chóng)步驟
在爬蟲(chóng)的過(guò)程中需要對(duì)目標(biāo)網(wǎng)站(URL鏈接)及頁(yè)面進(jìn)行分析,以便決定要爬取的方式、內(nèi)容和所需要的操作方式。例如對(duì)養(yǎng)老網(wǎng)進(jìn)行養(yǎng)老機(jī)構(gòu)信息采集,通過(guò)對(duì)該養(yǎng)老網(wǎng)的分析,可以發(fā)現(xiàn)主要的養(yǎng)老機(jī)構(gòu)信息可在養(yǎng)老機(jī)構(gòu)查詢鏈接上進(jìn)行采集。本文使用Python來(lái)模擬瀏覽器,通過(guò)對(duì)該鏈接的訪問(wèn)獲取相關(guān)信息的文本,通過(guò)分析文本找到每個(gè)養(yǎng)老機(jī)構(gòu)信息的獨(dú)立鏈接,再通過(guò)依次訪問(wèn)每個(gè)養(yǎng)老機(jī)構(gòu)的獨(dú)立鏈接得到含有更詳細(xì)內(nèi)容的文本,以便我們進(jìn)行下一步操作。
1.2.2 養(yǎng)老網(wǎng)信息爬取
通過(guò)Python中的requests庫(kù)2requests庫(kù)是常用的http請(qǐng)求庫(kù),它使用python語(yǔ)言編寫(xiě),可以方便地發(fā)送http請(qǐng)求,以及方便地處理響應(yīng)結(jié)果。構(gòu)建一個(gè)會(huì)話(session)[2],定義好用戶代理(UA)頭部后使用會(huì)話發(fā)起一個(gè)HTTP請(qǐng)求,也就是訪問(wèn)養(yǎng)老網(wǎng)的查詢鏈接。部分代碼如下:
在獲取到文本時(shí),通過(guò)Python中的eautifulSoup庫(kù)來(lái)對(duì)該文本進(jìn)行字段的截取與處理,獲得各個(gè)養(yǎng)老機(jī)構(gòu)詳細(xì)信息的跳轉(zhuǎn)鏈接;通過(guò)對(duì)該鏈接進(jìn)行補(bǔ)全,進(jìn)而繼續(xù)訪問(wèn)詳情鏈接,從而得到各個(gè)養(yǎng)老機(jī)構(gòu)的詳細(xì)信息文本;最后再通過(guò)BeautifulSoup庫(kù),根據(jù)相關(guān)需求來(lái)處理該文本,提取相關(guān)信息。通過(guò)這樣不斷地采集,就可以將該網(wǎng)站下的所有養(yǎng)老機(jī)構(gòu)信息都提取出來(lái)。部分代碼如下所示:
從網(wǎng)絡(luò)上爬取的數(shù)據(jù)經(jīng)常會(huì)出現(xiàn)空行、重復(fù)記錄、缺失值、數(shù)據(jù)不完整、數(shù)據(jù)矛盾、異常值等情況,不僅會(huì)影響后期對(duì)數(shù)據(jù)的挖掘和分析,而且會(huì)影響建模,甚至?xí)?dǎo)致錯(cuò)誤的建模結(jié)果,因此,數(shù)據(jù)清洗是尤為重要的[3]。數(shù)據(jù)清洗的主要任務(wù)就是消除這些干擾信息,保留有用信息,并為以后進(jìn)一步數(shù)據(jù)分析提供有力的幫助。數(shù)據(jù)清洗主要是刪除原始數(shù)據(jù)中的重復(fù)數(shù)據(jù)和異常值,過(guò)濾掉與建模無(wú)關(guān)的數(shù)據(jù)及平滑噪聲數(shù)據(jù)等。對(duì)于本次爬取到的文本,本文采用了正則表達(dá)式和BeautifulSoup庫(kù)來(lái)進(jìn)行數(shù)據(jù)清洗。
在對(duì)養(yǎng)老機(jī)構(gòu)進(jìn)行爬蟲(chóng)的過(guò)程中,由于有部分信息需要用戶進(jìn)行登錄才能顯示,因此需要使用Python來(lái)進(jìn)行登錄信息的表單構(gòu)建,再將構(gòu)建好的表單使用session的post方法提交到登錄頁(yè)面上,從而實(shí)現(xiàn)自動(dòng)登錄。但由于養(yǎng)老網(wǎng)用戶登錄時(shí)需要填寫(xiě)驗(yàn)證碼,所以需要先對(duì)驗(yàn)證碼進(jìn)行自動(dòng)化識(shí)別。
目前許多網(wǎng)站采取了各種各樣的反爬措施來(lái)針對(duì)機(jī)器化的自動(dòng)采集,其中的一個(gè)措施就是采用驗(yàn)證碼的方式來(lái)進(jìn)行人與機(jī)器的操作的判斷與隔離。目前,廣泛使用的主要是以下幾種形式的驗(yàn)證碼:
(1)滑塊驗(yàn)證碼。在驗(yàn)證過(guò)程中需要將碎片直線移動(dòng)到該圖的缺口上。這種方式要自動(dòng)化的話較為麻煩,可通過(guò)查看原圖與有缺口的圖片之間像素點(diǎn)的不同獲取到該碎片所需要移動(dòng)的距離,再通過(guò)selenium等庫(kù)來(lái)模擬人的鼠標(biāo)點(diǎn)擊拖動(dòng)等[4]。由于本次的目標(biāo)網(wǎng)站沒(méi)有進(jìn)行此類的驗(yàn)證,故在此不多贅述。
(2)圖文驗(yàn)證碼。通過(guò)文字的方式提醒用戶點(diǎn)擊圖中的文字;或是給出一組圖片,要求用戶點(diǎn)擊其中某種類型的圖片。該方式要進(jìn)行自動(dòng)化的話很麻煩,一般對(duì)這種驗(yàn)證方式都需要進(jìn)行人為操作。
(3)圖片驗(yàn)證碼。通過(guò)提供一張圖片,然后讓用戶輸入圖片中的字母、數(shù)字、漢字等來(lái)進(jìn)行驗(yàn)證。本次的目標(biāo)網(wǎng)站就是通過(guò)該方式來(lái)對(duì)用戶進(jìn)行驗(yàn)證。
2.2.1 光學(xué)字符識(shí)別
針對(duì)該網(wǎng)站的圖片驗(yàn)證碼,在此使用光學(xué)字符識(shí)別(OCR)技術(shù)來(lái)對(duì)圖片驗(yàn)證碼進(jìn)行識(shí)別。OCR是指電子設(shè)備(例如掃描儀或數(shù)碼相機(jī))檢查紙上打印的字符,通過(guò)檢測(cè)暗、亮的模式確定其形狀,然后用字符識(shí)別方法將形狀翻譯成計(jì)算機(jī)文字的過(guò)程[5]。
tesserocr是Python的一個(gè)OCR庫(kù),但其實(shí)是對(duì)tesseract做的一層Python API的封裝,所以其核心是tesseract。tesserocr使用Cython直接與Tesseract的C++ API集成,允許使用簡(jiǎn)單的Pythonic和易于閱讀的源代碼。 通過(guò)在tesseract中處理圖像時(shí)釋放全局解釋器鎖(GIL),它可以在與Python的線程模塊一起使用時(shí)實(shí)現(xiàn)真正地并發(fā)執(zhí)行。因此,在使用tesserocr之前,我們需要先安裝tesseract,之后就可以嘗試著對(duì)驗(yàn)證圖片進(jìn)行識(shí)別了[6]。
2.2.2 灰度處理與二值化
在對(duì)圖片進(jìn)行識(shí)別前,一般需要對(duì)圖片先進(jìn)行處理,剔除掉多余的信息,如顏色或多余的背景線條等。本次在進(jìn)行圖片文字識(shí)別前先對(duì)圖片進(jìn)行了灰度處理和二值化,將圖片變成黑白圖片,以便于后面的文字識(shí)別。在Python中通過(guò)使用Image庫(kù)來(lái)對(duì)獲取到的驗(yàn)證碼圖片進(jìn)行處理[7],具體代碼如下所示:
通過(guò)調(diào)用該代碼后處理的效果如圖1所示。
圖1 驗(yàn)證碼圖片識(shí)別處理的代碼執(zhí)行前后差別
2.2.3 圖片識(shí)別
在對(duì)驗(yàn)證碼圖片進(jìn)行處理后,就可以使用tesserocr庫(kù)進(jìn)行文本識(shí)別,通過(guò)執(zhí)行tesserocr.image_to_text(image)代碼返回識(shí)別后的字符串,如對(duì)圖1處理后的圖片識(shí)別效果為“femy”。獲得識(shí)別出來(lái)的驗(yàn)證碼后,將該驗(yàn)證碼添加進(jìn)之前構(gòu)建的表單進(jìn)行post傳遞,就可進(jìn)行自動(dòng)登錄。
在對(duì)驗(yàn)證碼圖片的自動(dòng)驗(yàn)證完成后,我們可以根據(jù)目前大部分網(wǎng)站的登錄驗(yàn)證方式建立一個(gè)自動(dòng)登錄驗(yàn)證模塊。先基于目前大部分網(wǎng)站的密碼驗(yàn)證方式編寫(xiě)相關(guān)的驗(yàn)證碼驗(yàn)證代碼塊(由于本文的目標(biāo)網(wǎng)站采取的是圖片驗(yàn)證方式,所以當(dāng)前只實(shí)現(xiàn)了圖片驗(yàn)證代碼塊),再通過(guò)人工或代碼自動(dòng)定位到登錄頁(yè)面的驗(yàn)證碼文本,然后獲取該文本下方的驗(yàn)證圖片或圖片彈出按鈕,在執(zhí)行之前編寫(xiě)好的驗(yàn)證代碼塊;若是不符,則自動(dòng)執(zhí)行其他的驗(yàn)證代碼塊[8]。具體算法描述如下:
(1)輸入:登錄頁(yè)面網(wǎng)址。
(2)根據(jù)網(wǎng)址定位到驗(yàn)證碼位置。
(3)根據(jù)驗(yàn)證碼位置找到其兄弟節(jié)點(diǎn),獲取驗(yàn)證碼圖片或按鈕。
(4)執(zhí)行編寫(xiě)的驗(yàn)證代碼塊,若返回結(jié)果為空,則調(diào)用另外的驗(yàn)證代碼塊,如:
(5)根據(jù)輸出內(nèi)容判斷是否成功。
在從相關(guān)網(wǎng)站獲取到所需信息之后,在此將信息構(gòu)建成一個(gè)html格式的列表放Tomcat進(jìn)行可視化展示。
通用網(wǎng)關(guān)接口(common gateway interface,CGI)是一段運(yùn)行在服務(wù)器上的程序,可提供同客戶端 HTML 頁(yè)面的接口。CGI是外部擴(kuò)展應(yīng)用程序與WWW服務(wù)器交互的一個(gè)標(biāo)準(zhǔn)接口,按照CGI標(biāo)準(zhǔn)編寫(xiě)的外部擴(kuò)展應(yīng)用程序可以處理客戶端(一般是WWW瀏覽器)輸入的協(xié)同工作數(shù)據(jù),完成客戶端與服務(wù)器的交互操作。CGI通信由兩部分組成:一部分是用戶的瀏覽器顯示的頁(yè)面,也就是HTML頁(yè)面;另一部分則是運(yùn)行在服務(wù)器上的CGI程序[9]。它們之間的通信方式如圖2所示。通過(guò)CGI腳本使服務(wù)器的瀏覽器與用戶能交互,也可以在瀏覽器中運(yùn)行Python的代碼。
圖2 CGI通信方式示意
在瀏覽器中通過(guò)CGI 編程來(lái)運(yùn)行Python腳本前,需要先在本地搭建一個(gè)web服務(wù)器。Python 3.X版本自帶了一個(gè)CGI服務(wù)器,通過(guò)在命令行在新建目錄下執(zhí)行相關(guān)命令python -m http.server -cgi端口號(hào)來(lái)啟動(dòng)服務(wù)器,并將寫(xiě)好的Python腳本放在新建目錄的子目錄“cgi-bin”中,通過(guò)訪問(wèn)“http://localhost:端口號(hào)/cgi-bin/文件名.py”來(lái)執(zhí)行該腳本,只需在該腳本上進(jìn)行html文本打印,就可以進(jìn)行頁(yè)面展示[10]。
隨著大數(shù)據(jù)和人工智能時(shí)代的到來(lái),借助本文研究設(shè)計(jì)的方法,可以構(gòu)建一個(gè)智選養(yǎng)老機(jī)構(gòu)系統(tǒng),為有需要的人士縮短查找養(yǎng)老機(jī)構(gòu)的時(shí)間,快速找到符合自己需求的養(yǎng)老機(jī)構(gòu)。
科技創(chuàng)新發(fā)展戰(zhàn)略研究2020年1期