通过抓包获取疫情json数据,并使用Scrapy获取数据存储为csv格式,最后用Pandas进行数据处理生成图表

目录

引言

抓包与Scrapy

通过抓包获取json数据

通过Scrapy爬取json数据,并保存为csv格式

创建项目

书写代码

运行Scrapy

Pandas与Matplotlib

合并数据

 数据处理和生成图像

导入matplotlib.dates包

将日期列转换为日期时间类型(重要)

设置图表的x轴和y轴信息,并设置字体以便于显示中文和字符

设置x轴刻度间隔,间隔为3个月

生成图片(记得不要忘记加个close关闭)

生成出来的图片

 项目文件以及数据集


引言

临近期末,制作期末作业的同时发布第一篇博客练练手。知识点比较基础,面向新手,可能有些啰嗦,还望见谅。

我要爬取的数据为全国疫情数据(不含港澳台),记录了各个省份从2020年1月20日疫情爆发到2022年12月20日疫情结束每日新增、感染等数据。

由于疫情结束已过去半年,个别大的疫情信息公布平台已经关闭此功能(例:腾讯新闻),并且在网页上也不会显示每一天的数据,因此我选择抓包的方式从后台获取json数据。

抓包与Scrapy

通过抓包获取json数据

本次我选择的是从新浪新闻获取数据。由于我要获取的是各个省份的数据,所以并不能获取全国的json数据。我这里选择分别获取各省份的数据并进行拼接。打开新浪新闻的疫情专栏:

实时更新|新冠肺炎疫情地图

按下F12,打开网络(Network)选项,在下方“中国病例”点击想要获取的省份(例:北京)进入详情界面。注:要在开启网络选项的时候打开详情界面,或者在详情界面刷新也行

 进去以后右边就会显示数据,我们接下来就要寻找到后台获取的json数据,一般类型为xhr、script、json。找到以后打开,右边会跳出弹窗,我们复制Request URL中的链接,这个就是北京的json数据

 复制到网页上查看,historylist下的就是北京的历史数据

接下来,我们可以按照此方法接着获取其他省份的数据了,这里有个小方法,我们可以发现这段json数据链接中有很多相同的地方,因此我们可以按下ctrl+F打开搜索栏,把相同的前缀输入进去快速过滤

抓完包后就可以用scrapy进行爬取了,链接地址文章末尾我会跟代码一起打包放在百度网盘里

通过Scrapy爬取json数据,并保存为csv格式

详细的scrapy使用方法就不赘述,网上有很多的教程,我这里就简单说明一下,详情可看中文版的官方文档

Scrapy 教程 — Scrapy 2.5.0 文档 (osgeo.cn)

创建项目

新建一个文件夹,名称随便起,在文件夹中创建一个scrapy项目,win键+R键打开运行,输入cmd打开命令行(也可以像我一样点击pycharm下面的Terminal打开命令行),输入cd 文件夹根目录 来跳转到你的根目录,如果盘符不一样,如:命令行为C盘,但是项目根目录在D盘,可以输入D:切换盘符。之后的指令都会在你的根目录运行。

输入scrapy startproject tutorial 创建项目(tutorial为你自己要创建的项目名称)。我这里由于项目已经做好,就创建一个测试项目演示一下,效果如下。

PS:可以设置一下项目根目录,对着根目录如下点击Sources Root。

书写代码

接下来就可以开始写代码爬取数据了。

由于这个json数据比较规范,没有空格空行,因此我没有使用管道进行数据处理。所有我修改的文件只有items.py和settings.py,加上自己创建的一共有三个文件。

我在spiders文件夹中创建了一个名为covid的python文件,内容如下。

import json
import scrapy
from scrapy_covid.items import CovItem

