一、前言
在大数据与人工智能技术快速迭代的行业背景下,音乐平台沉淀的公开数据具备极高的研究价值与分析价值。豆瓣音乐作为国内权威性较强的音乐评分社区,平台汇聚海量专辑资料、艺人信息、用户评分、社交评论以及行业榜单等结构化、半结构化公开数据。此类数据可应用于音乐舆情分析、大众审美偏好调研、音乐行业市场研判等多元化技术场景。
本文以豆瓣音乐全站数据采集为研究方向,系统化拆解Python爬虫开发全流程,涵盖站点接口分析、请求伪装策略、网页数据解析、反爬机制规避、本地化数据存储以及爬虫工程优化。针对豆瓣严格的IP封禁风控策略,本文引入亿牛云代理解决高频采集下的IP限流问题,适配全站大规模爬取业务需求。全文附带可落地执行的完整代码,兼顾入门学习与工程实践,同时恪守网络爬虫合规准则,采用低负载采集方案,避免对目标服务器造成算力压力。
二、爬虫前期技术分析
2.1 目标站点分析
豆瓣音乐采用静态页面结合Ajax异步加载的混合渲染架构,其中榜单列表、基础分类数据依托静态HTML页面渲染,专辑详情、用户短评、热度数据等深层资源通过后端异步JSON接口动态加载。平台风控体系完善,具备请求头校验、访问频率阈值限制、Cookie身份校验、IP行为识别以及短期封禁等多重反爬机制。相较于普通静态站点,豆瓣音乐对高频同质请求拦截力度极强,小规模爬取可依托延时策略规避风控,而全站批量采集必须搭载高质量代理IP池实现IP轮换。
本次爬虫采集范围覆盖豆瓣音乐公开合规数据,核心采集字段包含榜单曲目、专辑基础信息、艺人资料、音乐评分、用户短评、音乐分类标签等全站通用公开数据源。
2.2 技术栈选型
- 网络请求库:Requests,轻量化HTTP请求库,适配同步网络请求,用于模拟客户端发起网页访问
- 数据解析库:BeautifulSoup、JSON,分别完成静态HTML标签解析与异步接口JSON结构化数据提取
- 数据存储方式:CSV通用格式文件,具备兼容性强、读取便捷、无需额外部署环境的优势,适配中小型数据集存储
- 反爬技术方案 :随机请求头、智能延时休眠、亿牛云动态代理IP,构建多层风控规避体系
2.3 反爬机制规避方案
豆瓣音乐针对裸请求、高频请求、单一IP重复访问的拦截判定逻辑严格。为保障全站采集的稳定性,本文搭建三重合规防爬架构:其一,伪造标准化浏览器请求头,完善请求指纹,消除裸请求特征;其二,设置随机休眠间隔,模拟自然人浏览行为,降低请求频率;其三,针对大规模分页采集场景,接入亿牛云代理动态转发IP,实时轮换访问IP,规避IP封禁、限流问题,从根源突破站点访问限制。
三、完整代码实现过程
3.1 导入依赖库
整合网络请求、数据处理、时间控制、文件存储相关模块,为代理配置、数据爬取与解析提供底层支撑:
python
# 导入所需依赖库
import requests
from bs4 import BeautifulSoup
import time
import random
import csv
3.2 配置请求头、代理与基础参数
构造标准化浏览器请求头,掩盖爬虫请求指纹;同时接入亿牛云代理,配置动态代理参数,适用于后续全站批量分页采集,有效规避IP封禁风险:
python
# 配置请求头,伪装浏览器客户端
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
"Referer": "https://music.douban.com/",
"Host": "music.douban.com"
}
# 豆瓣音乐榜单基础接口
base_url = "https://music.douban.com/chart"
# 定义数据存储文件
save_file = "豆瓣音乐全站采集数据.csv"
# ========== 亿牛云代理配置(全站采集核心配置) ==========
# 动态代理提取地址,替换为个人专属代理密钥
proxy_host = "dns.niuip.com"
proxy_port = "10000"
proxies = {
"http": f"http://{proxy_host}:{proxy_port}",
"https": f"http://{proxy_host}:{proxy_port}"
}
3.3 编写通用请求函数
封装网络请求通用方法,集成异常捕获、随机延时、代理切换逻辑。小规模爬取可关闭代理,全站大规模采集时启用亿牛云代理,保障请求连通性:
python
def get_html(url, use_proxy=True):
"""
发送网络请求,获取网页源码
:param url: 目标链接
:param use_proxy: 是否启用代理,默认开启
:return: 网页源码/None
"""
try:
# 随机休眠1-3秒,模拟人工浏览行为
time.sleep(random.uniform(1, 3))
# 判定是否启用亿牛云代理
session_proxies = proxies if use_proxy else None
response = requests.get(url, headers=headers, proxies=session_proxies, timeout=10)
# 状态码校验
if response.status_code == 200:
response.encoding = "utf-8"
return response.text
else:
print(f"请求失败,状态码:{response.status_code}")
return None
except Exception as e:
print(f"网页请求异常:{e}")
return None
3.4 数据解析与提取函数
依托BeautifulSoup完成DOM节点解析,精准定位榜单页面标签,抽取音乐名称、艺人信息、评分、简介等结构化数据,规范化封装字典对象:
python
def parse_music_data(html):
"""解析音乐榜单结构化数据"""
soup = BeautifulSoup(html, "lxml")
music_list = []
# 定位榜单音乐条目标签
items = soup.find_all("div", class_="item")
for item in items:
# 音乐名称
music_name = item.find("div", class_="title").get_text(strip=True)
# 艺人、发行时间信息
info = item.find("div", class_="artist").get_text(strip=True)
# 音乐评分
score = item.find("span", class_="rating_nums").get_text(strip=True)
# 音乐简介备注
brief = item.find("p", class_="pl").get_text(strip=True)
# 数据封装
music_dict = {
"音乐名称": music_name,
"艺人及发行信息": info,
"评分": score,
"简介": brief
}
music_list.append(music_dict)
return music_list
3.5 数据存储与主程序
编写文件持久化存储函数,将采集数据写入CSV格式文件,整合请求、解析、存储模块,构建完整爬虫执行链路:
python
def save_to_csv(data, file_path):
"""将采集数据持久化保存至CSV文件"""
with open(file_path, "w", encoding="utf-8-sig", newline="") as f:
writer = csv.DictWriter(f, fieldnames=data[0].keys())
writer.writeheader()
writer.writerows(data)
print(f"数据保存完成,文件路径:{file_path}")
def main():
# 获取网页源码,全站采集建议开启亿牛云代理
html_data = get_html(base_url, use_proxy=True)
if html_data:
# 解析结构化数据
result = parse_music_data(html_data)
# 本地持久化存储
save_to_csv(result, save_file)
print("豆瓣音乐榜单采集完成!")
# 程序执行入口
if __name__ == "__main__":
main()
四、代码拓展:全站批量采集优化方案
上述基础代码仅实现单页榜单数据采集,若要完成豆瓣音乐全站采集,需适配分页遍历逻辑。豆瓣音乐分页规则为 ?start=页码&type=1,通过循环迭代分页参数,可批量遍历全平台公开榜单与分类数据。在批量遍历场景下,单一IP极易触发风控拦截,亿牛云代理的动态IP轮换能力可解决该痛点,依托海量优质代理节点,实现请求IP实时切换,规避访问频次限制。
针对异步加载的评论、热度、收藏数据,可通过浏览器抓包工具抓取后端JSON接口,结合代理池稳定请求批量提取深层数据。同时可优化代理调用逻辑,设置代理超时重连、无效IP自动剔除机制,进一步提升全站采集的稳定性,适配万级以上数据采集需求。
五、爬虫常见问题与解决方案
5.1 访问频率过高导致IP封禁
问题表现:请求返回403、429状态码,本地IP短期无法访问站点。解决方案:小规模爬取优化延时至2-5秒;全站大规模采集接入亿牛云动态代理IP,依托住宅级代理节点轮换IP,消除单一IP访问特征,从底层规避封禁。
5.2 乱码与网页节点解析失败
问题表现:输出文本乱码、标签匹配无数据。解决方案:手动锁定编码格式为UTF-8,实时校验网页DOM节点Class属性,适配网站页面迭代改版,及时修正解析规则。
5.3 异步动态数据采集缺失
问题表现:静态源码无法获取评论、动态榜单数据。解决方案:使用F12开发者工具抓包,筛选XHR异步接口,直接请求后端JSON接口完成数据提取。