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"
感谢大家观看,有钱的老板可以打赏一下小编哦!
扫描下方二维码,关注公众号
参考资料: