python爬取WHO全球疫情数据

python讨论qq群:996113038


导语

    以武汉为中心的全国保卫战已经基本胜利,而国外的疫情发展开始愈演愈烈。很多小伙伴想要了解全球的疫情数据,所以这次我们来爬取一下世卫组织官网上的疫情pdf,以及几个主要国家从1月22到现在的数据。

    爬取的网页主要有两个:

 

https://www.who.int/emergencies/diseases/novel-coronavirus-2019/situation-reports
https://experience.arcgis.com/experience/685d0ace521648f8a5beeeee1b9125cd

代码及相关资源获取

1:关注“python趣味爱好者”公众号,回复“  code4 ”获取源代码

2:加入群聊:996113038。在群文件中下载源代码以及相关资料。


开发工具

python3.6.4

相关第三方库:

BeautifulSoup
pandas
json
time

效果演示

全部下载完成后目录图片

pdf图片示例:

csv数据示例:


基本原理

    首先我们进入situation reports页面,可以看到中间全部是pdf的超链接,通过观察代码我们可以发现规律。

然后我们使用beautifulsoup来提取a标签内容

datas = soup.select('div#PageContent_C006_Col01 > div.sf-content-block.content-block > div a')

接下来我们循环获取每个a标签内容,并下载对应的pdf文件

    for data in datas:
        downloadUrl = 'https://www.who.int' + data['href'] #下载路径
        try:
            r = requests.get(downloadUrl)
            pdf = r.content  # 响应的二进制文件
            if (data.get_text()):
                with open(data.get_text() + ".pdf", 'wb') as f:  # 二进制写入
                    f.write(pdf)
                    print(data.get_text() + ".pdf" + "下载成功")
        except requests.exceptions.ConnectionError:
            r.status_code = "Connection refused"

然后我们开始爬取各国近段时间的疫情数据。

https://experience.arcgis.com/experience/685d0ace521648f8a5beeeee1b9125cd

在这个网页右侧我们可以看到各国名字

于是我们打开F12进行抓包

以意大利为例,我们可以看到这就是我们想要的数据,多观察几个国家我们可以发现各个国家的数据文件有一个共同规律

        url = 'https://services.arcgis.com/5T5nSi527N4F7luB/arcgis/rest/services/Historic_adm0_v3/FeatureServer/0/query?f=json&where=ADM0_NAME%3D%27' + name + '%27&returnGeometry=false&spatialRel=esriSpatialRelIntersects&outFields=OBJECTID%2CNewCase%2CDateOfDataEntry&orderByFields=DateOfDataEntry%20asc&resultOffset=0&resultRecordCount=2000&cacheHint=true'

所以循环将数据文件爬取下来,然后利用pandas转为csv文件即可

def getDatas():
    global res
    for name in ['China', 'Italy', 'Spain', 'France', 'Germany', 'Switzerland', 'Netherlands', 'Norway', 'Belgium', 'Sweden', 'Australia', 'Brazil', 'Egypt']:


        url = 'https://services.arcgis.com/5T5nSi527N4F7luB/arcgis/rest/services/Historic_adm0_v3/FeatureServer/0/query?f=json&where=ADM0_NAME%3D%27' + name + '%27&returnGeometry=false&spatialRel=esriSpatialRelIntersects&outFields=OBJECTID%2CNewCase%2CDateOfDataEntry&orderByFields=DateOfDataEntry%20asc&resultOffset=0&resultRecordCount=2000&cacheHint=true'
        html = json.loads(openUrl(url))
        conserve(html, name)
        print(name+"疫情数据下载成功")


    #America 单独拿出来
    name = 'America'
    url = 'https://services.arcgis.com/5T5nSi527N4F7luB/arcgis/rest/services/Historic_adm0_v3/FeatureServer/0/query?f=json&where=ADM0_NAME%3D%27United%20States%20of%20America%27&returnGeometry=false&spatialRel=esriSpatialRelIntersects&outFields=OBJECTID%2Ccum_conf%2CDateOfDataEntry&orderByFields=DateOfDataEntry%20asc&resultOffset=0&resultRecordCount=2000&cacheHint=true'
    html = json.loads(openUrl(url))
    conserve(html, name)
    print(name + "疫情数据下载成功")
    res['Datetime'] = pd.date_range(start='20200122', end=timeStamp(res.index.get_level_values(0).values[-1]))
    res.to_csv('Datas.csv', encoding='utf_8_sig')

部分代码

下面是获取pdf函数代码:

def getPdfs():
    url = "https://www.who.int/emergencies/diseases/novel-coronavirus-2019/situation-reports"
    strhtml=requests.get(url)
    soup=BeautifulSoup(strhtml.text,'lxml')
    datas = soup.select('div#PageContent_C006_Col01 > div.sf-content-block.content-block > div a')
    for data in datas:
        downloadUrl = 'https://www.who.int' + data['href'] #下载路径
        try:
            r = requests.get(downloadUrl)
            pdf = r.content  # 响应的二进制文件
            if (data.get_text()):
                with open(data.get_text() + ".pdf", 'wb') as f:  # 二进制写入
                    f.write(pdf)
                    print(data.get_text() + ".pdf" + "下载成功")
        except requests.exceptions.ConnectionError:
            r.status_code = "Connection refused"


              

感谢大家观看,有钱的老板可以打赏一下小编哦!

扫描下方二维码,关注公众号

参考资料:

  • 5
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值