前言
目标网站:https://music.douban.com/top250
任务:
- 爬取豆瓣音乐Top250的歌曲名
- 爬取豆瓣音乐Top250的歌曲对应的表演者、发行时间和音乐流派(分别对应下图斜杠一行的第1个、第2个和最后1个)
- 爬取豆瓣音乐Top250的歌曲对应的评分和歌曲详情链接
- 将爬取到的数据依次写入Excel表格中
打开网页 → 点击下一页 → 发现网站URL有所改变 → 再点击下一页 → 返回第一页 → 发现网址的规律
https://music.douban.com/top250?start=0 (经过翻页之后第一页的URL)
https://music.douban.com/top250?start=25
https://music.douban.com/top250?start=50
从上面的URL中发现的网站变化的规律,可以判断出来接下来每一页的URL为 start=25*页码
观察思考:
- 首先观察网页源代码,可以发现需要的数据都在 标签 :*<div class=“indent”> </div>*中,所以读取该标签下的内容:
div = bs.find("div", {"class": "indent"})
- 在该标签下看出每首歌都在 标签*<div class=“pl2”> </div>* 中
divs = div.find_all("div", {"class": "pl2"})
部分网页源代码如下:
<td valign="top">
<div class="pl2">
<a href="https://music.douban.com/subject/2995812/" onclick="moreurl(this,{i:'0',query:'',subject_id:'2995812',from:'music_subject_search'})" >
We Sing. We Dance. We Steal Things.
</a>
<p class="pl">Jason Mraz / 2008-05-13 / Import / Audio CD / 民谣</p>
<div class="star clearfix"><span class="allstar45"></span><span class="rating_nums">9.1</span>
<span class="pl">
(
113545人评价
)
</span></div>
</div>
</td>
</tr>
</table><div id="collect_form_2995812"></div>
<p class="ul"></p>
<table width="100%%">
<tr class="item">
<td width="100" valign="top">
<a class="nbg" href="https://music.douban.com/subject/3040149/" onclick="moreurl(this,{i:'1',query:'',subject_id:'3040149',from:'music_subject_search'})" title="Coldplay - Viva La Vida" >
<img src="https://img9.doubanio.com/view/subject/s/public/s3054604.jpg" alt="Coldplay - Viva La Vida" style="width: 80px; max-height: 120px;" />
</a>
</td>
-
用for循环遍历读取每首歌曲的内容
-
发现歌曲名在该标签下的a标签 → 用select函数进行提取
title = div_pl2.select('a')[0].text.replace(' ', '')
title = title.replace('\n', ' ').replace('\r', '')
- 观察发现歌曲的表演者、发行时间、音乐流派发现其他信息集中在 <p class=“pl”> 中,先整体读取,再逐个读取
content = div_pl2.find("p", {"class": "pl"}).get_text().split('/') # 将找到的内容以/为分隔符进行分隔返回分割后的字符串列表
singer = content[0]
music_time = content[1]
music_type = content[-1]
- 寻找评分和详细信息的链接
score = div_pl2.find("span", {"class": "rating_nums"}).get_text()
link = div_pl2.find('a').get('href')
完整代码:
from urllib.request import urlopen, Request
from bs4 import BeautifulSoup
import xlwt #导入xlwt模块,并生成一个sample3的表格文件
workbook = xlwt.Workbook(encoding='utf-8')
worksheet = workbook.add_sheet('My Worksheet') # 创建第一个sheet 表单
worksheet.write(0, 0, "排名") # 写入行索引、列索引、表示要写的内容
worksheet.write(0, 1, "歌名")
worksheet.write(0, 2, "表演者")
worksheet.write(0, 3, "发表时间")
worksheet.write(0, 4, "音乐类型")
worksheet.write(0, 5, "评分")
worksheet.write(0, 6, "详细链接")
j = 1 # 插入行的行号
for i in range(10):
url = 'https://music.douban.com/top250?start={}'.format(i * 25)
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36'}
ret = Request(url, headers=headers)
html = urlopen(ret).read()
bs = BeautifulSoup(html, "html.parser")
div = bs.find("div", {"class": "indent"}) # 存储本页需要内容的标签
divs = div.find_all("div", {"class": "pl2"}) # 存储本页每首首歌曲内容的标签
for div_pl2 in divs:
title = div_pl2.select('a')[0].text.replace(' ', '')
title = title.replace('\n', ' ').replace('\r', '')
content = div_pl2.find("p", {"class": "pl"}).get_text().split('/') # 将找到的内容以/为分隔符进行分隔返回分割后的字符串列表
singer = content[0]
music_time = content[1]
music_type = content[-1]
score = div_pl2.find("span", {"class": "rating_nums"}).get_text()
link = div_pl2.find('a').get('href')
worksheet.write(j, 0, j) # 排名
worksheet.write(j, 1, title) # 歌名
worksheet.write(j, 2, singer) # 表演者
worksheet.write(j, 3, music_time) # 发行时间
worksheet.write(j, 4, music_type) # 音乐流派
worksheet.write(j, 5, score) # 评分
worksheet.write(j, 6, link) # 详细信息的链接
j += 1
workbook.save('豆瓣音乐Top250.xls') # 保存
目标结果:
任务结束!