• 1. 导入库
  • 2. 获取每张表格所在的URL
  • 3. 从URL读取公示数据
    • 3.1 获取表格
    • 3.2 筛选长生公司的产品
  • 4. 数据分析

本文使用Python爬取了中国食品药品检定研究院2016年1月-2018年7月24日批准公式的所有长春长生生产的疫苗。
长春长生疫苗问题牵动广大民众,然而有的疫苗接种本上只有疫苗批次,却不显示具体哪家企业生产的。本文通过爬取中国食品药品检定研究院的公示信息,将2016-2018经中国食品药品检定研究院公示的生物制品批发签发的检验信息整理到一个Excel中,并筛选出长春长生的数据,供大家参考。

本文所有代码见https://github.com/pjgao/webCrawler

数据地址:
1. 长生产品批次,https://github.com/pjgao/webCrawler/blob/master/data/20160101-20180724%E6%A3%80%E9%AA%8C%E4%BA%A7%E5%93%81.xlsx
2. 所有批次,https://github.com/pjgao/webCrawler/blob/master/data/%E9%95%BF%E6%98%A5%E9%95%BF%E7%94%9F%E5%85%AC%E5%8F%B8%E4%BA%A7%E5%93%81.xlsx

使用工具:

  1. requests
  2. BeautifulSoup
    需要python环境并安装以下库,cmd下使用pip安装:
pip install requests
pip install beautifulsoup4

1. 导入库

import requests
from bs4 import BeautifulSoup
from tqdm import tqdm#进度条工具
import re
import pandas as pd

2. 获取每张表格所在的URL

  1. 用浏览器打开网页:http://www.nifdc.org.cn/directory/web/WS02/CL0108/,按F12使用开发者工具,点击图示按钮后再点到表格上查看表格对应的标签信息
    这里我们发现表格对应的标签id为tabel5,故用在BeautifulSoup对象中解析id = 'table5'
  2. 接下来在table5中查找所有的公示表格网页对应的链接url,在html中,使用标签a表示链接,因此这里我们使用table.find_all('a')。 查找到的每个链接i中url在属性'href',故i.attrs['href']即为跳转到的url,该网站的url使用的相对地址,因此要加上主站地址,最终是pageURL+i.attrs['href']
  3. 所有的URL使用字典保存,字典的key为上图中的签发日期,使用正则r'\d.*日'i.contents[0].contents[0]提取到相应的信息
def check_link(url):  try:            r = requests.get(url)  r.raise_for_status()  #抛出异常r.encoding = r.apparent_encoding  #解决编码问题return r.text  #读取文本多有r.text 读取图片多用r.content二进制except:  print('无法链接服务器!!!')    def get_urls_from_pageURL(pageURL):rs = check_link(pageURL)soup = BeautifulSoup(rs,'html.parser')table = soup.find(id='table5')urls = {re.search(r'\d.*日',i.contents[0].contents[0]).group(): pageURL+i.attrs['href'] for i in table.find_all('a')}#词典名为链接文本中的日期'\d.*日'匹配数字为开头以日为结束的日期如2018年6月1日至2018年6月15日#标签'a'为html中的链接'href'为链接值return urls
url_2018 = 'http://www.nifdc.org.cn/directory/web/WS02/CL0108/'
url_2017 = 'http://www.nifdc.org.cn/directory/web/WS02/CL0873/'
url_2016 = 'http://www.nifdc.org.cn/directory/web/WS02/CL0833/'urls = {}
for url in [url_2018,url_2017,url_2016]:urls.update(get_urls_from_pageURL(url))

3. 从URL读取公示数据

3.1 获取表格

这一步比较繁琐,因为数据涉及2016年到2018年的数据,存在以下问题:
1. 每张表格的列名不一定相同,如'序号''序 号''制品名称''产品名称'等。
2. 不同公示表格的信息列不同,如有的表格中含'批签发机构'有的则不含该项。
3. 列名不一定在第一行,可能在第若干行才是列名

