简单代码抓取全国实时疫情数据——小白爬虫实战(9)

优采云 发布时间: 2022-06-05 03:38

  简单代码抓取全国实时疫情数据——小白爬虫实战(9)

  七月以来,国内疫情又有反复,陆续有多个地方冒出本土确诊病例,一些地方被划为风险地区,涉及的地区也有逐渐增多的趋势,总而言之,疫情尚未结束,大家还是要做好个人防护。

  全国的疫情数据都是每日不断更新的,如果我们要搜集这些数据,传统的CV大法显然也是能解决问题的,但是还是那句话,“可以但没必要”。

  这节我们通过selenium,获取全国34个省级行政区的实时疫情数据。

  这里我们全国实时疫情数据的数据来源为百度的疫情实时大数据报告专题网页,链接为:

  

  百度疫情实时大数据报告页

  进入页面可以看见国内每日疫情的总体数据,顺着页面继续下拉,我们可以看到这么一张疫情分布地图:

  

  不要慌张,上图显示的现有确诊是指包含境外输入的现有确诊病例数,继续向下滑动页面,我们就可以找到对应的数据来源:

  

  上图被红框圈起来的“现有”列数据便是前文疫情分布地图所呈现的数据内容。展开这张“国内各地区疫情统计汇总”表的全部,可以看见该表数据包括了全国34个行政区的 新增病例、现有病例、累计病例、累计治愈、累计死亡 共五项数据。

  就以红框数据为例,如何将各地区的现有病例数据爬取下来呢?

  Selenium的优势就在于“可见即可得”,只要能看到的,就能给爬下来。

  通过分析Xpath可以清晰的看见,排在地区列第一行的台湾对应的Xpath为

  /html/body/div[2]/div/div/div/section/div[2]/div[4]/div[3]/div[4]/table/tbody/tr[1]/td[1]/div/span[2]

  而排在地区列最后一行的西藏对应的Xpath为

  /html/body/div[2]/div/div/div/section/div[2]/div[4]/div[3]/div[4]/table/tbody/tr[34]/td[1]/div/span[2]

  比对两个Xpath可以发现,除了标红的位置数字1变成了34,Xpath的其余部分都是一模一样的,可见这34个省级行政区地区名的Xpath就是这样按照1到34的顺序排下来。

  关于Xpath的分析方法,在往期的文章中已经提过,这里就不再赘述,有需要的小伙伴可以回顾

  同理,各地区的现有病例列也按照相同的套路,Xpath从1到34排下来:

  现有病例第一行Xpath:

  /html/body/div[2]/div/div/div/section/div[2]/div[4]/div[3]/div[4]/table/tbody/tr[1]/td[3]

  现有病例最后一行Xpath:

  /html/body/div[2]/div/div/div/section/div[2]/div[4]/div[3]/div[4]/table/tbody/tr[34]/td[3]

  找到了上面的规律,我们只需要用一个for循环,就可以构建出爬取对应地区现有确诊病例数据的代码:

  # 设定地区名空列表regions_list = []# 设定现有病例空列表existing_case_list = []<br /># 总共有34个省级行政区数据for i in range(34): # i输出的是int型的0至33 k = str(i + 1) # 获取地区名 region = driver.find_element_by_xpath( '/html/body/div[2]/div/div/div/section/div[2]/div[4]/div[3]/div[4]/table/tbody/tr[' + k + ']/td[1]/div/span[2]').text # 将获取的地区名加到地区名列表中 regions_list.append(region) # 获取各地现有病例数 existing_case = driver.find_element_by_xpath( '/html/body/div[2]/div/div/div/section/div[2]/div[4]/div[3]/div[4]/table/tbody/tr[' + k + ']/td[3]').text # 将获取的各地现有病例数加到现有病例列表中 existing_case_list.append(existing_case)print(regions_list)print(existing_case_list)

  上面便是获取全国实时疫情数据的核心代码部分,要想正确运行这串代码,我们还得事先声明模拟的浏览器类型,以及加载对应页的url。

  关于在使用selenium前的配置问题此处就不再赘述,有需要的小伙伴可参照往期内容:

  这里还需要注意的是,在模拟浏览器加载页面后,并没有直接开始for循环抓取数据,而是先做了一个模拟点击动作(第14行)

  import timefrom selenium import webdriver<br /># url为百度疫情实时大数据链接url = 'https://voice.baidu.com/act/newpneumonia/newpneumonia/?from=osari_aladin_banner'# 这里用的火狐option = webdriver.FirefoxOptions()option.add_argument('head')driver = webdriver.Firefox(options=option)driver.get(url)# 留足加载时间time.sleep(2)# 注意,需要模拟点击一下表才会展开全部数据driver.find_element_by_xpath( '/html/body/div[2]/div/div/div/section/div[2]/div[4]/div[3]/div[4]/div/span').click()

  这里的模拟点击动作实际上是完成表格底部的“展开”动作,因为34行数据太长,网页本身并没有全部显示,所以这里需要我们自己模拟点击一下将它展开。

  运行程序,就可以得到两个列表,一个列表是地名,一个列表是现有病例数,两个列表的元素位置是相对应的。

  

  运行结果

  有了这份数据,我们就可以利用pyecharts等方法制作如前文所示的疫情地图,也可以将数据写入csv保存至本地。

  pyecharts制图可参考往期内容

  同样的,如果我们不仅仅想要抓取现有病例数,想要抓取其它列的数据,甚至多列数据一起抓也很好办,只需要根据Xpath位置的不同作对应修改即可。

  后台发送关键词 “疫情数据抓取” 获取本文示例代码。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线