崔智博 楊金靈 李欣儀 宋青樺 聞柏智
摘要:網(wǎng)絡(luò)信息復(fù)雜繁多與日俱增,人們?cè)絹碓街匾晫?duì)數(shù)據(jù)的研究,為了有針對(duì)性地檢測提取數(shù)據(jù),一種全新的搜索引擎技術(shù)應(yīng)運(yùn)而生,最大限度上解決了網(wǎng)絡(luò)信息冗雜難辨的問題,使信息更加簡潔、有針對(duì)性。與早期的搜索引擎原理類似,該文采取春雨醫(yī)生及患者作為實(shí)驗(yàn)樣本,通過醫(yī)患聊天對(duì)話框比率、醫(yī)生職稱的加權(quán)、綜合數(shù)據(jù)整理分析得出醫(yī)生的綜合素質(zhì)水平評(píng)分,為患者就醫(yī)提供有價(jià)值的信息,對(duì)癥就醫(yī),為患者精準(zhǔn)對(duì)接醫(yī)生提供了可靠的信息支持。
關(guān)鍵詞:Python;網(wǎng)絡(luò)爬蟲;數(shù)據(jù)分析;數(shù)據(jù)可視化;熱力圖
中圖分類號(hào):TP393? ? ? ? 文獻(xiàn)標(biāo)識(shí)碼:A
文章編號(hào):1009-3044(2022)01-0020-03
1 引言?
隨著對(duì)科技領(lǐng)域的深入研究,接收信息的科技手段不斷創(chuàng)新,人們每天接收著海量信息,繁雜的信息與緊張的時(shí)間碰撞,由此,在短暫的時(shí)間內(nèi)找到有價(jià)值的信息才能更好地利用信息為人們服務(wù)。通過采用爬蟲、數(shù)據(jù)分析技術(shù),將數(shù)據(jù)入庫進(jìn)行壓縮過濾,進(jìn)而通過數(shù)據(jù)可視化生成一個(gè)顯而易見的熱力圖,再對(duì)各個(gè)科室的醫(yī)生進(jìn)行對(duì)比。此項(xiàng)技術(shù)可應(yīng)用于多個(gè)行業(yè),如企業(yè)發(fā)展趨勢、社會(huì)輿情管控、市場基礎(chǔ)調(diào)研等。由于Python的第三方庫非常豐富,采用re、urllib、BeautifulSoup、Matplotlib等多方法庫對(duì)數(shù)據(jù)進(jìn)行爬取、分析。此技術(shù)適合解決處理數(shù)據(jù)提取分析問題,可在多個(gè)行業(yè)領(lǐng)域推廣。
2 算法設(shè)計(jì)原理
本程序用Python作為開發(fā)語言,Pycharm作為開發(fā)工具,Excel用于保存數(shù)據(jù),春雨醫(yī)生作為爬取對(duì)象。
2.1 搜索引擎的原理
通過編寫爬蟲程序,獲取到網(wǎng)頁內(nèi)容,把內(nèi)容放入一個(gè)臨時(shí)庫進(jìn)行處理,如數(shù)據(jù)的壓縮、過濾等,經(jīng)過處理的數(shù)據(jù)再存儲(chǔ)到新的數(shù)據(jù)庫里,把這些數(shù)據(jù)做出索引,每個(gè)索引對(duì)應(yīng)常見的列表和內(nèi)容,當(dāng)用戶想要輸入關(guān)鍵字時(shí),索引可以快速定位到數(shù)據(jù)庫里的數(shù)據(jù),提供給用戶并形成一個(gè)界面,這就是搜索引擎的功能,每次搜索并不是讓爬蟲現(xiàn)在去爬一次,而是從爬蟲爬好的數(shù)據(jù)里,去提取出來。該原理前半部分是爬蟲,后半部分是數(shù)據(jù)可視化(圖1)。
2.2爬蟲
網(wǎng)絡(luò)爬蟲又叫作網(wǎng)絡(luò)蜘蛛,它是一種按照特定規(guī)則,自動(dòng)捕獲網(wǎng)站信息的程序或腳本。由于互聯(lián)網(wǎng)數(shù)據(jù)的多樣性和資源的有限性,根據(jù)用戶需求定向抓取相關(guān)網(wǎng)頁并分析已成為如今主流的爬取策略。網(wǎng)絡(luò)爬蟲并非一項(xiàng)新技術(shù),可以說至少有二十年的歷史。隨著當(dāng)下存儲(chǔ)價(jià)格的波動(dòng)、計(jì)算能力的提高、云計(jì)算的發(fā)展,其商業(yè)價(jià)值也會(huì)不斷攀升,這就需要我們對(duì)爬蟲技術(shù)加以創(chuàng)新優(yōu)化,再加上互聯(lián)網(wǎng)發(fā)展這么多年有很多數(shù)據(jù)的沉淀,所以在這個(gè)過程里面,爬蟲現(xiàn)在可以被我們更多的人所使用,完成更多的特定行業(yè)的、特定需求的功能。爬蟲的本質(zhì)是模擬瀏覽器打開網(wǎng)頁,獲取網(wǎng)頁中我們想要的那部分?jǐn)?shù)據(jù)。
2.3數(shù)據(jù)可視化
隨著移動(dòng)終端的廣泛普及,大家不僅僅希望把數(shù)據(jù)存起來,更希望數(shù)據(jù)能被人們理解,這些數(shù)據(jù)可能很抽象,專家才可能看懂里面的規(guī)律。為了更多的決策管理人員能更好地判斷接下來要發(fā)生的事情,所以數(shù)據(jù)可視化的需求變得很廣泛了。數(shù)據(jù)可視化有折線圖、柱狀圖、餅狀圖、熱力分布圖等等,可以分析增長的速度、比例、地區(qū)的分布等等,用到了Flask(用于做網(wǎng)站)、Echarts(一個(gè)多種圖表開源的框架)、Matplotlib(基于Python的圖表繪圖系統(tǒng))。
3 算法設(shè)計(jì)
3.1準(zhǔn)備工作
3.1.1網(wǎng)頁基礎(chǔ)信息介紹
需要用到HTML、CSS、JS的基礎(chǔ)知識(shí)和URL分析,春雨醫(yī)生網(wǎng)站包括600條醫(yī)生信息,分30頁,每頁20條。每頁的URL的不同之處是最后的數(shù)值page=page+1;借助F12來查看網(wǎng)頁的源代碼,在Elements下找到需要的數(shù)據(jù)位置。點(diǎn)擊Network后,生成對(duì)這個(gè)網(wǎng)站發(fā)起請(qǐng)求的過程,小的線條為瀏覽器向服務(wù)器放送的請(qǐng)求。刷新該網(wǎng)頁,只要下面的內(nèi)容是我們想要的,就點(diǎn)擊停止,日志將不再記錄,再點(diǎn)擊第一個(gè)請(qǐng)求,也就是從最左邊數(shù)第一個(gè)線條,返回了請(qǐng)求的大小、規(guī)格等,最后點(diǎn)擊該請(qǐng)求,生成了一個(gè)含有頭部消息的頁面,該頁面含有請(qǐng)求的路徑Request URL、請(qǐng)求的方式Request Method、狀態(tài)碼Status Code、移動(dòng)端地址Remote Address、返回的頭部Response Headers(我們發(fā)給服務(wù)器的頭部信息,告訴服務(wù)器返回的內(nèi)容,應(yīng)該適配什么樣的條件,而服務(wù)器給的信息在Response里)、用戶代理User-Agent(獲取瀏覽器信息,表明是什么版本的瀏覽器,并且可以接受什么樣的瀏覽器)、cookie等。
3.1.2編碼規(guī)范
1. # coding=utf-8 可以在代碼中包含中文
2. # if__name__==“__main__”: 用于測試程序
3.1.3引入的庫
from bs4 import BeautifulSoup? ? ? #網(wǎng)頁解析
import re? ? ? ? ? ? ? ? ? ? ? ? #正則表達(dá)式
import urllib.request,urllib.error? ?#制定URL
import xlwt? ? ? ? #進(jìn)行excel操作
import sqlite3? ? ? ? ? ? ? ? ? ? #進(jìn)行SQLite數(shù)據(jù)庫操作
import matplotlib.pyplot? ? ?#繪圖
import seaborn? ? ? ?#matplotilb的子類,分析熱力圖
import pandas? ? ? ?#內(nèi)置的一個(gè)類dataframe 建立二維矩陣
(第三方庫在系統(tǒng)里沒有需要引入, win鍵+r彈出運(yùn)行窗口,輸入cmd生成黑色框,再輸入pip install +庫名,即可完成下載安裝。)
3.2 爬取數(shù)據(jù)
3.2.1 爬取方法
首先建立一個(gè)datalist數(shù)組,用于保存獲取到的數(shù)據(jù)。由于春雨醫(yī)生的每頁都有規(guī)律,只需在網(wǎng)址后邊改頁數(shù)即可,利用for循環(huán)遍歷所有網(wǎng)頁,這里需注意索引值i是int型,需要強(qiáng)制類型轉(zhuǎn)換為str,再調(diào)用askURL函數(shù)保存獲取的源碼。使用BeautifulSoup定位特定的標(biāo)簽位置(用到了html.parser解析器,在用soup.fill_all()按照一定的標(biāo)準(zhǔn)把想要的數(shù)據(jù)一次性查找出來,形成一個(gè)列表),最后使用正則表達(dá)式找到具體內(nèi)容(由于找到的數(shù)據(jù)可能很多,第一個(gè)數(shù)據(jù)才是我們想要找到的,所以在方法后邊加[0])。
3.2.2 urllib
Python一般使用urllib2庫獲取頁面,對(duì)每一個(gè)頁面,調(diào)用askURL函數(shù)獲取頁面內(nèi)容,定義一個(gè)獲取頁面的函數(shù)askURL,傳入一個(gè)url參數(shù)來表示網(wǎng)址,打開網(wǎng)頁找到源代碼里的Network中User-Agent,用鍵值對(duì)的方式保存在頭部字典head里(模擬瀏覽器頭部信息,向服務(wù)器發(fā)送消息),接下來用urllib2.Request生成請(qǐng)求,urllib2.urlopen發(fā)送請(qǐng)求獲取響應(yīng),read獲取頁面內(nèi)容,當(dāng)然在訪問頁面經(jīng)常會(huì)出現(xiàn)錯(cuò)誤,為了程序正常運(yùn)行,加入異常捕獲try…except…語句。
def askURL(url):? ? ? ? ? ? #獲取html內(nèi)容的函數(shù)
head = {
"user-agent": "Mozilla / 5.0(Windows NT 10.0;Win64; x64) AppleWebKit / 537.36(KHTML, like Gecko) Chrome / 88.0.4324.96? Safari / 537.36 Edg / 88.0.705.53"
#模擬登入
}
request=urllib.request.Request(url,headers=head)
html=""
try:
response=urllib.request.urlopen(request)
html=response.read().decode("utf-8")
#print(html)
except urllib.error.URLError as e:
if hasattr(e,"code"):
print(e.code)
if hasattr(e,"reason"):
print(e.reason)
return html
3.2.3正則表達(dá)式
正則表達(dá)式是對(duì)一種規(guī)格的描述或表達(dá),描述的是一種字符串匹配的模式。簡而言之,用具備一定特征意義的表達(dá)式對(duì)字符串進(jìn)行檢查,將符合條件的子字符串提取出來。獲取html字符串后,對(duì)提取的數(shù)據(jù)進(jìn)行特征提取,使用正則表達(dá)式語法進(jìn)行編譯,完成數(shù)據(jù)的提取。就不用將html字符串轉(zhuǎn)換成html文檔或頁面,然后再用到xpath和bs4再進(jìn)行提取了。
單字符:點(diǎn)(.)匹配某個(gè)字符串:match(表達(dá)式,匹配對(duì)象)只能匹配某個(gè),從起始位置進(jìn)行匹配并返回的結(jié)果是object; 若匹配不到,不會(huì)報(bào)錯(cuò),返回None。點(diǎn)(.)匹配任意某個(gè)字符,\d匹配任意某個(gè)數(shù)字,\D除了數(shù)字外均可匹配,/s匹配空白字符。
多字符:星號(hào)(*)匹配零個(gè)或者多個(gè)字符,沒有星號(hào)就從起始位置進(jìn)行匹配,匹配到第一個(gè);有星號(hào)從起始位置進(jìn)行匹配,匹配[ ]內(nèi)容零次或多次。問號(hào)(?)要么匹配0個(gè),要么匹配1個(gè)。{m}匹配指定個(gè)數(shù)都是從起始位置匹配由左到右{m,n}匹配m到n個(gè)。
需要在函數(shù)外創(chuàng)建正則表達(dá)式對(duì)象,表示規(guī)則(字符串的模式),用到了re.compile()方法,注意字符串的表示用單引號(hào),因?yàn)樵创a中會(huì)有雙引號(hào),這樣不會(huì)對(duì)它造成影響,在字符串前面加r,就不會(huì)把字符串進(jìn)行錯(cuò)誤的解析了。其中獲取的內(nèi)容(.*?)點(diǎn)表示1個(gè)字符、星號(hào)表示0個(gè)或多個(gè)字符。
findName=re.compile(r'<span class="name">(.*?)</span>')
#定義正則表達(dá)式規(guī)則,爬取醫(yī)生姓名
finGrade = re.compile(r'<span class="grade">(.*?)</span>')
#定義正則表達(dá)式規(guī)則,爬取醫(yī)生級(jí)別
def getData(beseurl):? ? ?#創(chuàng)建爬取解析數(shù)據(jù)函數(shù)
datalist=[]? ? ? ? ? #爬取完把數(shù)據(jù)整合進(jìn)datalist數(shù)組
for i in range(1,31):
url=beseurl+str(i)
html=askURL(url)
soup=BeautifulSoup(html,"html.parser")
for item in soup.find_all('div',class_="doctor-info-item"):
# print(item)
data=[]? ?#把單個(gè)醫(yī)生信息保存在data數(shù)組里
item=str(item)
name = re.findall(findName,item)[0] #按規(guī)則選擇第一個(gè)字符串賦值給name
data.append(name)
grade= re.findall(finGrade,item)[0]
data.append(grade)
datalist.append(data)
print(datalist)
return datalist
3.3 保存數(shù)據(jù)
保存形式多樣,這里我們利用python庫xlwt將抽取的數(shù)據(jù)datalist寫入Excel表格。如果是保存在當(dāng)前文件夾下“./加名字.xls” ,如果保存在文件系統(tǒng)里“.\\加名字.xls”,以u(píng)tf-8編碼創(chuàng)建一個(gè)Excel對(duì)象,創(chuàng)建一個(gè)Sheet表,再往單元格里寫入內(nèi)容,先寫列名,再寫元素,最后保存表格。
3.4熱力圖
熱力圖是數(shù)據(jù)視覺化的呈現(xiàn),它最典型的是色彩傳遞信息,它可以以最直觀的方式顯示出醫(yī)生的綜合評(píng)分,以不同顏色的區(qū)域?qū)︶t(yī)生評(píng)分進(jìn)行標(biāo)示,顯示醫(yī)生的姓名和評(píng)分,幫助患者快速找到合適的醫(yī)生,提高問診質(zhì)量。
本文采用基于Python的繪圖庫matplotlib來實(shí)現(xiàn)熱力圖。
熱力圖的建立分為三步,第一步對(duì)數(shù)據(jù)預(yù)處理,爬取到的醫(yī)患聊天的醫(yī)生對(duì)話框數(shù)量和患者對(duì)話框數(shù)量之比,加上醫(yī)生的級(jí)別(主任醫(yī)師0.5,副主任醫(yī)師0.3,普通醫(yī)師和主治醫(yī)師0.1)所得的分?jǐn)?shù)為醫(yī)生最后的評(píng)分。第二步為建立矩陣(橫坐標(biāo)為科室容納的最大醫(yī)生人數(shù),縱坐標(biāo)為各個(gè)科室,元素),第三步繪圖(圖2)。
4 結(jié)束語
?爬取大量信息后對(duì)數(shù)據(jù)進(jìn)行分析顯然更適合網(wǎng)絡(luò)信息時(shí)代對(duì)數(shù)據(jù)的處理,能夠更好地實(shí)現(xiàn)信息共享,根據(jù)網(wǎng)民需要提供更有針對(duì)性的信息,使用該技術(shù)進(jìn)行線上就醫(yī),符合國家“互聯(lián)網(wǎng)+醫(yī)療”的發(fā)展政策,更大程度上節(jié)約了患者時(shí)間成本,不受時(shí)空限制,為患者提供醫(yī)生準(zhǔn)確專業(yè)的信息。不足點(diǎn)在于本次采集的醫(yī)生數(shù)量較少,存在偶然性。此外,對(duì)醫(yī)生推薦時(shí),是單個(gè)患者進(jìn)行推薦,時(shí)間成本較高。
參考文獻(xiàn):
[1] 何源.腦電波數(shù)據(jù)傳輸?shù)姆?wù)器設(shè)計(jì)與實(shí)現(xiàn)[D].杭州:浙江工業(yè)大學(xué),2017.
[2] 陳饒.面向電力行業(yè)的在線商業(yè)智能工具設(shè)計(jì)與實(shí)現(xiàn)[D].北京:北京郵電大學(xué),2019.
[3] 孫景雪.基于機(jī)器學(xué)習(xí)的第三方追蹤和反廣告攔截檢測系統(tǒng)[D].西安:西安電子科技大學(xué),2019.
[4] 李敏.Edge瀏覽器安全風(fēng)險(xiǎn)與防御技術(shù)研究[D].北京:北京郵電大學(xué),2018.
[5] 徐玉祥.基于動(dòng)態(tài)自適應(yīng)權(quán)重的個(gè)性化微博推薦系統(tǒng)研究[D].合肥:合肥工業(yè)大學(xué),2017.
[6] 葉佳鑫,熊回香,蔣武軒.一種融合患者咨詢文本與決策機(jī)理的醫(yī)生推薦算法[J].數(shù)據(jù)分析與知識(shí)發(fā)現(xiàn),2020,4(Z1):153-164.
【通聯(lián)編輯:王力】
收稿日期:2021-04-06
作者簡介:崔智博(2000—),男 ,遼寧沈陽人,大連外國語大學(xué)本科生,獲得IBM頒發(fā)的高級(jí)軟件工程師證書,2020年藍(lán)橋杯大賽省賽一等獎(jiǎng)+國賽優(yōu)秀獎(jiǎng),2020年遼寧省大學(xué)生計(jì)算機(jī)系統(tǒng)與程序設(shè)計(jì)競賽二等獎(jiǎng),2019年大學(xué)生創(chuàng)新創(chuàng)業(yè)項(xiàng)目“圖書館座位有效預(yù)留一體系統(tǒng)”(省級(jí))成員,2021年大創(chuàng)“融合患者咨詢文本的醫(yī)生推薦算法研究”組長(正在進(jìn)行),2021年大創(chuàng)“結(jié)合機(jī)器學(xué)習(xí),緩解心理疾病患者病情急性發(fā)作問題” 組員(正在進(jìn)行),主要研究方向?yàn)槌绦蛟O(shè)計(jì)。
3414500589236