Python爬虫学习之爬取豆瓣音乐Top250存入Excel表格中

前言

目标网站:https://music.douban.com/top250

任务:

  • 爬取豆瓣音乐Top250的歌曲名
  • 爬取豆瓣音乐Top250的歌曲对应的表演者、发行时间和音乐流派(分别对应下图斜杠一行的第1个、第2个和最后1个)
    Python爬虫学习之爬取豆瓣音乐Top250存入Excel表格中
  • 爬取豆瓣音乐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') # 保存

目标结果:

Python爬虫学习之爬取豆瓣音乐Top250存入Excel表格中
任务结束!

上一篇:爬取优酷电影top250数据分析


下一篇:豆瓣电影top250(网络爬虫)