excel抓取多页网页数据(一句话概括本文:利用Excel存储爬到的抓取豆瓣音乐Top250 )
优采云 发布时间: 2022-04-20 12:42excel抓取多页网页数据(一句话概括本文:利用Excel存储爬到的抓取豆瓣音乐Top250
)
用一句话概括这篇文章:
使用Excel存储爬取到的豆瓣音乐Top 250数据信息,并读取Excel。
介绍:
失踪人员正在回归,最近很迷茫,不知道是回安卓还是继续
学Python,Android是旧情,Python是新情;Android应用层折腾
折腾去了,无非就是:改UI、写控件、替换库、替换架构……一直想写
自己的项目,然后各种补充优化,然后发现自己没有当年的热情,
啊! 与Python相比,它是爬虫和批处理脚本,实用得多。
只是Python不带路,只是自己一点点探索,走走吧!
之前在写爬虫*敏*感*词*的脚本的时候,遇到了一个爬取数据如何存储的问题。
例如,一系列图片的链接应该放在特定的文件夹中。我之前的操作是
写入如下格式的txt文件:目录~链接
然后读取txt文件,得到字符串,然后用split("~")分隔,
split("~")[0] 是目录, split("~")[1] 是路径,很低。
如果涉及到三个以上的维度,那就多拼一个吧~,在上一节中抓到
在做半次元coser的时候,遇到了一个很恶心的问题。符号都被使用了。
难分离,特殊字符一一尝试,然后就只能测试Θ..
迫切需要一些东西来存储我们捕获的数据,当然还有最好的用途:数据库
但是考虑到学习成本(主要是我对它不熟悉!),先通过一个简单的东西来保存。
最简单的方法肯定是用Excel表格,最直观,非程序员也能看懂!
话不多说,开始本节吧~本节抓个例子:豆瓣音乐Top 250
关联:
1.编写数据捕获脚本
按顺序检查:
链接规则:
第一页:
第二页:
第三页:
链接规则很明显,每25个一页,0,25,50,75...225
请求头:
只有一个: 主持人:
模拟请求的套路已经想通了,接下来就是对网页进行处理,得到想要的数据:
看Element不难发现,数据是放在单独的表中的:
单击以下之一:
首先,我们来看看我们要采集的数据:
图片链接、歌名、艺人、发行时间、分类、评分、评分数、歌曲详情页
那我就慢慢挖数据,我私下挖,就不找之前的文章看了,
下面是直接代码:
查看控制台打印的信息:
好的,没问题,我们来看看如何将数据写入到excel表格中~
2.如何将数据写入Excel
第一步:安装库操作Excel,需要两个库:xlwt(写Excel)和xlrd(读Excel)
一波命令行 pip 安装。
sudo pip3 install xlwt
sudo pip3 install xlrd
第 2 步:熟悉几个基本功能
写入 Excel:
sheet.write(0,0,"姓名")
sheet.write(0,1,"学号")
sheet.write(1,0,"小猪")
sheet.write(1,1,"No1")
结果形式:
阅读 Excel:
3.编写一个 Excel 助手类
基本语法就差不多明白了,接下来我们写一个工具类来爬取我们的爬虫
将爬取的数据写入Excel表格,四种方法:
style:根据传入的字体名称、高度、粗体与否返回 Style 样式
__init__:完成Excel表格的一些初始化操作,初始化表头
insert_data:将爬取的数据插入Excel的方法
read_data:Excel中读取数据的方法
然后一步一步,先style方法:
接下来是__init__方法,判断Excel文件是否存在。如果它不存在,则创建一个新的并初始化它。
然后是insert_data:
最后是 read_data:
代码不复杂,那就把调用代码写下来试试:
添加一个打印 data_group 的方法,查看捕获的数据,然后运行:
没问题,圈出[[,这里我要表达的是结果是一个大列表嵌套了多个列表!
然后添加以下代码:
执行后可以看到生成了一个dbyy.xlsx文件,打开就可以看到:
啧啧,写的很成功,太美了!
然后注释掉不相关的代码,调用读取Excel的方法:
读写都没有问题,
4.总结
本节介绍如何将爬取的数据存储在 Excel 表中,并读取 Excel 表中的数据,
虽然没有高端数据库,但是相比之前使用分隔符来分隔多种类型的数据,在使用的时候
split() 好很多,非开发者可以直接理解。另外,也许有一天你可以得到它
一些文员(写批量处理Excel表格的脚本),除了做一些词频统计
让我们玩一下♂的剧本,最后以一张哲学启蒙老师的照片结束本节。愿天堂没有摔跤:
附:具体实现代码(其实可以在里面找到)
import re
import requests
import xlwt
import xlrd
import tools as t
rate_count_pattern = re.compile("(\d*人评价)", re.S) # 获取评分人数的正则
base_url = 'https://music.douban.com/top250'
save_file = 'dbyy.xlsx'
# 解析网页获得数据的方法
def parse_url(offset):
resp = requests.get(base_url, params={'page': offset})
print("解析:" + resp.url)
result = []
if resp.status_code == 200:
soup = t.get_bs(resp.content)
tables = soup.select('table[width="100%%"]')
for table in tables:
a = table.find('a')
detail_url = a['href'] # 歌曲详情页面
img_url = a.img['src'] # 图片url
music_name = a.img['alt'] # 歌曲名
p = table.find('p')
data_split = p.get_text().split("/")
singer = data_split[0].strip() # 歌手
public_date = data_split[1].strip()
category = "" # 分类
for data in data_split[2:]:
category += data.strip() + "/"
div = table.find('div', class_="star clearfix")
score = div.select('span.rating_nums')[0].text # 评分
rate_count = rate_count_pattern.search(div.select('span.pl')[0].get_text()).group(0) # 评分人数
result.append([img_url, music_name, singer, public_date, category, score, rate_count, detail_url])
return result
class ExcelHelper:
def __init__(self):
if not t.is_dir_existed(save_file, mkdir=False):
# 1.创建工作薄
self.workbook = xlwt.Workbook()
# 2.创建工作表,第二个参数用于确认同一个cell单元是否可以重设值
self.sheet = self.workbook.add_sheet(u"豆瓣音乐Top 250", cell_overwrite_ok=True)
# 3.初始化表头
self.headTitles = [u'图片链接', u'歌名', u'歌手', u'发行时间', u'分类', u'评分', u'评分人数', u'歌曲详情页']
for i, item in enumerate(self.headTitles):
self.sheet.write(0, i, item, self.style('Monaco', 220, bold=True))
self.workbook.save(save_file)
# 参数依次是:字体名称,字体高度,是否加粗
def style(self, name, height, bold=False):
style = xlwt.XFStyle() # 赋值style为XFStyle(),初始化样式
font = xlwt.Font() # 为样式创建字体样式
font.name = name
font.height = height
font.bold = bold
return style
# 往单元格里插入数据
def insert_data(self, data_group):
try:
xlsx = xlrd.open_workbook(save_file) # 读取Excel文件
table = xlsx.sheets()[0] # 根据索引获得表
row_count = table.nrows # 获取当前行数,新插入的数据从这里开始
count = 0
for data in data_group:
for i in range(len(data)):
self.sheet.write(row_count + count, i, data[i])
count += 1
except Exception as e:
print(e)
finally:
self.workbook.save(save_file)
# 读取Excel里的数据
def read_data(self):
xlsx = xlrd.open_workbook(save_file)
table = xlsx.sheets()[0]
nrows = table.nrows # 行数
ncols = table.ncols # 列数
# 从第一行开始,0是表头
for i in range(1, nrows):
# 读取某行数据
row_value = table.row_values(i)
print(row_value)
if __name__ == '__main__':
offsets = [x for x in range(0, 250, 25)]
data_group = []
for offset in offsets:
data_group += parse_url(offset)
print(data_group)
excel = ExcelHelper()
excel.insert_data(data_group)
excel.read_data()
来吧,Py交易
想进群一起学Py,可以加智障机器人小猪猪。验证信息包括:
python,python,py,py,add group,trade,ass里一个关键词可以通过;
验证通过后,回复群获取入群链接(不要破机器人!!!)~~~
欢迎像我一样的Py初学者,Py大神加入,一起快乐交流学习,van♂topy。