爬取最新疫情信息
目录
爬取最新疫情信息
一、选题的背景
二、主题式网络爬虫设计方案
三、主题页面的结构特征分析
四、网络爬虫程序设计
五、数据分析
一、选题的背景
为什么要选择此选题?
由于疫情原因的影响,世界各地都因为新型冠状病毒(简称新冠肺炎)而陷入种种危机。因此,对于现存国内的疫情数据我进行了一个爬取和一些数据分析,更加直观的查看出国内现存疫情的情况。
让现在在社会上经常流通的人们加强防范意识,了解现存哪些地区风险较高,出行进行防护。在外出差、走生意的人也更加了解到各地的疫情情况,尽量避免高危地区出行!
数据来源:一点资讯。
网址:24小时滚动播报全国最新疫情 (yidianzixun.com)
二、主题式网络爬虫设计方案
1.主题式网络爬虫名称
Python网络爬虫———现存疫情数据爬取及分析
2.主题式网络爬虫爬取的内容与数据特征分析
爬取现存疫情数据并进行处理
3.主题式网络爬虫设计方案概述
先确定主题,爬取现存疫情数据,设计爬取程序进行爬取,并以excel形式储存,然后利用pandas库进行数据分析和清洗,再利用Matplotlib等库进行图形图像绘制。最后保存数据。 使用到的模块:
requests:模拟网络连接,发送请求,获取网页内容
json:第三方库,对爬取的数据编解码
xlrd:第三方库,读取excel文件
xlwt:第三方库,写入excel文件
我们把代码分为几个个模块爬取模块(),存储模块(),分析模块()
三、主题页面的结构特征分析
1.主题页面的结构与特征分析
首页与信息集
2.开发者工具进行抓包
3.获取url
4.获取请求头headers
5.拿到response数据
6.在线解析拿到的response数据
7.找到要获取的信息
四、网络爬虫程序设计
1.数据爬取与采集
用到的库
import json#转换成字符串 import pandas as pd import requests#对爬取的网站发出请求 import sys#系统库 import xlrd#对爬取的excel进行查取与搜索 import xlwt#进行excel操作 import matplotlib.pyplot as plt#数据处理绘图工具
开发者工具进行抓包,分析url和发送的请求(上面的图可以看出是get请求),再拿到user-agent
信息,装成字典,模拟成浏览器,最后将服务器响应的数据转为文档(pa_text = resp.text)
这时拿到的是字符串,利用json库里的json.loads()用法将字符串转化为python里的字典(下面图2)可以发现页面中只有省的信息,而在服务器返回给我们的数据中还有每个市级的信息
import json#转换成字符串
import pandas as pd#数据分析
import requests#对爬取的网站发出请求
import DataStorage
def main():
#爬取的网页链接
url = 'https://m.yidianzixun.com/hybrid/req?url=https%3A%2F%2Fa1.go2yd.''com%2FWebsite%2Fproxy%2Fget-epidemic-data%3Ffrom%3Dtools%26province_name%3D%25E5%2585%25A8%25E5%259B%25BD'
#模拟浏览器头部信息,向服务器发送消息
headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)''AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Safari/537.36'}
resp = requests.get(url, headers=headers)
resp.encoding = "utf-8"
#1.爬取网页
pa_text = resp.text
all_data = json.loads(pa_text)
#2.提取数据
list_data = all_data["data"]['domestic_data']["data"]
list1_data = all_data['data']["foreign_data"]['data']
country_data = getdataf(list1_data)
xing_data = getdatax(list_data)
shi_data = getdatas(list_data)
#3.保存数据
savepath = "疫情.xls"
DataStorage.savedata(country_data,xing_data, shi_data, savepath)
#提取国家疫情数据
def getdataf(list1_data):
foreign_data = []
for i in list1_data:
j = 1
for value in i.values():
foreign_data.append(value)
j +=1
if j>6:
break
#删除无用数据
foreign_data.pop(0)
for i in range(1, 67):
i *= 5
foreign_data.pop(i)
return foreign_data
#提取省疫情数据
def getdatax(list_data):
xing_data = []
for i in list_data:
j = 1
for value in i.values():
xing_data.append(value)
j += 1
if j>6:
break
#消除无用数据
xing_data.pop(0)
for i in range(1, 34):
i *= 5
xing_data.pop(i)
return xing_data
#提取市疫情数据
def getdatas(list_data):
shi_data = []
for i in range(33):
s = list_data[i]['cities_data']
for j in s:
for k in j.values():
shi_data.append(k)
#消除无用数据
for j in range(4000):
for i in shi_data:
if i == '城市全称'or i == '' or i == '待明确地区':
del shi_data[shi_data.index(i):shi_data.index(i) + 8]
return shi_data
我们想要的数据就在这字典中了,大字典中嵌套了小字典,小字典中嵌套了列表,列表中又嵌套了字典,目标数据在最里面,接下来就是进行字典的取值和列表的切片操作,一步一步拿到目标值(第二张图片值显示出三个数据中的其中一个)
2.数据的存储用python里的第三方库xlwt,把数据存储到excel中
import xlwt
def savedata(country_data,xing_data,shi_data,savepath):
print("save.......")
#创建workbook对象
book = xlwt.Workbook(encoding="utf-8", style_compression=0)
#创建疫情(全球)工作表
country = book.add_sheet('疫情(全球)', cell_overwrite_ok=True)
colc = ("国家", "确诊", "疑似", "死亡", "治愈")#设置列名
for i in range(5):
country.write(0, i, colc[i])#写入列名
for i in range(67):
C = country_data[i * 5:]
for j in range(5):
country.write(i + 1, j, C[j])#写入数据
#创建疫情(省)工作表
xing = book.add_sheet('疫情(省)', cell_overwrite_ok=True)
colx = ("省", "确诊", "疑似", "死亡", "治愈")
for i in range(5):
xing.write(0, i, colx[i])
for i in range(34):
X = xing_data[i * 5:]
for j in range(5):
xing.write(i + 1, j, X[j])
#创建疫情(市)工作表
shi = book.add_sheet('疫情(市)', cell_overwrite_ok=True)
cols = ("市", "市区", "确诊", "疑似", "死亡", "治愈", "现有确诊", "新增")
for i in range(8):
shi.write(0, i, cols[i])
for i in range(420):
S = shi_data[i * 8:]
for j in range(8):
shi.write(i + 1, j, S[j])
book.save(savepath)#保存
五、数据分析
在爬取完数据存到excel表中会做一些数据处理:绘制数据图(饼状图、折线图、直方图)、以某一列对整表进行排序、只取数据的某列某行,输出指定目标的一行数据。
是否想用python实现处理excel数据?听我一一为你道来
所用到的模块有:
import pandas as pd#数据分析
import xlrd#对爬取的excel进行查取与搜索
from pylab import *
mpl.rcParams['font.sans-serif'] = ['SimHei']#绘制的图正常显示中文字体
mpl.rcParams['axes.unicode_minus'] = False#绘制的图正常显示负号
import random#随机
import random
#随机色
def rndcolor():
return '#'+hex(random.randint(66,255))[-2:]+hex(random.randint(82,255))[-2:]+hex(random.randint(99,255))[-2:]
1.创建数据图(以“国家”工作表,“疫情”为例):
cb=pd.read_excel('疫情.xls', sheet_name='疫情(全球)',index_col='from')index_col表示以那一列为x轴
cb['列名'].plot.pie(autopct='%1.2f%%',pctdistance=1.1,labeldistance=1.2)
explode设置分离度 counterclock顺(逆)时针 radius:饼图半径 startangle:开始角度
pctdistance:数据离中心点距离(默认为0.6,超过1为圆外)
labeldistance:对应标签距离圆的距离(默认1.1)
import pandas as pd#数据分析
from pylab import *
mpl.rcParams['font.sans-serif'] = ['SimHei']#绘制的图正常显示中文字体
mpl.rcParams['axes.unicode_minus'] = False#绘制的图正常显示负号
cb=pd.read_excel('疫情.xls', sheet_name='疫情(全球)',index_col='国家')#调用工作表
cb['确诊'].plot.pie(autopct='%1.2f%%',pctdistance=1.1,labeldistance=1.2)
plt.title('关于各国家疫情确诊人数饼状图',fontsize=16,fontweight='bold',color=rndcolor())#设置图标题
plt.ylabel('确诊',fontsize=12,fontweight='bold',color=rndcolor())#设置列标签
plt.legend()#显示图例
plt.axis('equal')#显示为圆,不标记可能因为数据过多而变成椭圆
plt.show()
plt.bar(xc[‘列名’],xc[‘值的列名’],color=rndcolor())#绘制直方图
import pandas as pd#数据分析
from pylab import *
mpl.rcParams['font.sans-serif'] = ['SimHei']#绘制的图正常显示中文字体
mpl.rcParams['axes.unicode_minus'] = False#绘制的图正常显示负号
xc = pd.read_excel('疫情.xls', sheet_name='疫情(全球)')
plt.bar(xc['国家'],xc['确诊'],color=rndcolor())
plt.xlabel('国家',fontsize=12,fontweight='bold',color=rndcolor())
plt.ylabel('人数',fontsize=12,fontweight='bold',color=rndcolor())
plt.grid()#显示网格线默认True显示
plt.show()
图形标记:o:圆 v,^:三角 s:正方形 p:五边形 *:星形 h:六边形 x:x标记 d:菱形
plt.plot(xc['列名'],xc['值的列名'],label=‘值的列名’,linewidth=3,color=rndcolor(),marker='o',markerfacecolor=rndcolor(),markersize=12)#绘制折线图
import pandas as pd#数据分析
from pylab import *
mpl.rcParams['font.sans-serif'] = ['SimHei']#绘制的图正常显示中文字体
mpl.rcParams['axes.unicode_minus'] = False#绘制的图正常显示负号
xc = pd.read_excel('疫情.xls', sheet_name='疫情(全球)')
l=['确诊','疑似','死亡','治愈','现有确诊','新增']
for i in l[0:4]:#只取前4列
plt.plot(xc['国家'],xc[i],label=i,linewidth=3,color=rndcolor(),marker='o',markerfacecolor=rndcolor(),markersize=12)
plt.title("关于各国家疫情情况折线图",fontsize=16,fontweight='bold',color=rndcolor())
plt.xlabel('国家',fontsize=12,fontweight='bold',color=rndcolor())
plt.ylabel('人数',fontsize=12,fontweight='bold',color=rndcolor())
plt.legend()#显示图例
plt.grid()#显示网格线
plt.show()
2.以某列进行排序:
xc = pd.read_excel('疫情.xls', sheet_name='疫情(全球)')
xc.sort_values(by=‘列名’, inplace=True, ascending=False)
#ascending:False为降序,inplace:True表示不创建新的对象,直接对原始对象进行修改
print(xc)表示输出整张表数据
print(xc.iloc[:n,:])表示取前n行全部列
print(xc.iloc[:n,:m])表示取前n行前m列
print(xc.iloc[:n,[a,b])表示取前n行第a列和第b列
import pandas as pd
xc = pd.read_excel('疫情.xls', sheet_name='疫情(全球)')
xc.sort_values(by='确诊', inplace=True, ascending=False)
print(xc.iloc[:5,:])
排序前:
排序后:
3.只取某行数据
import xlrd
#打开工作簿
xl = xlrd.open_workbook(r"疫情.xls")
#取表
table = xl.sheets()[0]#取第一个工作表
country = table.col_values(0)#国家列
sure = table.col_values(1)#确诊列
suspect = table.col_values(2)#疑似列
death = table.col_values(3)#死亡列
cure = table.col_values(4)#治愈列
aim='美国'
if(aim in country):
print("国家tt确诊tt疑似tt死亡tt治愈")
l = country.index(aim)
print(f"{aim}tt{sure[l]}tt{suspect[l]}tt{death[l]}tt{cure[l]}")



