爬虫练习---爬取最新全球、全国及各省疫情数据(二):爬取1月23号以来各国疫情数据

一、工具:

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

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值