目录
爬取最新疫情信息
一、选题的背景
二、主题式网络爬虫设计方案
三、主题页面的结构特征分析
四、网络爬虫程序设计
五、数据分析
一、选题的背景
为什么要选择此选题?
由于疫情原因的影响,世界各地都因为新型冠状病毒(简称新冠肺炎)而陷入种种危机。因此,对于现存国内的疫情数据我进行了一个爬取和一些数据分析,更加直观的查看出国内现存疫情的情况。
让现在在社会上经常流通的人们加强防范意识,了解现存哪些地区风险较高,出行进行防护。在外出差、走生意的人也更加了解到各地的疫情情况,尽量避免高危地区出行!
数据来源:一点资讯。
网址: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]}")
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)