4.python爬虫实战:读取excel数据并进行数据处理【Python】(测试代码+api例程)

本文介绍了如何使用Python爬取近5年中国大学排行榜信息,包括数据预处理、Excel读取、数据结构转换,以及如何创建CSV文件和处理数据以便于后续的图表分析。重点讲述了如何将Excel中的字符串列表数据转化为适合动态图的结构。
摘要由CSDN通过智能技术生成


欢迎关注 『Python』 系列,持续更新中
欢迎关注 『Python』 系列,持续更新中

爬取近5年的中国大学排行榜信息,项目实战
爬虫数据分析可视化实战专栏有完整代码,一步步分析实现功能。

建议先观看前面的文章,循序渐进。

API说明:

data=pd.read_excel(“爬取近5年的排行榜信息.xls”,index_col=0)
不带列索引读取excel的数据

years=list(data.index)
获取数据的行索引,也就是获取年份列表 [2017, 2018, 2019, 2020, 2021]

data=data.values
转为为numpy数组,便于进一步操作(个人习惯)

my_dic.get(i[0],0)==0
从字典中读取键名为“i[0]”的值,如果无法读取到值,那么返回0

nparray.T
np矩阵的矩阵转置

print(df_result.to_csv(“爬取近5年的排行榜信息.csv”))
导出csv文件

思路

最终需要得到的数据存放在csv
在这里插入图片描述

  • 因为我们要绘制gif动图,要求数据结构如上行索引是年份时间,列索引是各个大学,数据分数是数据类型不能是字符串

  • 因为前面的excel读取每个单元格内存放的是列表的字符串,所以我们要手动把字符串替换掉[,],'然后split切分为列表

print(data[0][0].replace("[","").replace("]","").replace("'","").split(", "))#测试输出一个转化后的实例大学列表
print(data[0][0].replace("[","").replace("]","").replace("'","").split(", ")[0])#测试输出一个转化后的实例大学名字
print(data[0][0].replace("[","").replace("]","").replace("'","").split(", ")[1])#测试输出一个转化后的实例大学分数
  • 获取所有上榜过大学的名字,这里有个坑,因为不是所有大学都是5年内上榜的,如果那一年没有上榜,要给大学mark列表里面加上一个0来占位。
    所以我们这边先获取所有大学名字,设立一个标志字典用于后续记录大学本年度是否有上榜,判断加0占位。
my_dic={}#新建一个空字典,每个学校一个键,值是一个列表存放学校近五年的分数
my_dic_symbol={}#新建一个空字典,每个学校一个键,值是本年学校是否上榜
#获取所有大学的名字
for year in data:#遍历5年
    for i in year:#遍历每一年的所有数据
        i=i.replace("[","").replace("]","").replace("'","").split(", ")
        if my_dic.get(i[0],0)==0:#如果字典中本来没有这个键,新建一个键
            my_dic_symbol[i[0]]=False#设置标志字典初始值为false
            my_dic[i[0]] = []#设置数据字典为列表
            my_dic[i[0]].append(i[0])#放入大学名字
all_university=list(my_dic)#取得键
all_university=np.array(all_university)#转为np数组
print(all_university)#得到所有的大学名字(5年内上榜过即可,不一定每年都上榜)
  • 把大学的名字和分数都加入字典,用0占位没有上榜的年份
for year in data:#遍历5年
    #标志本年度,该大学是否上榜过,如果没有,要给大学列表值加一个0
    this_my_dic_symbol=my_dic_symbol.copy()#注意要新建一个对象,不要直接赋值

    for i in year:#遍历每一年的所有数据
        i=i.replace("[","").replace("]","").replace("'","").split(", ")
        if my_dic.get(i[0],0)==0:#如果字典中本来没有这个键,新建一个键,新建列表放入第一个数
            my_dic[i[0]]=[]
            my_dic[i[0]].append(i[1])
            this_my_dic_symbol[i[0]]=True
        else:#如果字典中本来有这个键,直接放入下一个数
            my_dic[i[0]].append(i[1])
            this_my_dic_symbol[i[0]]=True
    for i in all_university:  # 遍历每一年的所有数据
        if this_my_dic_symbol[i]==False:#今年这个学校没有上榜
            my_dic[i].append(0)

print(my_dic)#得到最终的字典

-------下面是前面文章的步骤,如果看过可以跳过---------

  • 导入库
