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

前言

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

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

目标结果:

在这里插入图片描述
任务结束!

  • 7
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
以下是豆瓣音乐 top250 并将数据存储到 MySQL 数据库的完整代码: ```python import requests from bs4 import BeautifulSoup import pymysql # MySQL数据库连接信息 HOST = 'localhost' PORT = 3306 USERNAME = 'your_username' PASSWORD = 'your_password' DATABASE = 'your_database_name' # 连接MySQL数据库 db = pymysql.connect(host=HOST, port=PORT, user=USERNAME, password=PASSWORD, database=DATABASE, charset='utf8') cursor = db.cursor() # 创建数据表 sql = '''CREATE TABLE IF NOT EXISTS music_top250 ( id INT(10) NOT NULL AUTO_INCREMENT, title VARCHAR(100) NOT NULL, artist VARCHAR(100) NOT NULL, score FLOAT NOT NULL, PRIMARY KEY (id) )''' cursor.execute(sql) # 数据 url = 'https://music.douban.com/top250' headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'} response = requests.get(url, headers=headers) soup = BeautifulSoup(response.text, 'html.parser') items = soup.find_all('tr', class_='item') # 将数据存储到数据库 for item in items: title = item.find('div', class_='pl2').a['title'] artist = item.find('div', class_='pl2').p.text.strip().split('/')[0] score = item.find('span', class_='rating_nums').text sql = "INSERT INTO music_top250 (title, artist, score) VALUES ('{}', '{}', {})".format(title, artist, score) cursor.execute(sql) db.commit() # 关闭数据库连接 db.close() ``` 说明: 1. 首先需要根据自己的 MySQL 数据库连接信息修改 HOST、PORT、USERNAME、PASSWORD 和 DATABASE 变量的值。 2. 执行 CREATE TABLE 语句创建数据表 music_top250,该数据表包含 id、title、artist 和 score 四个字段。 3. 使用 requests 库和 BeautifulSoup 库豆瓣音乐 top250 页面,使用 find_all 方法获每个音乐条目(tr 标签)。 4. 对于每个音乐条目,使用 find 方法获音乐名称(title 标签)、艺术家名称(p 标签)和评分(span 标签)信息,将这些信息插入到 MySQL 数据库。 5. 最后关闭数据库连接。 需要注意的是,如果要多次运行该代码,需要先删除数据表 music_top250 的所有数据,否则会出现数据重复的问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值