Python简单爬虫+excel数据分析(绘制数据图、排序、查找指定数据)

Python简单爬虫+excel数据分析(绘制数据图、排序、查找指定数据),第1张

Python简单爬虫+excel数据分析(绘制数据图、排序、查找指定数据) 爬取最新疫情信息

目录

爬取最新疫情信息

一、选题的背景

二、主题式网络爬虫设计方案

三、主题页面的结构特征分析

 四、网络爬虫程序设计

五、数据分析


一、选题的背景

为什么要选择此选题?

由于疫情原因的影响,世界各地都因为新型冠状病毒(简称新冠肺炎)而陷入种种危机。因此,对于现存国内的疫情数据我进行了一个爬取和一些数据分析,更加直观的查看出国内现存疫情的情况。

让现在在社会上经常流通的人们加强防范意识,了解现存哪些地区风险较高,出行进行防护。在外出差、走生意的人也更加了解到各地的疫情情况,尽量避免高危地区出行!

数据来源:一点资讯。

网址: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]}")

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5657623.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存