%%time
df = pd.DataFrame()
for i,u in tqdm(enumerate(urls.keys())):d = pd.read_html(urls[u],header=0)[16]#经测试,网页中表格在第16个位置,header=0表示使用第0行做为列名d.rename(columns={'制品名称':'产品名称','序 号':'序号','批签发证号':'证书编号','批量/进口量':'签发量','报告书编号':'报告编号'},inplace=True)#第一遍爬取后发现表格中的列名存在异名,在此替换成同名if i > 0 :#i为0时df是空的#为了判断本次读取到的表格的列名是否是上次多数相同,不同年份的表格列数不同,故测试选择了大小为5x = set(d.columns.values)y = set(df.columns.values)if len(x.intersection(y)) < 5:#如果当前表格与以往表格列名重复度低于5则存在问题#列名不匹配有两种情况location = get_index(d,'制品名称')if location:#html表格元素有问题,列名不在第一行,在后面的某行d = d.iloc[location[0][0]:,location[0][1]:].reset_index(drop=True).T.set_index(0).T.reset_index(drop=True)d.rename(columns={'制品名称':'产品名称','序 号':'序号','批签发证号':'证书编号','批量/进口量':'签发量','报告书编号':'报告编号'},inplace=True)else:#根本不存在该表格print(u,d.shape,'error')continue    df = pd.concat([df,d])            

运行过程输出信息:

58it [06:44,  6.97s/it]
2016年9月16日至9月31日 (42, 10) error
59it [06:44,  6.86s/it]
2016年9月1日至9月15日 (42, 10) error
75it [08:32,  6.84s/it]
CPU times: user 5min 33s, sys: 1.33 s, total: 5min 35s
Wall time: 8min 32s

其中2016年9月的数据并没有直接贴到网站上,而是以附件形式上传的。

3.2 筛选长生公司的产品

