该内容出自黑马程序员教程
采集最近一日全国各省疫情数据
当然,数据来源仍然是丁香园新型冠状病毒肺炎疫情实时动态首页
url:https://ncov.dxy.cn/ncovh5/view/pneumonia
思路:首先需要先确定全国各省疫情数据的位置
全国各省份的疫情数据信息都在id="getAreaStat"
步骤:
- 发送请求,获取疫情首页内容
- 解析疫情首页内容,获取最近一日各省疫情信息
- 以json格式保存疫情信息
import requests
import re
import json
from bs4 import BeautifulSoup
from tqdm import tqdm#进度条class CoronaSpider(object):def __init__(self):self.home_url = 'https://ncov.dxy.cn/ncovh5/view/pneumonia'def get_content_from_url(self,url):#根据URL获取响应内容的字符串数据#URL:请求的URL#返回:响应内容的字符串response = requests.get(url)return response.content.decode()def parse_home_page(self,home_page): #解析首页内容,获取解析后的Python数据#home_page:首页内容#返回:解析后的Python类型数据#2,从疫情首页提取最近一日各国疫情数据soup = BeautifulSoup(home_page,'lxml')script = soup.find(id='getListByCountryTypeService2true')text = script.text#print(text)#3,从疫情数据中获取json格式的字符串json_str = re.findall(r'\[.+\]',text)[0]#由于中括号是个特殊的字符,需要在前面加个转义符;最后的结果会存在列表中,故使用[0]来获取完整json格式#print(json_str)#4,把json格式的字符串转换为Python类型data = json.loads(json_str)#print(last_day_nature_num)return datadef save(self,data,path):#5,以json格式保存最近一日各国疫情数据with open(path,'w') as fp:json.dump(data,fp)#,ensure_ascii=Falsec'''def save(self,data):#5,以json格式保存最近一日各国疫情数据with open('yy1.json','w') as fp:json.dump(data,fp)#,ensure_ascii=False'''def crawl_last_day_corona_virus(self):#采集最近一天各国疫情信息#1,发送请求,获取首页内容home_page = self.get_content_from_url(self.home_url)#2,解析首页内容,获取最近一天的各国疫情数据last_data_corona_virus = self.parse_home_page(home_page)#3,保存数据self.save(last_data_corona_virus,'E:\Jupyter_workspace\study\python\爬虫\last_day_nature_num111.json')def crawl_corona_virus(self):#采集从01月23号以来的世界各国疫情数据#1,加载最近一日各国疫情数据#with open('yy1.json') as fp:with open('E:\Jupyter_workspace\study\python\爬虫\last_day_nature_num111.json') as fp:last_day_corona_virus = json.load(fp)#print(last_day_corona_virus)#定义列表,用于存储各国从1月23号以来的疫情数据corona_virus = []#2,遍历各国疫情数据,获取从01月23号以来的世界各国疫情的URLfor country in tqdm(last_day_corona_virus,'获取从01月23号以来的世界各国疫情信息'):statustics_data_url = country['statisticsData']#3,发送请求,获取从01月23号以来的世界各国疫情的json字符串statustics_data_json_str = self.get_content_from_url(statustics_data_url)#4,解析各个国家疫情的json字符串,转化为Python类型数据,添加到列表中statustics_data = json.loads(statustics_data_json_str)['data']#print(statustics_data)for one_day in statustics_data:#statustics_data这个数据里面没有国家的一些信息,需要补充上去one_day['provinceName'] = country['provinceName']one_day['countryShortCode'] = country['countryShortCode']#print(statustics_data)corona_virus.extend(statustics_data)#把每个国家的疫情信息statustics_data,都添加到一个大的corona_virus列表里面#5,将该列表以json格式保存从01月23号以来的世界各国疫情数据信息self.save(corona_virus,'E:\Jupyter_workspace\study\python\爬虫\corona_virus.json')def craw_last_day_corona_virus_of_china(self):#采集最近一日国内各省疫情数据#1,发送请求,获取疫情首页信息home_page = self.get_content_from_url(self.home_url)#2,解析疫情首页信息,获取最近一日各省疫情数据soup = BeautifulSoup(home_page,'lxml')script = soup.find(id='getAreaStat')text = script.text#print(text)#从疫情数据中获取json格式的字符串json_str = re.findall(r'\[.+\]',text)[0]#由于中括号是个特殊的字符,需要在前面加个转义符;最后的结果会存在列表中,故使用[0]来获取完整json格式#print(json_str)#把json格式的字符串转换为Python类型data = json.loads(json_str)#print(last_day_nature_num)#3,保存疫情数据self.save(data,'E:\Jupyter_workspace\study\python\爬虫\craw_last_day_corona_virus_of_china.json')def run(self):#self.crawl_last_day_corona_virus()#self.crawl_corona_virus()self.craw_last_day_corona_virus_of_china()if __name__ == '__main__':spider = CoronaSpider()spider.run()
很显然,这里的craw_last_day_corona_virus_of_china和parse_home_page有的步骤是相同的,接下来开始代码的重构进行优化
import requests
import re
import json
from bs4 import BeautifulSoup
from tqdm import tqdm#进度条class CoronaSpider(object):def __init__(self):self.home_url = 'https://ncov.dxy.cn/ncovh5/view/pneumonia'def get_content_from_url(self,url):#根据URL获取响应内容的字符串数据#URL:请求的URL#返回:响应内容的字符串response = requests.get(url)return response.content.decode()def parse_home_page(self,home_page,tag_id): #解析首页内容,获取解析后的Python数据#home_page:首页内容#返回:解析后的Python类型数据#2,从疫情首页提取最近一日各国疫情数据soup = BeautifulSoup(home_page,'lxml')script = soup.find(id=tag_id)text = script.text#print(text)#3,从疫情数据中获取json格式的字符串json_str = re.findall(r'\[.+\]',text)[0]#由于中括号是个特殊的字符,需要在前面加个转义符;最后的结果会存在列表中,故使用[0]来获取完整json格式#print(json_str)#4,把json格式的字符串转换为Python类型data = json.loads(json_str)#print(last_day_nature_num)return datadef save(self,data,path):#5,以json格式保存最近一日各国疫情数据with open(path,'w') as fp:json.dump(data,fp)#,ensure_ascii=Falsec'''def save(self,data):#5,以json格式保存最近一日各国疫情数据with open('yy1.json','w') as fp:json.dump(data,fp)#,ensure_ascii=False'''def crawl_last_day_corona_virus(self):#采集最近一天各国疫情信息#1,发送请求,获取首页内容home_page = self.get_content_from_url(self.home_url)#2,解析首页内容,获取最近一天的各国疫情数据last_data_corona_virus = self.parse_home_page(home_page,tag_id='getListByCountryTypeService2true')#3,保存数据self.save(last_data_corona_virus,'E:\Jupyter_workspace\study\python\爬虫\last_day_nature_num111.json')def crawl_corona_virus(self):#采集从01月23号以来的世界各国疫情数据#1,加载最近一日各国疫情数据#with open('yy1.json') as fp:with open('E:\Jupyter_workspace\study\python\爬虫\last_day_nature_num111.json') as fp:last_day_corona_virus = json.load(fp)#print(last_day_corona_virus)#定义列表,用于存储各国从1月23号以来的疫情数据corona_virus = []#2,遍历各国疫情数据,获取从01月23号以来的世界各国疫情的URLfor country in tqdm(last_day_corona_virus,'获取从01月23号以来的世界各国疫情信息'):statustics_data_url = country['statisticsData']#3,发送请求,获取从01月23号以来的世界各国疫情的json字符串statustics_data_json_str = self.get_content_from_url(statustics_data_url)#4,解析各个国家疫情的json字符串,转化为Python类型数据,添加到列表中statustics_data = json.loads(statustics_data_json_str)['data']#print(statustics_data)for one_day in statustics_data:#statustics_data这个数据里面没有国家的一些信息,需要补充上去one_day['provinceName'] = country['provinceName']one_day['countryShortCode'] = country['countryShortCode']#print(statustics_data)corona_virus.extend(statustics_data)#把每个国家的疫情信息statustics_data,都添加到一个大的corona_virus列表里面#5,将该列表以json格式保存从01月23号以来的世界各国疫情数据信息self.save(corona_virus,'E:\Jupyter_workspace\study\python\爬虫\corona_virus.json')def craw_last_day_corona_virus_of_china(self):#采集最近一日国内各省疫情数据#1,发送请求,获取疫情首页信息home_page = self.get_content_from_url(self.home_url)craw_last_day_corona_virus_of_china = self.parse_home_page(home_page,tag_id='getAreaStat')'''#2,解析疫情首页信息,获取最近一日各省疫情数据soup = BeautifulSoup(home_page,'lxml')script = soup.find(id='getAreaStat')text = script.text#print(text)#从疫情数据中获取json格式的字符串json_str = re.findall(r'\[.+\]',text)[0]#由于中括号是个特殊的字符,需要在前面加个转义符;最后的结果会存在列表中,故使用[0]来获取完整json格式#print(json_str)#把json格式的字符串转换为Python类型data = json.loads(json_str)#print(last_day_nature_num)'''#3,保存疫情数据self.save(craw_last_day_corona_virus_of_china,'E:\Jupyter_workspace\study\python\爬虫\craw_last_day_corona_virus_of_china.json')def run(self):#self.crawl_last_day_corona_virus()#self.crawl_corona_virus()self.craw_last_day_corona_virus_of_china()if __name__ == '__main__':spider = CoronaSpider()spider.run()
raw_last_day_corona_virus_of_china.json
文件内容如下:
这里的编码格式没有改变,故各个国家的汉字名称没有出现
https://file1.dxycdn.com/2020/0223/331/3398299755968040033-135.json
该json文件中存放着全国各个省的疫情数据信息。
爬虫项目(四)中会用到该信息。