当前位置:   article > 正文

爬虫项目(二)---采集从03月02号以来的世界各国疫情数据_黑马程序员疫情数据

黑马程序员疫情数据

该内容出自黑马程序员教程

采集从03月02号以来的世界各国疫情数据

步骤:
Ⅰ,重构项目(一)的代码,以提高扩展性

  1. 把功能封装到一个类中
  2. 每一个小功能变成一个方法
  3. 通过run方法启动爬虫
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()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58

在这里插入图片描述
很显然以达成原样的效果,重构完成

Ⅱ,实现采集从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()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105

这个json文件是各国的疫情数据:https://file1.dxycdn.com/2020/0315/831/3402160489185731552-135.json
在这里插入图片描述

在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/111535
推荐阅读
相关标签
  

闽ICP备14008679号