df.dropna(how='all',axis=1,inplace=Tru
df.drop(['序号','拒签量'],axis=1,inplace=True)
df_cs = df.loc[df.生产企业.apply(lambda x:x.find('长生')>=0)]df.to_excel('20160101-20180724检验产品.xlsx',index=False,encoding='gbk')
df_cs.to_excel('长春长生公司产品.xlsx',index=False,encoding='gbk')

4. 数据分析

df_cs.产品名称.value_counts()对产品统计发现共有7种疫苗被批准:
1. 冻干人用狂犬病疫苗(Vero细胞)
2. 水痘减毒活疫苗
3. 冻干甲型肝炎减毒活疫苗
4. 吸附无细胞百白破联合疫苗
5. 冻干水痘减毒活疫苗
6. 流感病毒裂解疫苗
7. ACYW135群脑膜炎球菌多糖疫苗
pyecharts绘制长生公司批准个疫苗占比的饼状图:

致谢:
1. https://www.douban.com/note/683907959/
2. https://github.com/fuckcqcs/fuckcqcs/

python爬取长春长生2016-2018所有被批准疫苗批次相关推荐

  1. python爬取2345天气网上2011年-2018年历史天气

    由于学业需要,本文利用python爬取2345历史天气,爬取年份为2011年到2018年,由于网页格式以及自身编程水平有限,本文分成四个部分爬取2011~2018的历史天气,分别为:2011-2015 ...

  2. python爬取考研成绩什么时候出来_Python 爬取揭秘,你的考研调剂对手就有谁?...

    原标题:Python 爬取揭秘,你的考研调剂对手就有谁? [CSDN编者按]考研成绩揭晓后,不少考生都要面临调剂的问题.而宁夏大学曝出的新闻,也让考生对考研额外增加了一份焦虑.那么,在考研调剂中,你的 ...

  3. 学python能赚什么外卖-python爬取外卖

    广告关闭 腾讯云双11爆品提前享,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高满返5000元! time.sleep(1)d:pythonvenvscriptspython.ex ...

  4. python爬取mysql数据_Python爬取数据并写入MySQL数据库的实例

    Python爬取数据并写入MySQL数据库的实例 来源:中文源码网    浏览: 次    日期:2018年9月2日 [下载文档:  Python爬取数据并写入MySQL数据库的实例.txt ] (友 ...

  5. Python 爬取 B 站 5000 条视频,揭秘为何千万人为它流泪!

    [CSDN 编者按]<哪吒>看哭了无数人!编者看的那场,有很多小朋友,一开始他们还被太乙真人的滑稽,逗得哈哈笑.到了哪吒成魔要杀父亲.跪别父母.因为宿命不得以和敖丙为敌时,影院里突然安静下 ...

  6. python函数大全书籍京东_用python爬取京东图书排行榜并进行数据整合

    经常在京东买书,突发奇想,向看看京东畅销图书有哪些,于是,就有有了下面的代码. python版本:3.5 编辑器:jupyter 首页链接:http://book.jd.com/booktop/0-0 ...

  7. python爬取虎扑评论_Python爬取NBA虎扑球员数据

    虎扑是一个认真而有趣的社区,每天有众多JRs在虎扑分享自己对篮球.足球.游戏电竞.运动装备.影视.汽车.数码.情感等一切人和事的见解,热闹.真实.有温度. 受害者地址 https://nba.hupu ...

  8. python 爬取整部漫画(简单的图片爬取)

    用python爬取整部漫画 文章目录 用python爬取整部漫画 契机 收集信息  目录页   内容页 开始爬取   目录页   内容页 完整代码 契机 最近突然少女心爆棚,追上了一本甜甜的恋爱日漫& ...

  9. Python爬取整个网页的数据

    本案例是基于PyCharm开发的,也可以使用idea. 在项目内新建一个python文件Test.py Test.py # 导入urllib下的request模块 import urllib.requ ...

最新文章

  1. 数据库名、数据库实例、全局数据库名、服务名、SID等的区别
  2. 2015年12月流量入口占比动态:仅直接访问实现上涨
  3. No module named 'fcntl'
  4. pycharm short-cut
  5. 关于 Math.pow 的一个坑
  6. C/C++网络编程工作笔记0002---网络编程流程
  7. 我们是已经谈不起恋爱的80后
  8. 清除float浮动的几种方法
  9. HTML 列表 olullidldtdd
  10. 实对称矩阵的特征值求法_正交矩阵学习小结
  11. html公式输入空格,mathtype怎么在公式里加空格
  12. Android使用Zxing库生成PDF417扫描后多一个字符A
  13. 【魔兽世界插件】魔兽世界插件实战笔记从入门到放弃的心理历程 第六节 窗体对象的锚定
  14. 罗马音平假名中文可复制_日语五十音该怎么写呢?易混淆的五十音
  15. 天勤系列的考研复习资料
  16. 智能汽车能否真正实现无人驾驶,为什么?
  17. GPT-3、Stable Diffusion一起助攻,让模型听懂甲方修图需求
  18. 让别人远程访问你的代码网站项目或临时演示你的项目给客户的方式详解即外网局域网访问自己的项目
  19. 计算机硬件资源如何共享,如何设置计算机共享资源
  20. NYOJ273 字母小游戏

热门文章

  1. 手机APP分析平台项目(八)
  2. Joplin真正稳健的同步方法,joplin误删如何恢复
  3. 2023基于微信小程序的中医药配方+后台管理系统(SSM+mysql)-JAVA.VUE(论文+开题报告+运行)
  4. linux脚本批量加注释,shell中如何批量注释和取消注释
  5. scsi 驱动的host channel id lun在哪里看
  6. 春季高考计算机排名,2017年山东春季高考机电一体化类专业排名
  7. java调用b超_java开源中文分词-jcseg
  8. 关于这次KPL春季决赛的感悟
  9. IDEA中找不到tomcat
  10. linux动态调频响应时间,CPU动态调频(linux 3.14.0)一