使用 Python 抓取、分析、可视化—万家医疗诊所信息

本篇文章是使用 Python 抓取万家医疗上面的诊所信息,并且对关键信息进行分析,实现数据可视化。由于时间和能力的问题,能抓取的数据类型较少,分析的维度也不足。但是尝试去剖析在国家倡导分级诊疗的大环境下,移动医疗在社区诊所上的发展情况。所以抓取了万家医疗网站里面的诊所数据,并从诊所区域分布、科室类型以及是否支持医保上进行了数据分析和可视化。

<strong>准备工作</strong>
首先是开始抓取前准备工作,导入需要使用的库文件,爬虫主要使用的是requests和BeautifulSoup两个库,数据分析主要使用 Numpy 和 Pandas 两个库,外加 matplotlib 库实现数据可视化。

<pre>import requests
from bs4 import BeautifulSoup
import time
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
</pre>

<strong>抓取诊所列表信息</strong>
在抓取前需要先观察下万家医疗诊所列表页面的的结构,URL为“"https://www.pinganwj.com/clinic/pa1”,其中 ”pg1”为页面数,共有846个页面,预计诊所有8460家左右,可以使用循环遍历所有的页面,获取信息。

<pre>#设置 url 的前面部分
url = "https://www.pinganwj.com/clinic/"
</pre>

确定了 URL 链接之后,还需要设置浏览器头部(headers)信息,否则系统会识别爬虫程序,从而阻止访问页面。

<pre>#设置url的前面部分
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36',
'Accept':'text/javascript, application/javascript, application/ecmascript, application/x-ecmascript, /; q=0.01',
'Accept-Charset':'ISO-8859-1,utf-8;q=0.7,*;q=0.3',
'Accept-Encoding':'utf-8',
'Connection':'keep-alive',
'Referer':'http://www.baidu.com/link?url=_andhfsjjjKRgEWkj7i9cFmYYGsisrnm2A-TN3XZDQXxvGsM9k9ZZSnikW2Yds4s&wd=&eqid=c3435a7d00006bd600000003582bfd1f'
}
</pre>

使用 for 循环生成 1-847 的数字,转化格式后与前面的 URL 固定部分拼成要抓取的 URL。这里我们设置每两个页面间隔 0.5 秒。抓取到的页面保存在 html 中。

<pre>#循环抓取列表页信息
for i in range(1,847):
if i == 1:
i=str(i)
a=(url+'pg'+i)
r=requests.get(url=a,headers=headers)
html=r.text
else:
i=str(i)
a=(url+'pg'+i)
r=requests.get(url=a,headers=headers)
html2=r.text
html = html + html2
#每次间隔0.5秒
time.sleep(0.5)
#在页面打印爬取进度
print ('正在爬取第'+i+"页")
</pre>

@爬取进度页面|center

<strong>解析页面并提取信息</strong>
页面爬取下来之后,需要使用 BeautifulSoup 对页面进行解析,变成我们在浏览器查看源代码中看到的样子,这样我们才能提取关键信息。

<pre>#使用 BeautifulSoup 解析抓取的页面内容
wj = BeautifulSoup(html,'html.parser')
</pre>

到目前为止,我们已经 800+ 多个页面的信息爬取下来,并且通过 BeautifulSoup 解释为我们常见的源代码方式。下面就是通过分析爬取字段中 <code>Div</code>的 id 或者 class 提取关键信息。

<pre>#将诊所列表中的信息保存在 hospital 中,其中 find_all 获取的是一个 list,就是每个诊所就是list上的一个对应元素。
hospital = wj.find_all('div',attrs = {"class":"cli-list left"})
</pre>

继续在<code>hospital</code>中提取诊所名称、医保信息、科室和地区信息,将各项信息存储到各自的<code>list</code>中。使用到的方法基本一样,需要自行调整一下定位就好。

<pre>#获取诊所名称
hn = []
for a in hospital:
hospital_name = a.h1.get_text()
hn.append(hosptal_name)

获取诊所医保信息

yb = []
for c in hospital:
yibao_info = c.find_all('span', attrs = {'class':'medicare'})
yibao = yibao_info
yb.append(yibao)

获取诊所科室

ks = []
for b in hospital:
keshi = b.p.get_text()
ks.append(keshi)

获取诊所地址

address = []
for d in hospital:
address_info = d.find_all('script')
address.append(address_info)
</pre>

<strong>数据分析和数据可视化</strong>
将拿到的数据使用 Pandas 库生成数据表,方便后面分析。

<pre>#将诊所名称、医保信息、科室和地区等信息生成数据表
hospital_list=pd.DataFrame({'hospital_name':hn,'hospital_keshi':ks,'hospital_yibao':yb,'hospital_address':address})
</pre>