class CovidSpider(scrapy.Spider):
    name = "covid"
    start_urls = ["https://gwpre.sina.cn/interface/news/ncp/data.d.json?mod=province&province=xizang&callback=_aProvinceFunction&_=1684801289292"]


    def parse(self, response):
        data = response.body.decode('utf-8')
        start_index = data.find('(') + 1
        end_index = data.rfind(')')
        json_data = json.loads(data[start_index:end_index])  # 将响应内容解析为JSON
        history_list = json_data['data']['historylist']  # 获取"historylist"字段的值


        # 循环写入每条数据
        for item in history_list:
            Item =CovItem()
            Item['日期'] = item['ymd']
            Item['累计确诊人数'] = item['conNum']
            Item['累计治愈人数'] = item['cureNum']
            Item['累计死亡人数'] = item['deathNum']
            Item['现存确诊人数'] = item['econNum']
            Item['无症状感染者人数'] = item['locAsymNum']
            Item['新增感染者人数'] = item['locIncrNum']
            Item['累计新增确诊人数'] = item['conadd']
            Item['累计新增治愈人数'] = item['cureadd']
            Item['累计新增死亡人数'] = item['deathadd']
            Item['疑似病例新增人数'] = item['susadd']
            Item['无症状感染者新增人数'] = item['asymptomadd']
            yield Item

name为你的项目标识,后续运行scrapy会用到它。

start_urls为你的json数据链接,我这里只写了一个,不知道写多个会不会一起运行,我没有尝试,因为我要为每个文件单独命名。

在items.py文件中设置item对象,我这里新建了一个名为CovItem的类。

# -*- coding: utf-8 -*-

# Define here the models for your scraped items
#
# See documentation in:
# https://docs.scrapy.org/en/latest/topics/items.html

import scrapy


class ScrapyCovidItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    pass


class CovItem(scrapy.Item):
    日期 = scrapy.Field()
    累计确诊人数 = scrapy.Field()
    累计治愈人数 = scrapy.Field()
    累计死亡人数 = scrapy.Field()
    现存确诊人数 = scrapy.Field()
    无症状感染者人数 = scrapy.Field()
    新增感染者人数 = scrapy.Field()
    累计新增确诊人数 = scrapy.Field()
    累计新增治愈人数 = scrapy.Field()
    累计新增死亡人数 = scrapy.Field()
    疑似病例新增人数 = scrapy.Field()
    无症状感染者新增人数 = scrapy.Field()

 接下来修改settings.py文件,需要修改的地方并不多。把“君子协议”ROBOTSTXT_OBEY改成False

ROBOTSTXT_OBEY = False

在前面一点的位置添加一行代码,他会影响生成csv的表头。

FEED_EXPORT_FIELDS = ['日期','累计确诊人数','累计治愈人数','累计死亡人数','现存确诊人数','无症状感染者人数','新增感染者人数','累计新增确诊人数','累计新增治愈人数','累计新增死亡人数','疑似病例新增人数','无症状感染者新增人数']

接下来就可以运行scrapy了。

运行Scrapy

依然是命令行跳转到根目录,输入

scrapy crawl covid -o 北京.csv 

covid为你创建文件中“name”的值

“北京”可根据你现在正在爬取的json数据进行更改,就是个csv文件名称。

回车后数据很快就出来了

然后我们可以依次修改start_urls的json地址

和运行代码的命名得到31个省份的csv数据。

Pandas与Matplotlib

现在我们可以对数据进行处理了,创建一个新的文件夹,名称自定,我创建的项目如下。

data:数据集存放的位置

image:一会生成图表存放的位置

covid.py:用来生成图表的文件

tocsv.py:用来合并数据的文件

合并数据

在tocsv.py文件中写入如下代码:

import glob
import os
import pandas as pd

