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