<strong>诊所分布的省份分析:</strong>
通过使用 groupby 对诊所所在省份进行汇总,通过条形图展示每个省份的诊所数量。

<pre>#对每个省份的诊所数量进行汇总
prov = wj.groupby('hospital_address')['hospital_address'].agg('count')

对省份数据进行排序

prov.sort_values(inplace=True)

生成省份名称列表,下面用作坐标值

prov_name=prov.index

定义图表比例

plt.figure(figsize=(16,9))

定义图表类型并且传入参数

plt.barh(range(len(prov)),prov,tick_label=prov_name)

标注X轴的标签

plt.xlabel(u'诊所数量',fontsize ="14")

用来正常显示中文标签

plt.rcParams['font.sans-serif']=['SimHei']
plt.show()
</pre>

@诊所省份分布图

有上面的图片可以看出,河南、河北、黑龙江三个省份的诊所数量最多。可能的原因是万家医疗在不同省份推广资源的分配导致的。但是跟深层次的去考虑:为什么不是北京上海广东这些大城市呢?其实很好理解,北京、上海、广东可以说是中国医疗资源最密集的地方,但是这些地方都被大型三甲医院占据,民营的、小型的社区诊所要发展就比较困难。

<strong>诊所分布的科室类型分析:</strong>
使用相同的方式,对不同诊所的科室类型进行分析,分析方法和展示形式基本一样。但是需要强调的是,因为有的诊所拥有多个科室,所以对于这类诊所,我将它们定义为综合类型诊所。

<pre>#对各种科室的诊所数量进行汇总
keshi = wj.groupby("hospital_keshi")["hospital_keshi"].agg("count")

对科室类型数据进行排序

keshi.sort_values(inplace=True)

生成科室名称列表,下面用作坐标值

keshi_name=keshi.index

定义图表比例

plt.figure(figsize=(9,6))

定义图表类型并且传入参数

plt.barh(range(len(keshi)),keshi,tick_label=keshi_name)

标注X轴的标签

plt.xlabel(u'诊所数量',fontsize ="14")

用来正常显示中文标签

plt.rcParams['font.sans-serif']=['SimHei']

展示图表

plt.show()
</pre>

@诊所科室分布

从上面的图表可以看出,占比最大的诊所类型是口腔科类型的诊所,这些诊所大多是民营的,并且倾向私人经营较多。还有中医科主要就是一些私人开办的中医馆。

<strong>诊所是否支持医保:</strong>
对于社区诊所来说,患者还是比较看重是否支持医保支付的,所以医保信息也是相当关键。获取得到的医保数据中,支持医保的显示“是”,不支持医保的为空。统计医保支付的占比,并且制作称饼图。

<pre>#统计汇总医保数量
yibaoinfo = wj.groupby("hospital_yibao")["hospital_yibao"].agg("count")

计算支持医保和非医保数量

yibaoinfo = np.array([yibaoinfo.values,8460-yibaoinfo.values])

定义图表大小

plt.figure(figsize=(9,6))

定义标签值

labels = ['有医保', '无医保']

定义数据值的大小,获取上面的列表信息

size = [yibaoinfo[0],yibaoinfo[1]]
定义图表类型为饼图
plt.pie(size, labels=labels)
plt.axis('equal')
plt.show()
</pre>

@是否支持医保分布|center

从上图可以看到,不到一半的诊所支持医保,也可能是网站信息更新不全,看来医保的路还要继续走呢。

以上就是万家医疗诊所信息爬取和分析的总过程,因为能力的原因,所以爬取数据的维度较少,代码质量和图表也是没有经过美化,显得稍微简陋了一些。如果后面有时间,还会分享更多关于移动医疗+爬虫+数据科学+数据可视化的文章,感谢大家多多关注。

本文为原创文章,如需转载请注明原文出处:<a href = "http://wp.me/p86ISR-gO">http://wp.me/p86ISR-gO</a>

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容

  • 北方的雪人含着一把南方的盐 于是显得愈发洁白,高贵 她从北极或者乞力马扎罗来 一只北极熊或者风干了的豹尸 尾随她,...
    素覆以往阅读 309评论 5 8
  • #一级标题 1.内容1 >这是我的引用1 [百度](http://www.baidu.com) **这段是粗体 *...
    linxiaoziruo阅读 121评论 0 0
  • 本周六日正值元宵佳节,我和妈妈以及小姨一家来到延庆,周六去了龙庆峡,欣赏了拥有浓郁冬奥会氛围的冰灯,周日去了石京龙...
    偏离轨道之路阅读 594评论 3 2
  • 秋讯 也许!你早应该相信 大地上布满了 明亮的波纹—— 它们像回声一样湮开 吞没了湿湿的 苦颜色草叶 大口大口喘气...
    爱亦如诗阅读 293评论 0 1