excel抓取多页网页数据(一句话概括本文:利用Excel存储爬到的抓取豆瓣音乐Top250 )

优采云 发布时间: 2022-04-20 12:42

  excel抓取多页网页数据(一句话概括本文:利用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。

  

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线