查看原文
其他

实战演练——爱婴医院中莆田系医院数据分析(一)

爬虫俱乐部 Stata and Python数据分析 2022-03-15

本文作者:张馨月

文字编辑:宁刘莹

技术总编:张   邯


爬虫俱乐部将于2020年1月5日至11日湖北武汉举行为期一周的Stata编程技术定制培训,此次采取初级班和高级班分批次培训。课程通过案例教学模式,旨在帮助大家在短期内掌握Stata软件编程、金融计量知识和实证分析方法,使大家熟悉Stata核心的爬虫技术,以及Stata与其他软件交互的高端技术。目前正在火热招生中~详细培训大纲及报名方式,请点击《爬虫俱乐部2020第一期Stata编程训练营开始报名啦!》或点击文末阅读原文呦~



自2015年党的十八届五中全会开放二孩政策实施以来,越来越多天真可爱的孩子在这个中国特色社会新时代呱呱坠地。但是,“7岁男童坠楼身亡”、“幼儿园虐童”等新闻时时刻刻提醒我们,要全方位、多角度对这些祖国未来的建设者进行保护。当然,保护他们要从保护他们的出生做起。


开放二孩政策实施后,国家妇幼健康司响应号召,在2015年11月公布了《国家卫生计生委关于公布全国爱婴医院名单的公告》,旨在“不断改善产科儿科服务质量,逐步提高母乳喂养率,降低非医学指征剖宫产率,保障调整完善生育政策顺利实施”。(网址:http://www.nhc.gov.cn/fys/s7906/201511/e5650712dbcd449e9d2e01129a698b9c.shtml)

当小编打开这些名单浏览的时候,这里面有些医院的名字竟形同“莆田系医院”,为了识别这其中为数不多的“莆田系医院”,小编决定使用Python来一探究竟。

由于篇幅限制,本篇重点介绍如何获取所需的.docx文件,下篇重点介绍如何提取.docx文件中的表格信息并与已有的数据库进行匹配。


本文涉及的技术要点:

① 获取公告附件
② 获取word文件中的表格信息
③ 将.doc文件转换为.docx文件

一、使用网络爬虫技术抓取爱婴医院名单


1、创建文件夹并改变缺省路径

导入Python的os标准库,判断是否存在我们需要的文件夹,如果不存在则创建,将新创建的文件夹作为缺省路径,程序如下:

import osif not os.path.exists(r"D:/爱婴医院"): os.mkdir(r"D:/爱婴医院")os.chdir(r"D:/爱婴医院")


2、导入requests标准库和re标准库抓取WORD文件

requests和re库的使用在爬虫俱乐部往期推文《手持python,斗图不输!》和《Python标准库re:正则表达式》中已详细介绍。首先,导入标准库,构造headers,并抓取网页源代码,程序如下:

import requestsimport reheaders = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36', 'Host': 'www.nhc.gov.cn', 'Referer': 'http://www.nhc.gov.cn/fys/s7906/201511/e5650712dbcd449e9d2e01129a698b9c.shtml', 'Cookie': 'FSSBBIl1UgzbN7N80S=IIRSdCvBkEfkV.B2JY9RYhaETIf1BuxVpvEkSoPAJNFoG0jDMD0Ful2W19MSwjQT; yfx_c_g_u_id_10006654=_ck19080819145412635280045357765; _gscu_2059686908=65262894vmq4k445; yfx_f_l_v_t_10006654=f_t_1565262894262__r_t_1566175543011__v_t_1566175543011__r_c_2; _gscbrs_2059686908=1; yfx_mr_10006654=%3A%3Amarket_type_free_search%3A%3A%3A%3Abaidu%3A%3A%3A%3A%3A%3A%3A%3Awww.baidu.com%3A%3A%3A%3Apmf_from_free_search; yfx_mr_f_10006654=%3A%3Amarket_type_free_search%3A%3A%3A%3Abaidu%3A%3A%3A%3A%3A%3A%3A%3Awww.baidu.com%3A%3A%3A%3Apmf_from_free_search; yfx_key_10006654=; security_session_verify=27b11d4bf074ab3d320a0abb616f351f; banggoo.nuva.cookie=1|XVn2H|XVnyw; FSSBBIl1UgzbN7N80T=3r.zHapFkhZJ9axZJ1O.c4IFBETpXD7V97EmMfYcNch3_sxH_Btj9.wKGGKtWVFD4JTZMrYQH4I_cyZS.TVLlnmOlnWWQYX1KSl_0JUVaqTV5NSoiWZ2yDjJtV0RKxM3mtcPiY3b6wUjzJcPd4Z3u2ns76vO.lskE3joV_Gsk37Wj7hd7a.qnhOQazlKQrIZW8zGEH.8cPkVTO626ptQpnK35KuJcjrdVKTUEIq7bS81Ba.CKHUaDxNyxwsVMVkUiIGOGGD9sL3MFcik_S05TQa174cT51WxsHLZ_d4FFWBq3LZzaqvAM.ybpZ0vwVcPApVOILVksCY4w7adafW4.rYWCq_.1437bDWfT7f6FtSnb9G' }html = requests.get("http://www.nhc.gov.cn/fys/s7906/201511/e5650712dbcd449e9d2e01129a698b9c.shtml")text = html.content.decode('utf-8')#先抓取字节码再转换为字符串,避免乱码。print(text)

结果如下:



可见,我们使用requests库成功将网页源代码抓取下来。源代码中存有WORD文件的URL,我们将其中一个复制下来进行分析:

<A target=_blankhref="/ewebeditor/uploadfile/2015/11/20151117160507435.doc">1.北京市爱婴医院名单.doc</A></P>


其中的URL可以使用正则表达式A[ ]target.*?href="(.*?)"进行提取,我们提取出32个WORD文件的URL并放在一个列表中,程序如下:

urls = re.findall('A[ ]target.*?href="(.*?)"', text, re.S)print(urls)c_url = []for url in urls: ur = "http://www.nhc.gov.cn" + url c_url.append(ur)print(c_url)


结果如下:


最后,使用requests库,根据列表中的URL下载WORD文件,程序如下:

for nu,c in enumerate(c_url): co = requests.get(c) #获取文件 suffix = os.path.splitext(c)[1] #分离文件名与文件后缀(.doc或.docx) filename = str(nu)+suffix #用序号给文件命名,生成新的文件名 with open(filename,'wb') as f:        f.write(co.content)


此时,在缺省路径中就出现了我们需要的WORD文件,结果如下:


二、将.doc文件转换为.docx文件


由于Python无法读取.doc文件,因此我们先将.doc转换为.docx。

导入标准库并定义转化函数:
from win32com import client# win32com.client可以直接调用VBA的库,对Word、Excel进行操作def doc_to_docx(path): if os.path.splitext(path)[1] == ".doc": word = client.Dispatch('Word.Application') #打开word。 doc = word.Documents.Open(path) # 打开目标路径下的文件 doc.SaveAs(os.path.splitext(path)[0]+".docx", 16) doc.Close()        word.Quit()       #退出

上述函数需要传入文件名。接下来定义一个函数,用来将指定文件夹中的所有文件存入历列表中:

def find_file(path, ext, file_list=[]): dir = os.listdir(path) for i in dir: i = os.path.join(path, i) #拼接文件路径, 将多个路径组合后返回 if os.path.isdir(i): #用于判断某一对象是否为目录 find_file(i, ext, file_list) else: if ext == os.path.splitext(i)[1]: file_list.append(i)    return file_list


调用上述函数进行转换并删掉.doc文件,程序如下:

dir_path = "D:\爱婴医院" #批量转换文件夹ext = ".doc"file_list = find_file(dir_path, ext)for file in file_list: doc_to_docx(file)#删掉.doc文件files = os.listdir()print(files)for c in files: if os.path.splitext(c)[1] == ".doc":        os.remove(c)


结果如下:

此时,文件就全部转换为了.docx文件。




对我们的推文累计打赏超过1000元,我们即可给您开具发票,发票类别为“咨询费”。用心做事,不负您的支持!
往期推文推荐

给你一个贴心的reshape应用

asrol命令——让你的描述性统计信息滚动起来
Python带你看文献—xpath抓取知网文献
您有一份天气预报待签收 
听说会Stata的人,数学不会太差?
批量修改路径
妙用正则表达式--Python中的re模块
豆瓣电影评分之数据爬取与可视化的实现 
为了辅导作业,这位家长竟然...
走进列表的世界——列表方法(二)
走进列表的世界——列表方法(一)
朝花夕拾|长宽数据转换——reshape命令
Stata有音乐包啦!
对《陈情令》的数据可视化分析
stata绘制热力图详解
实战演练-明星微博热搜次数的数据可视化
《少年的你》影评

关于我们

微信公众号“Stata and Python数据分析”分享实用的stata、python等软件的数据处理知识,欢迎转载、打赏。我们是由李春涛教授领导下的研究生及本科生组成的大数据处理和分析团队。

此外,欢迎大家踊跃投稿,介绍一些关于stata和python的数据处理和分析技巧。
投稿邮箱:statatraining@163.com
投稿要求:
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。
2)邮件请注明投稿,邮件名称为“投稿+推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到有关数据处理、分析等问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存