概述
一、工具:
requests
BeautifulSoup
tqdm 用来显示采集进度
url: https://ncov.dxy.cn/ncovh5/view/pneumonia
二、网页分析:
在最近一日各国疫情数据中,各国数据以字典形式存在于列表当中,每个字典中包含该国家的历史疫情数据URL。
整体思路:
1、加载最近一日各国疫情数据
2、遍历上述列表,获取每个国家历史疫情URL
3、调用爬取函数爬取内容
三、代码:
因为针对每个URL的爬取过程是一样的,所以将之前爬取最近一日各国疫情的代码封装一下,这样更简洁、方便。
封装:
import requests
from bs4 import BeautifulSoup
import json
import re
from tqdm import tqdm
class CoronaVirusSpider(object):
def __init__(self):
self.home_url = 'https://ncov.dxy.cn/ncovh5/view/pneumonia'
def get_content_from_url(self, url):
"""
根据URL获取响应内容的字符串数据
:param url: 请求的URL
:return: 响应内容的字符串
"""
response = requests.get(url) # <Response [200]>
return response.content.decode()
def parse_home_page(self, home_page):
"""
解析首页内容,获取解析后的python数据
:param home_page: 首页内容
:return: 解析后的puthon数据
"""
# 2.从疫情首页,提取最近一日各国疫情数据
soup = BeautifulSoup(home_page, 'lxml') # soup和home_page区别不大
script = soup.find(id="getListByCountryTypeService2true")
text = script.contents
# 3.从疫情数据中,获取json格式的字符串
json_str = re.findall(r'[.+]', text[0])[0]
# 4.把json格式的字符串转换为Python类型
data = json.loads(json_str)
return data
def save(self, data, path):
# 5.以json格式保存最近一日各国疫情数据
with open(path, 'w') as fp:
json.dump(data, fp, ensure_ascii=False)
def crawl_last_day_corona_virus(self):
"""
采集最近一天的各国疫情信息
:return:
"""
# 1.发送请求,获取首页内容
home_page = self.get_content_from_url(self.home_url)
# 2.解析首页内容,获取最近一天的各国疫情数据
last_day_corona_virus = self.parse_home_page(home_page)
# 3.保存数据
self.save(last_day_corona_virus, 'data/last_day_corona_virus.json')
def run(self):
self.crawl_last_day_corona_virus()
if __name__ == '__main__':
spider = CoronaVirusSpider()
spider.run()
加载data/last_day_corona_virus.json文件,遍历爬取各国历史疫情数据:
def crawl_corona_virus(self):
"""
采集从1月23号以来各国疫情数据
:return:
"""
# 1.加载各国疫情数据
with open('data/last_day_corona_virus.json') as fp:
last_day_corona_virus = json.load(fp)
# 定义列表,用于存储各国从1月23号至今的json数据
corona_virus_data = []
# 2.遍历各国疫情数据,获取统计的URL,tqdm用来显示采集进度
for country in tqdm(last_day_corona_virus, '采集1月23号以来各国疫情数据'):
# 3.发送请求,获取各国从1月23号至今的json数据
statistics_data_url = country['statisticsData']
statistics_data_json_str = self.get_content_from_url(statistics_data_url)
# print(statistics_data_json_str)
# 4.把json数据转换为Python类型数据,添加列表中
statistics_data = json.loads(statistics_data_json_str)['data']
# print(statistics_data)
for one_day in statistics_data:
one_day['provinceName'] = country['provinceName']
one_day['countryShortCode'] = country['countryShortCode']
# print(statistics_data)
corona_virus_data.extend(statistics_data)
# 5.把列表以json格式保存为文件
self.save(corona_virus_data, 'data/corona_virus_data.json')
完整代码:
import requests
from bs4 import BeautifulSoup
import json
import re
from tqdm import tqdm
class CoronaVirusSpider(object):
def __init__(self):
self.home_url = 'https://ncov.dxy.cn/ncovh5/view/pneumonia'
def get_content_from_url(self, url):
"""
根据URL获取响应内容的字符串数据
:param url: 请求的URL
:return: 响应内容的字符串
"""
response = requests.get(url) # <Response [200]>
return response.content.decode()
def parse_home_page(self, home_page):
"""
解析首页内容,获取解析后的python数据
:param home_page: 首页内容
:return: 解析后的puthon数据
"""
# 2.从疫情首页,提取最近一日各国疫情数据
soup = BeautifulSoup(home_page, 'lxml') # soup和home_page区别不大
script = soup.find(id="getListByCountryTypeService2true")
text = script.contents
# 3.从疫情数据中,获取json格式的字符串
json_str = re.findall(r'[.+]', text[0])[0]
# 4.把json格式的字符串转换为Python类型
data = json.loads(json_str)
return data
def save(self, data, path):
# 5.以json格式保存最近一日各国疫情数据
with open(path, 'w') as fp:
json.dump(data, fp, ensure_ascii=False)
def crawl_last_day_corona_virus(self):
"""
采集最近一天的各国疫情信息
:return:
"""
# 1.发送请求,获取首页内容
home_page = self.get_content_from_url(self.home_url)
# 2.解析首页内容,获取最近一天的各国疫情数据
last_day_corona_virus = self.parse_home_page(home_page)
# 3.保存数据
self.save(last_day_corona_virus, 'data/last_day_corona_virus.json')
def crawl_corona_virus(self):
"""
采集从1月23号以来各国疫情数据
:return:
"""
# 1.加载各国疫情数据
with open('data/last_day_corona_virus.json') as fp:
last_day_corona_virus = json.load(fp)
# 定义列表,用于存储各国从1月23号至今的json数据
corona_virus_data = []
# 2.遍历各国疫情数据,获取统计的URL,tqdm用来显示采集进度
for country in tqdm(last_day_corona_virus, '采集1月23号以来各国疫情数据'):
# 3.发送请求,获取各国从1月23号至今的json数据
statistics_data_url = country['statisticsData']
statistics_data_json_str = self.get_content_from_url(statistics_data_url)
# print(statistics_data_json_str)
# 4.把json数据转换为Python类型数据,添加列表中
statistics_data = json.loads(statistics_data_json_str)['data']
# print(statistics_data)
for one_day in statistics_data:
one_day['provinceName'] = country['provinceName']
one_day['countryShortCode'] = country['countryShortCode']
# print(statistics_data)
corona_virus_data.extend(statistics_data)
# 5.把列表以json格式保存为文件
self.save(corona_virus_data, 'data/corona_virus_data.json')
def run(self):
self.crawl_last_day_corona_virus()
self.crawl_corona_virus()
if __name__ == '__main__':
spider = CoronaVirusSpider()
spider.run()
数据爬取进度,一共有215个国家和地区:
数据内容:
我的博客:
http://www.chencdd.com/article/2020/10/29/8.html
最后
以上就是舒适大侠为你收集整理的爬虫练习---爬取最新全球、全国及各省疫情数据(二):爬取1月23号以来各国疫情数据的全部内容,希望文章能够帮你解决爬虫练习---爬取最新全球、全国及各省疫情数据(二):爬取1月23号以来各国疫情数据所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复