import pandas as pd
import numpy as np
  • 通过panda库把result列表转为DataFrame类型,并且设置行列的索引
result=pd.DataFrame(result,index=list(np.arange(start_year,end_year+1)),columns=list(np.arange(1,31)))
  • to_excel 导出为excel文件
result=pd.DataFrame(result,index=list(np.arange(start_year,end_year+1)),columns=list(np.arange(1,31)))
print(result)
result.to_excel("爬取近5年的排行榜信息.xls")

注意事项

  1. 一定要加上这句编码格式设定为utf-8,否则会乱码。
  2. 使用复制完整的xpath路径,新手入门建议

完整代码

# @Time    : 2022/5/19 7:34
# @Author  : 南黎
# @FileName: 4.从excel中读取数据处理数据.py
import numpy as np
import pandas as pd
data=pd.read_excel("爬取近5年的排行榜信息.xls",index_col=0)
years=list(data.index)#获取年份列表  [2017, 2018, 2019, 2020, 2021]
data=data.values#转为为numpy数组,便于进一步操作(个人习惯)

print(data)#测试输出读取到的所有数
print(data[0][0].replace("[","").replace("]","").replace("'","").split(", "))#测试输出一个转化后的实例大学列表
print(data[0][0].replace("[","").replace("]","").replace("'","").split(", ")[0])#测试输出一个转化后的实例大学名字
print(data[0][0].replace("[","").replace("]","").replace("'","").split(", ")[1])#测试输出一个转化后的实例大学分数
my_dic={}#新建一个空字典,每个学校一个键,值是一个列表存放学校近五年的分数
my_dic_symbol={}#新建一个空字典,每个学校一个键,值是本年学校是否上榜
#获取所有大学的名字
for year in data:#遍历5年
    for i in year:#遍历每一年的所有数据
        i=i.replace("[","").replace("]","").replace("'","").split(", ")
        if my_dic.get(i[0],0)==0:#如果字典中本来没有这个键,新建一个键
            my_dic_symbol[i[0]]=False#设置标志字典初始值为false
            my_dic[i[0]] = []#设置数据字典为列表
            my_dic[i[0]].append(i[0])#放入大学名字
all_university=list(my_dic)#取得键
all_university=np.array(all_university)#转为np数组
print(all_university)#得到所有的大学名字(5年内上榜过即可,不一定每年都上榜)


for year in data:#遍历5年
    #标志本年度,该大学是否上榜过,如果没有,要给大学列表值加一个0
    this_my_dic_symbol=my_dic_symbol.copy()#注意要新建一个对象,不要直接赋值

    for i in year:#遍历每一年的所有数据
        i=i.replace("[","").replace("]","").replace("'","").split(", ")
        if my_dic.get(i[0],0)==0:#如果字典中本来没有这个键,新建一个键,新建列表放入第一个数
            my_dic[i[0]]=[]
            my_dic[i[0]].append(i[1])
            this_my_dic_symbol[i[0]]=True
        else:#如果字典中本来有这个键,直接放入下一个数
            my_dic[i[0]].append(i[1])
            this_my_dic_symbol[i[0]]=True
    for i in all_university:  # 遍历每一年的所有数据
        if this_my_dic_symbol[i]==False:#今年这个学校没有上榜
            my_dic[i].append(0)

print(my_dic)#得到最终的字典


my_dic_university=list(my_dic)#取得键
my_dic_university=np.array(my_dic_university)#转为np数组
print(my_dic_university)
my_dic_mark=np.array(list(my_dic.values()))#取得值,,并转为np数组
print(my_dic_mark)


# print(my_dic_mark[:,0])#切片——测试输出列索引名
# print(my_dic_mark[:,1:])#切片——测试输出数据
df_result=pd.DataFrame(my_dic_mark[:,1:],index=my_dic_mark[:,0],columns=years).T #矩阵转置
print(df_result.to_csv("爬取近5年的排行榜信息.csv"))


总结

大家喜欢的话,给个👍,点个关注!继续跟大家分享敲代码过程中遇到的问题!

版权声明:

发现你走远了@mzh原创作品,转载必须标注原文链接

Copyright 2022 mzh

Crated:2022-1-10

欢迎关注 『Python』 系列,持续更新中
欢迎关注 『Python』 系列,持续更新中
【Python安装第三方库一行命令永久提高速度】
【使用PyInstaller打包Python文件】
【更多内容敬请期待】


  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

发现你走远了

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值