if __name__ == '__main__':
    # 获取所有CSV文件的文件路径
    files = glob.glob('data/*.csv')

    # 创建一个空的DataFrame对象
    data = pd.DataFrame(columns=['省份', '日期', '累计确诊人数', '累计治愈人数', '累计死亡人数', '现存确诊人数', '无症状感染者人数', '新增感染者人数', '累计新增确诊人数', '累计新增治愈人数', '累计新增死亡人数', '疑似病例新增人数', '无症状感染者新增人数'])

    # 逐个读取CSV文件并合并到DataFrame对象中
    for file in files:
        province = os.path.splitext(os.path.basename(file))[0]  # 获取文件名作为省份变量的值
        df = pd.read_csv(file)
        df['省份'] = province  # 添加省份列
        data = pd.concat([data, df], ignore_index=True)
    # 保存合并后的数据到CSV文件
    data.to_csv('全国疫情数据.csv', index=False)

我们在原来数据的基础上新加了一个名为“省份”的表头,并通过os模块获取到文件的名称放入其中,最后我们可以保存为一个csv文件,一共三万多条数据。

 数据处理和生成图像

接下来我们就可以进行最后的生成图表了。

import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.dates as mdates

if __name__ == '__main__':
    # 加载数据
    file = pd.read_csv(
        './data/全国疫情数据.csv'
    )

    # 将日期列转换为日期时间类型
    file['日期'] = pd.to_datetime(file['日期'])


    # 全国每日新增感染者人数(1)
    x1 = file.groupby('日期')['新增感染者人数'].sum().reset_index()
    plt.plot(x1['日期'],x1['新增感染者人数'])
    plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
    plt.title('全国每日新增感染者人数')
    plt.xlabel('日期')
    plt.ylabel('新增感染者人数')

    # 设置x轴刻度间隔为每隔三个月
    ax = plt.gca()
    ax.xaxis.set_major_locator(mdates.MonthLocator(interval=3))
    plt.xticks(rotation=40)
    plt.tight_layout()
    plt.savefig(r'image/全国每日新增感染者人数.png', dpi=500)
    plt.close()


    # 全国每日现存确诊人数(2)
    x2 =file.groupby('日期')['现存确诊人数'].sum().reset_index()
    plt.plot(x2['日期'], x2['现存确诊人数'])
    plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
    plt.title('全国每日现存确诊人数')
    plt.xlabel('日期')
    plt.ylabel('现存确诊人数')

    # 设置x轴刻度间隔为每隔三个月
    ax = plt.gca()
    ax.xaxis.set_major_locator(mdates.MonthLocator(interval=3))
    plt.xticks(rotation=40)
    plt.tight_layout()
    plt.savefig(r'image/全国每日现存确诊人数.png', dpi=500)
    plt.close()


    # 全国每日现存无症状感染者人数(3)
    x3 = file.groupby('日期')['无症状感染者人数'].sum().reset_index()
    plt.plot(x3['日期'], x3['无症状感染者人数'])
    plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
    plt.title('全国每日现存无症状感染者人数')
    plt.xlabel('日期')
    plt.ylabel('无症状感染者人数')

    # 设置x轴刻度间隔为每隔三个月
    ax = plt.gca()
    ax.xaxis.set_major_locator(mdates.MonthLocator(interval=3))
    plt.xticks(rotation=40)
    plt.tight_layout()
    plt.savefig(r'image/全国每日现存无症状感染者人数.png', dpi=500)
    plt.close()


    # 全国每日疑似病例新增人数(4)
    x4 = file.groupby('日期')['疑似病例新增人数'].sum().reset_index()
    plt.plot(x4['日期'], x4['疑似病例新增人数'])
    plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']  # 用来正常显示中文标签以及负号
    plt.title('全国每日现存疑似病例新增人数')
    plt.xlabel('日期')
    plt.ylabel('疑似病例新增人数')

    # 设置x轴刻度间隔为每隔三个月
    ax = plt.gca()
    ax.xaxis.set_major_locator(mdates.MonthLocator(interval=3))
    plt.xticks(rotation=40)
    plt.tight_layout()
    plt.savefig(r'image/全国每日现存疑似病例新增人数.png', dpi=500)
    plt.close()

一共生成了四张图片,我放在后面展示。由于我x轴获取的是时间,全部按照默认显示的话会一片黑,什么也看不出来,因此我们改成3个月显示一次。

