赞
踩
步骤:
Ⅰ,重构项目(一)的代码,以提高扩展性
import requests import re import json from bs4 import BeautifulSoup 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 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(self): #采集最近一天各国疫情信息 #1,发送请求,获取首页内容 home_page = self.get_content_from_url(self.home_url) #2,解析首页内容,获取最近一天的各国疫情数据 last_data = self.parse_home_page(home_page) #3,保存数据 self.save(last_data,'E:\Jupyter_workspace\study\python\爬虫\last_day_nature_num1.json') def run(self): self.crawl_last_day() if __name__ == '__main__': spider = CoronaSpider() spider.run()
很显然以达成原样的效果,重构完成
Ⅱ,实现采集从03月02号以来的世界各国疫情数据
加载最近一日各国疫情数据
遍历各国疫情数据,获取从03月02号以来的世界各国疫情的URL
发送请求,获取从03月02号以来的世界各国疫情的json字符串
解析各个国家疫情的json字符串,转化为Python类型数据,添加到列表中
将该列表以json格式保存从03月02号以来的世界各国疫情数据信息
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 data def 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 这个ensure_ascii是dump方法的属性控制编码,为了显示汉字,我这边运行一直保存,没法用这个编码格式,故这里去掉了,当然要是显示汉字,可以加上 ''' 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): #采集从03月02号以来的世界各国疫情数据 #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) #定义列表,用于存储各国从03月02号以来的疫情数据 corona_virus = [] #2,遍历各国疫情数据,获取从03月02号以来的世界各国疫情的URL for country in tqdm(last_day_corona_virus,'获取从01月23号以来的世界各国疫情信息'): statustics_data_url = country['statisticsData'] #3,发送请求,获取从03月02号以来的世界各国疫情的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 run(self): #self.crawl_last_day_corona_virus() self.crawl_corona_virus() if __name__ == '__main__': spider = CoronaSpider() spider.run()
这个json文件是各国的疫情数据:https://file1.dxycdn.com/2020/0315/831/3402160489185731552-135.json
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。