爬取qq音乐排行榜
时间: 2025-05-31 16:54:49 浏览: 29
### 如何用 Python 爬取 QQ 音乐排行榜数据
要实现对 QQ 音乐排行榜的数据爬取,可以采用多种方法。以下是基于 `requests` 和 `scrapy` 的两种常见方式。
#### 方法一:使用 Requests 获取 API 数据
QQ 音乐提供了一些公开的接口来访问其歌曲信息。通过分析请求参数和返回的 JSON 数据,可以直接调用这些接口获取所需的信息。
以下是一个简单的代码示例:
```python
import requests
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
}
params = {
'ct': '24',
'qqmusic_ver': '1298',
'new_json': '1',
'remoteplace': 'txt.yqq.song',
'searchid': '71600317520820180',
't': '0',
'aggr': '1',
'cr': '1',
'catZhida': '1',
'lossless': '0',
'flag_qc': '0',
'p': '1',
'n': '10',
'w': '', # 替换为具体的关键词或留空以获取热门榜单
'g_tk': '5381',
'loginUin': '0',
'hostUin': '0',
'format': 'json',
'inCharset': 'utf8',
'outCharset': 'utf-8',
'notice': '0',
'platform': 'yqq.json',
'needNewCode': '0'
}
url = "https://c.y.qq.com/splcloud/fcgi-bin/smartbox_new.fcg"
response = requests.get(url, headers=headers, params=params)
data = response.json()
print(data)
```
此代码片段展示了如何发送 HTTP 请求并解析返回的 JSON 数据[^2]。
---
#### 方法二:使用 Scrapy 构建完整的爬虫项目
如果需要更复杂的逻辑或者批量处理多个页面,则推荐使用 `Scrapy` 框架构建一个完整的爬虫程序。
下面是一份基本的 Scrapy Spider 示例代码:
```python
import scrapy
class QQMusicSpider(scrapy.Spider):
name = "qq_music"
allowed_domains = ["y.qq.com"]
start_urls = [
"https://y.qq.com/n/ryq/toplist/4"
]
def parse(self, response):
songs = response.css('.songlist__item')
for song in songs:
title = song.css('.songlist__songname_txt::text').get()
singer = song.css('.songlist__artist::text').get()
yield {
'title': title,
'singer': singer
}
```
运行该脚本前需安装 Scrapy 并初始化一个新的项目结构[^1]。
---
#### 使用 Selenium 处理动态加载的内容
对于某些依赖 JavaScript 动态渲染的网页内容(例如部分排行榜),可借助 Selenium 来模拟浏览器行为完成数据采集。
示例代码如下所示:
```python
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
driver = webdriver.Chrome() # 或其他支持的驱动器
driver.get('https://y.qq.com/n/ryq/toplist')
try:
element_present = EC.presence_of_all_elements_located((By.CLASS_NAME, "songlist__songname_txt"))
WebDriverWait(driver, 10).until(element_present)
elements = driver.find_elements(By.CLASS_NAME, "songlist__songname_txt")
for elem in elements:
print(elem.text)
finally:
driver.quit()
```
这段代码利用了显式等待机制确保 DOM 完全加载后再提取目标节点中的文本信息[^3]。
---
### 注意事项
1. **合法性**:在实际操作过程中应严格遵守相关法律法规以及服务提供商的服务条款。
2. **频率控制**:频繁发起请求可能会触发反爬策略,请合理设置时间间隔。
3. **错误处理**:增加异常捕获功能提升稳定性。
阅读全文
相关推荐


















