【爬虫二】爬取豆瓣音乐榜单

本文介绍了一种使用Python的request和bs4库爬取豆瓣音乐榜单的方法。通过对网页结构的分析,利用BeautifulSoup实现了对榜单歌曲名称的有效抓取,并通过翻页功能获取完整的榜单数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >



前言

  借助有效率的工具,可以让我们更加方便的写出爬虫程序。本篇使用request和bs4库爬取豆瓣音乐榜单。

介绍

豆瓣音乐榜单:https://music.douban.com/top250
图片描述
bs4:Beautiful Soup 4 是一个可以从HTML或XML文件中提取数据的Python库。它能够通过你喜欢的转换器实现惯用的文档导航、查找、修改文档的方式。Beautiful Soup会帮你节省数小时甚至数天的工作时间。

一、获取网页html

def download_page(url):
    headers = {
        'User-Agent':'查看自己的User-Agent,粘贴到此处'
    }

    data = requests.get(url, headers=headers).content
    return data

  不添加headers可能导致403,无法获取网页源码,这是因为操作被服务器认为是爬虫而拒绝访问。服务器通过校验请求的U-A来识别爬虫,这是一种相对简单的反爬虫机制。通过模拟浏览器的U-A,可以解决这个问题。

  通常,浏览器在向服务器发送请求的时候,会有一个请求头——User-Agent,它用来标识浏览器的类型。当我们使用requests来发送请求的时候,默认的User-Agent是python-requests/2.8.1。如此我们尝试将User-Agent伪装成浏览器。我们通过手动指定User-Agent为Chrome浏览器(F12–>Network中查看),再次访问得到网页源码。

二、获取当前页歌名

def parse_html(html):
    global count
    soup = BeautifulSoup(html, "html.parser")
    music_list_soup = soup.find('div', attrs={'class': 'indent'})

    music_name_list = []
    for music_li in music_list_soup.find_all('table'):
        detail = music_li.find('div', attrs={'class': 'pl2'})
        count += 1
        music_name = 'Top ' + str(count)
        music_name = music_name + detail.find('a').getText() + '\n'
        music_name_list.append(music_name)

    next_page = soup.find('span', attrs={'class': 'next'}).find('a')
    if next_page:
        return music_name_list, next_page['href']
    else:
        return music_name_list, None

  我们使用了beautifulsoup来分析网页源码, 创建bs对象soup,并使用解析器html.parser来解析源码。
  
按F12–>Element查看网页源码,发现<div class='indent'>标签下存在歌单(table标签);
图片描述
用for循环获取所有table,并对每一个table进行分析;

<div, class='pl2'>标签下的<a>标签下发现歌名,
图片描述

用此detail.find('a').getText() 函数获取a标签下的文字内容,并添加到列表中music_name_list.append(music_name) ,再把列表的元素写进文件就可以了。

注: BeautifulSoup中的find和findAll用法相同,不同之处为find返回的是findAll搜索值的第一个值。

三、翻页

  next_page是为了让程序能够翻页,next_page['href'] ,获取下一页url,通过while循环来反复访问,进而可以获取完整歌单。
图片描述

四、代码

  最后,完整程序代码如下:

#!/usr/bin/env python
# encoding=utf-8

import requests
from bs4 import BeautifulSoup
import codecs


def download_page(url):
    headers = {
        'User-Agent':'查看自己的User-Agent,粘贴到此处'
    }

    data = requests.get(url, headers=headers).content
    return data

def parse_html(html):
    global count
    soup = BeautifulSoup(html, "html.parser")
    music_list_soup = soup.find('div', attrs={'class': 'indent'})

    music_name_list = []
    for music_li in music_list_soup.find_all('table'):
        detail = music_li.find('div', attrs={'class': 'pl2'})
        count += 1
        music_name = 'Top ' + str(count)
        music_name = music_name + detail.find('a').getText() + '\n'
        music_name_list.append(music_name)

    next_page = soup.find('span', attrs={'class': 'next'}).find('a')
    if next_page:
        return music_name_list, next_page['href']
    else:
        return music_name_list, None

def main():
    url = 'https://music.douban.com/top250'
    fp = codecs.open('music', 'w', encoding='utf-8')
    while url:
        html = download_page(url)
        musics, url = parse_html(html)
        fp.write(''.join(musics))

    print 'done\n'


if __name__ == '__main__':
    count = 0
    main()



### 使用Python爬虫抓取豆瓣短剧Top100榜数据 为了实现这一目标,可以采用`requests`库来发送HTTP请求并接收响应,利用`BeautifulSoup`解析HTML文档。需要注意的是,在编写爬虫程序前应当阅读目标网站的服务条款,确保行为合法合规。 #### 安装所需库 首先安装必要的第三方库,可以通过pip命令完成操作。 ```bash pip install requests beautifulsoup4 lxml ``` #### 编写爬虫脚本 下面展示一段简的代码用于获取页面内容,并从中提取出影片名称、评分等信息[^1]: ```python import requests from bs4 import BeautifulSoup def fetch_douban_top_100(): url = 'https://movie.douban.com/top250' headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)" } movie_list = [] for start in range(0, 100, 25): # 豆瓣每页显示25部作品 params = {'start': str(start)} response = requests.get(url=url, headers=headers, params=params) soup = BeautifulSoup(response.text, 'lxml') items = soup.find_all('div', class_='item') for item in items: title = item.find('span', class_='title').get_text() rating_num = float(item.find( 'span', class_='rating_num').get_text()) data_dict = {"name": title, "score": rating_num} movie_list.append(data_dict) return movie_list[:100] if __name__ == '__main__': top_movies = fetch_douban_top_100() for idx, movie_info in enumerate(top_movies): print(f'{idx + 1}: {movie_info["name"]} - Score:{movie_info["score"]}') ``` 这段代码实现了对指定URL发起GET请求,通过调整参数控制分页加载更多条目;接着运用正则表达式匹配标签属性筛选有效节点,最后整理成字典形式返回给调用者处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值