一句话归纳本文:python
利用Excel存储爬到的抓取豆瓣音乐Top 250数据信息,还有读Excel。git
引言:github
失踪人口回归,最近比较迷茫,不知道是回头深究Android,仍是继续 学Python,Android是旧爱,Python是新欢;Android应用层折腾来 折腾去,无非:改UI,写控件,换下库,换下架构...之前一直想着写 本身的项目,而后各类加东西优化,而后发现本身却没有了当年的热情, 唉!相比Python,随手就是一爬虫,批处理类的脚本,实用性高太多, 只是Python没有引路人,都是本身一点点摸索,见步走步吧!面试
以前在写爬小姐姐脚本时候,就遇到过一个如何存储爬取到数据的问题, 好比一个系列的套图连接应该放到特定的文件夹,我以前的操做都是 经过下面这样的格式写入到一个txt文件中:目录~连接 而后读取txt文件,得到字符串,而后经过**split("~")**来进行分隔, **split("~")[0]
是目录,split("~")[1]
是路径,挺low的, 若是是涉及到三个维度以上的再拼多一个~,在上上一节抓 半次元coser的时候就遇到一个恶心的问题,符号都他么被用了, 难以分隔,一个个特殊字符试,后面试到Θ
**才能够..数据库
迫切须要一个东西来存咱们抓取到的数据,固然最好用:数据库 可是考虑到学习成本(主要是我不熟!),先经过一个简单的东西存起来。编程
最简单的确定是经过Excel表格啊,最直观了,非编程人员也能看懂! 很少说,开始本节内容~ 本节抓取例子:豆瓣音乐 Top 250
连接:music.douban.com/top250bash
依次校验:架构
连接规则:app
第一页:https://music.douban.com/top250?start=0 第二页:https://music.douban.com/top250?start=25 第三页:https://music.douban.com/top250?start=50函数
连接规则显而易见,每25条一页,0,25,50,75...225
请求头:
就一个:Host:music.douban.com
模拟请求的套路摸清了,接下来就是处理网页拿到想要的数据了: 看下Element,不难发现数据都单独放在一个个table里:
点开其中一个:
先捋下咱们想采集到的数据:
图片连接,歌名,歌手,发行时间,分类,评分,评分人数,歌曲详情页
而后就是慢慢抠数据了,本身私下抠,不会抠找之前文章看, 这里直接给出代码:
看下控制台打印出来的信息:
能够,没毛病,接下来看下怎么把数据写到excel表格里~
Step 1:安装库,操做Excel,你须要两个库:xlwt
(写Excel) 和 xlrd
(读Excel) 命令行pip安装一波。
sudo pip3 install xlwt
sudo pip3 install xlrd
复制代码
Step 2:熟悉几个基本函数
写入Excel:
Workbook
():建立一个工做薄add_sheet
(cell_overwrite_ok=True):添加工做表,括号里是可选 参数,用于确认同一个cell单元是否能够重设值write
(行号,列号,插入数据,风格),第四个参数可选 举个简单例子:插入这样的数据:sheet.write(0,0,"姓名")
sheet.write(0,1,"学号")
sheet.write(1,0,"小猪")
sheet.write(1,1,"No1")
复制代码
获得的表格:
save
(Excel文件名):保存到Excel文件中读取Excel:
open_workbook
():读取一个Excel文件得到一个工做薄对象sheets()[0]
:根据索引得到工做薄里的一个工做表nrows
:得到行数ncols
:得到列数row_values
(pos):读取某一行的数据,返回结果是列表类型的基本语法了解得差很少了,接着咱们来写一个工具类,来把咱们爬虫 爬取到的数据写入到Excel表格里,四个方法: style
:根据传入的字体名称,高度,是否加粗,返回一个Style样式 __init__
:完成Excel表的一些初始化操做,初始化表头 insert_data
:把爬取到的数据插入到Excel里的方法 read_data
:读取Excel里数据的方法
接着一步步来,先是style方法:
接着是__init__
方法,判断Excel文件是否存在,不存在则新建并进行初始化
再接着是insert_data:
最后是read_data:
代码不算复杂,接着写下调用代码试试:
加一个打印data_group的方法,看下抓取的数据,运行下:
没毛病,圈住哪里[[,这里想表达结果是一个大列表嵌套多个列表! 再接着添加下述代码:
执行后能够看到,生成了一个**dbyy.xlsx
**的文件,打开看看:
啧啧,写入成功,美滋滋! 再接着把无关代码注释掉,调用下读取Excel的方法:
读写都没问题,嘤嘤嘤~
本节讲解了一波如何把爬取到的数据存到Excel表里,以及读取Excel表里的数据, 虽然没有数据库高端,可是比起以前用分隔符分隔多中类型的数据,用到的时候 split()好多了,并且非开发者也能直接看懂,除此以外,哪天说不定能够撩到 一些文员小姐姐(编写批处理Excel表的脚本),除此以外还能够作些词频统计类 的脚本玩玩,最后献上哲♂学启蒙老师照片来结束本节内容,愿天堂没有摔跤:
附:具体实现代码(其实均可以在github.com/coder-pig/R… 找到)
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的能够加下,智障机器人小Pig,验证信息里包含: Python,python,py,Py,加群,交易,屁眼 中的一个关键词便可经过;
验证经过后回复 加群 便可得到加群连接(不要把机器人玩坏了!!!)~~~ 欢迎各类像我同样的Py初学者,Py大神加入,一块儿愉快地交流学♂习,van♂转py。