当前位置: 首页 > news >正文

使用 Python Selenium 和 Requests 实现歌曲网站批量下载实战

最近在爬取歌曲下载资源时,遇到一个有趣的挑战——歌曲宝网站的下载按钮触发弹窗,而且下载链接的访问需要调用后台接口确认“操作成功”,才能拿到真实的低品质MP3下载地址。为了实现批量自动下载,我结合 Selenium 模拟浏览器操作和 Requests 发送接口请求,写了一个完整的自动化脚本。今天分享下实现思路和关键点。


一、问题描述

该网站的周下载排行榜页面,歌曲列表在一个表格里,每首歌的详情页里有一个“下载歌曲”按钮。点击后弹出弹窗,用户需选择音质,低品质MP3链接是弹窗里的备用链接。

  • 直接用 Requests 请求弹窗页面拿不到下载链接
  • 弹窗的下载链接只有点击了一个后台接口 /api/ad-handle 后才有效
  • 真实的MP3下载链接在弹窗点击后打开新标签页,地址是CDN的mp3资源链接
  • 需要批量处理20页,每页10首歌

二、核心难点

  1. 弹窗异步加载和点击流程
    需要用 Selenium 模拟点击“下载歌曲”按钮,等待弹窗出现,点击“低品质MP3”链接,拿到真实的下载URL。

  2. 后台接口请求
    必须先调用 /api/ad-handle POST 接口,模拟广告播放确认,才能获得真实可用的下载链接。

  3. 保持请求状态和Cookie一致
    使用 Selenium 操作浏览器后,拿到的 Cookie 需要同步给 Requests,用于调用接口和下载 MP3,否则请求会被拒绝。


三、技术方案

  • 使用 Requests 来请求排行榜页面,解析出歌曲详情页URL。
  • 使用 Selenium(Chromedriver) 模拟浏览器打开歌曲详情页,执行点击操作,弹出音质选择弹窗。
  • 从 Selenium 获取 Cookie,传给 Requests,发送广告确认接口请求。
  • 弹窗中点击低品质MP3链接,切换标签页拿真实链接。
  • 用 Requests 下载 MP3 文件。

四、关键代码解读

1. Cookie 同步

def cookies_from_driver(driver):cookies = driver.get_cookies()cookie_dict = {}for cookie in cookies:cookie_dict[cookie['name']] = cookie['value']return cookie_dict

通过 Selenium 拿到浏览器的所有 Cookie,传给 Requests 保持会话一致。


2. 调用后端接口

def send_ad_handle(session, song_url, headers):api_url = "https://www.gequbao.com/api/ad-handle"post_headers = headers.copy()post_headers.update({'origin': 'https://www.gequbao.com','referer': song_url,'content-type': 'application/x-www-form-urlencoded; charset=UTF-8','x-requested-with': 'XMLHttpRequest',})data = ""resp = session.post(api_url, headers=post_headers, data=data)return resp.status_code == 200 and resp.json().get('code') == 1

这是成功获得下载授权的关键步骤。


3. 弹窗操作与真实链接获取

mp3_btn = wait.until(EC.element_to_be_clickable((By.ID, "btn-download-mp3")))
mp3_btn.click()wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "div.jconfirm-box")))
time.sleep(2)low_quality_link = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "div.jconfirm-box a.default-link")))
low_quality_link.click()
time.sleep(2)handles = driver.window_handles
if len(handles) > 1:driver.switch_to.window(handles[-1])mp3_url = driver.current_urldriver.close()driver.switch_to.window(handles[0])
else:mp3_url = low_quality_link.get_attribute("href")

点击弹窗“低品质MP3”链接后,selenium自动切换到新标签页拿真实URL。


4. 批量爬取和下载

主循环里先解析排行榜页面,再逐个下载:

for page in range(1, PAGES + 1):url = BASE_URL.format(page)res = requests.get(url, headers=HEADERS)soup = BeautifulSoup(res.text, 'html.parser')table_div = soup.find('div', class_='table-responsive')links = table_div.find_all('a')for a in links:href = a.get('href')song_url = 'https://www.gequbao.com' + hrefsong_title = a.text.strip()download_song(driver, session, song_url, song_title, SAVE_DIR)time.sleep(2)

五、使用说明

  • 需要安装 Python 库:selenium, requests, beautifulsoup4
  • 需要对应版本的 Chrome 浏览器和 chromedriver
  • 修改 PAGESSAVE_DIR 变量设置页数和保存目录
  • 脚本支持无头模式,调试时建议注释无头参数查看浏览器行为

六、总结

结合 Selenium 和 Requests,可以绕过传统纯爬虫难以处理的复杂页面交互和授权机制,实现真正的自动化批量下载。这个项目充分体现了自动化测试框架和HTTP请求库的协同优势。

如果你也遇到类似带弹窗授权的网页数据抓取,推荐用类似方法:

  • Selenium先浏览器交互
  • Requests补充接口调用和资源下载

完整代码放到了github:Marblog

http://www.dtcms.com/a/329743.html

相关文章:

  • 嵌入式学习 day50 IMX6ULL裸机开发 - 时钟
  • Linux 5.15.189-rt87 实时内核安装 NVIDIA 显卡驱动
  • 手机充电线贴标机如何使用
  • 内存可见性和伪共享问题
  • php7 太空船运算符
  • 在实验室连接地下车库工控机及其数据采集设备
  • 《零基础入门AI:深度学习中的视觉处理(卷积神经网络(CNN)学习)》
  • Github desktop介绍(GitHub官方推出的一款图形化桌面工具,旨在简化Git和GitHub的使用流程)
  • SpringMVC 6+源码分析(六)参数处理
  • 18. parseInt 的参数有几个
  • C语言——深入理解指针(三)
  • 【LeetCode】6. Z 字形变换
  • 美团搜索推荐统一Agent之性能优化与系统集成
  • Linux小白加油站,第二周
  • 云手机未来的发展趋势如何?
  • docker load镜像后 名字和标签异常解决
  • Centos 用户管理
  • [Oracle数据库] Oracle的表维护
  • 使用dify搭建hr简历助手-上传简历-对接飞书ai表格
  • .NET 应用程序 Linux下守护进程脚本编写
  • 集成电路学习:什么是Image Processing图像处理
  • GIS 常用的矢量与栅格分析工具
  • 机器学习——svm支持向量机
  • 向量相似度计算与Softmax概率分布对比
  • 技术速递|使用 AI Toolkit 构建基于 gpt-oss-20b 的应用程序
  • (cvpr2025) IceDiff: 高分辨率北极海冰预报
  • export default和export function的作用及export的含义
  • 2025网络准入控制系统的作用,保障企业网络安全的坚固防线
  • 使用 6 种方法将文件从 Android 无缝传输到iPad
  • 从行业场景到视觉呈现:3ds Max 与 C4D 效果图的本质分野