导入matplotlib.dates包

import matplotlib.dates as mdates

将日期列转换为日期时间类型(重要)

    # 将日期列转换为日期时间类型
    file['日期'] = pd.to_datetime(file['日期'])

设置图表的x轴和y轴信息,并设置字体以便于显示中文和字符

ps:由于最后一张图的数据含有复数,使用使用的字体与前面不一样,这点注意一下

# 全国每日新增感染者人数(1)
    x1 = file.groupby('日期')['新增感染者人数'].sum().reset_index()
    plt.plot(x1['日期'],x1['新增感染者人数'])
    plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
    plt.title('全国每日新增感染者人数')
    plt.xlabel('日期')
    plt.ylabel('新增感染者人数')

设置x轴刻度间隔,间隔为3个月

    # 设置x轴刻度间隔为每隔三个月
    ax = plt.gca()
    ax.xaxis.set_major_locator(mdates.MonthLocator(interval=3))
    plt.xticks(rotation=40)
    plt.tight_layout()

生成图片(记得不要忘记加个close关闭)

    plt.savefig(r'image/全国每日现存无症状感染者人数.png', dpi=500)
    plt.close()

剩下几张图都可以按着这种方法做,也可以自己改动

生成出来的图片

 

 

 项目文件以及数据集

链接:https://pan.baidu.com/s/1tu88qnU5fk95U5cl4UZdrw?pwd=xjn0 
提取码:xjn0 

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
XYT2000主要负责推荐模块的设计和部分的前后端工作 爬虫(Web Crawler)是一种自动化程序,用于从互联网上收集信息。其主要功能是访问网页、提取数据存储,以便后续分析或展示。爬虫通常由搜索引擎、数据挖掘工具、监测系统等应用于网络数据抓取的场景。 爬虫的工作流程包括以下几个关键步骤: URL收集: 爬虫从一个或多个初始URL开始,递归或迭代地发现新的URL,构建一个URL队列。这些URL可以通过链接分析、站点地图、搜索引擎等方式获取。 请求网页: 爬虫使用HTTP或其他协议向目标URL发起请求,获取网页的HTML内容。这通常通过HTTP请求库实现,如Python中的Requests库。 解析内容: 爬虫对获取的HTML进行解析,提取有用的信息。常用的解析工具有正则表达式、XPath、Beautiful Soup等。这些工具帮助爬虫定位和提取目标数据,如文本、图片、链接等。 数据存储: 爬虫将提取的数据存储数据库、文件或其他存储介质中,以备后续分析或展示。常用的存储形式包括关系型数据库、NoSQL数据库、JSON文件等。 遵守规则: 为避免对网站造成过大负担或触发反爬虫机制,爬虫需要遵守网站的robots.txt协议,限制访问频率和深度,并模拟人类访问行为,如设置User-Agent。 反爬虫应对: 由于爬虫的存在,一些网站采取了反爬虫措施,如验证码、IP封锁等。爬虫工程师需要设计相应的策略来应对这些挑战。 爬虫在各个领域都有广泛的应用,包括搜索引擎索引、数据挖掘、价格监测、新闻聚合等。然而,使用爬虫需要遵守法律和伦理规范,尊重网站的使用政策,并确保对被访问网站的服务器负责。
### 回答1: 使用Scrapy框架可以轻松地抓取数据并将其保存为CSV格式。以下是具体步骤: 1. 创建一个Scrapy项目并定义要抓取的网站。 2. 编写Spider,定义如何抓取数据。 3. 在Item中定义要保存的数据字段。 4. 编写Pipeline,将数据保存为CSV格式。 5. 在settings.py中启用Pipeline。 6. 运行Scrapy爬虫,数据将被抓取并保存为CSV格式。 总之,使用Scrapy框架抓取数据并保存为CSV格式非常简单,只需按照上述步骤操作即可。 ### 回答2: Scrapy是一个开源的Python Web爬虫框架,可以用于抓取互联网上的数据,可以自动化地将其整理、处理和保存为所需的格式。其中,CSV(comma-separated values)是一种常见的数据格式,用于在不同的程序之间共享、导入和导出数据。下面是使用Scrapy框架抓取数据并保存为CSV格式的步骤: 1. 安装 Scrapy:可以通过pip安装 ```python pip install scrapy ``` 2. 创建 Scrapy 项目:在命令行下输入以下命令 ```python scrapy startproject projectname ``` 其中,projectname是你的项目名称。 3. 创建 Scrapy Spider:在项目中创建一个spider以定义从哪里收集数据和如何处理数据。在命令行下输入以下命令: ```python scrapy genspider spidername domain.com ``` 其中,spidername是你的spider名称,domain.com是你要爬取的网站地址。 4. 修改 Spider,添加Spider代码:打开你的spider,并为其添加必要的代码。Scrapy的spider使用XPath或CSS选择器来提取需要的数据。 ```python import scrapy class MySpider(scrapy.Spider): name = 'myspider' start_urls = ['http://www.example.com'] def parse(self, response): data = response.xpath('//div[@class="myclass"]') for item in data: yield { 'title': item.xpath('a/text()').extract_first(), 'link': item.xpath('a/@href').extract_first() } ``` 在这个例子中,我们在网页中找到所有的div,然后提取每个div中的标题和链接 5. 存储数据:在Scrapy的settings.py文件中,您可以将文件名和数据保存路径设置为.csv文件。默认情况下,Scrapy会以.json格式存储数据。为了更改默认设置,只需将以下字段添加到settings.py文件: ```python FEED_FORMAT = 'csv' FEED_URI = 'file:///path/to/file.csv' ``` 在上面的示例中,我们将数据保存到名为file.csv文件中。只需替换实际的路径,即可将数据保存到所需的位置。 6. 运行Spider:在命令行中运行以下命令,运行spider并将数据保存为csv格式 ```python scrapy crawl spidername -o file.csv ``` 必须将示例中的spidername替换为实际的spider名称。-o标志是用于指定要将数据保存到的文件名。 Scrapy框架使数据抓取变得更容易,它包含许多内置的功能,例如Cookies管理、重定向管理、HTTP缓存等。 Scrapy的另一个优点是可以自定义处理程序,例如可以通过将数据保存为CSV格式,将数据提供给其他程序使用。 ### 回答3: Scrapy是一个开源的Python框架,用于从网站上抓取数据进行爬取。 Scrapy可以跨越多个页面爬取数据,还可以在爬取过程中对数据进行处理和过滤。 使用Scrapy框架抓取数据并保存为csv格式,需要以下步骤: 1、安装Scrapy框架和相关依赖包,如lxml、twisted等。 2、创建一个Scrapy项目。可以使用命令scrapy startproject projectname来创建一个Scrapy项目,其中projectname为项目的名称。 3、编写爬虫代码。在Scrapy项目中,可以通过编写一个爬虫代码来定义爬取的规则,包括如何访问网站、如何获取页面、如何解析页面以及如何存储数据等。 4、设置ITEM_PIPELINES。 Scrapy提供了一种称为ITEM_PIPELINES的机制,可以将获取到的数据在不同的程序中进行处理和过滤。可以通过设置ITEM_PIPELINES来指定将数据存储csv格式。 5、保存数据csv格式。在Scrapy项目中,可以使用Python内置的csv库将数据存储csv格式。编写一个csv导出器,将爬取的数据保存为csv格式文件。 通过以上步骤,就可以使用Scrapy框架抓取数据并将其保存为csv格式了。Scrapy不仅可以抓取纯文本数据,还可以抓取图片、视频等多媒体数据。如果想要将数据存储到MySQL或MongoDB数据库中,可以使用Scrapy提供的数据库管理功能,直接将数据写入数据进行存储Scrapy框架的优点是速度快、可扩展性强、对异步支持好等,它在数据抓取方面有很大的优势。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值