python爬取qq音乐周杰伦
时间: 2025-01-15 17:52:02 浏览: 38
### 使用Python爬虫抓取QQ音乐网站上周杰伦的歌曲信息
为了实现这一目标,可以采用`requests`库配合`BeautifulSoup`解析网页内容。然而,由于现代Web应用广泛使用JavaScript动态加载数据,直接通过简单的HTTP GET请求可能无法获得所需的数据。对于这种情况,通常有两种解决方案:
#### 方案一:分析AJAX请求并模拟发送
许多网站在前端展示的内容实际上是通过向服务器发出额外的API调用来获取的。这些API往往返回JSON格式的数据,可以直接用于提取有用信息而无需处理HTML文档。
针对QQ音乐的情况,在浏览器开发者工具中查看网络活动可以帮助找到实际查询歌曲列表所使用的接口地址及其参数设置方式[^1]。一旦确定了具体的URL模式以及必要的查询字符串参数(如页码、关键词等),就可以利用`requests`构建相应的GET请求来取得每一页的结果集,并从中解析出感兴趣的字段,比如歌曲名称、专辑封面链接等等。
```python
import json
import requests
def fetch_songs(page_num):
url = "https://c.y.qq.com/soso/fcgi-bin/client_search_cp"
params = {
'ct': '24',
'qqmusic_ver': '1298',
'new_json': '1',
'remoteplace': 'sizer.yqq.song_next',
'searchid': '64405487069162918',
't': '0',
'aggr': '1',
'cr': '1',
'catZhida': '1',
'lossless': '0',
'flag_qc': '0',
'p': str(page_num),
'n': '20', # Number of songs per page
'w': '%E5%91%A8%E6%9D%B0%E4%BC%A6', # URL-encoded search term (Jay Chou)
'g_tk_new_20200303': '5381',
'g_tk': '5381',
'loginUin': '0',
'hostUin': '0',
'format': 'json',
'inCharset': 'utf8',
'outCharset': 'utf-8',
'notice': '0',
'platform': 'yqq.json',
'needNewCode': '0'
}
response = requests.get(url=url, headers={'Referer': 'https://y.qq.com/'}, params=params)
if response.status_code != 200:
raise Exception(f"Failed to retrieve data with status code {response.status_code}")
result = json.loads(response.content.decode())
song_list = []
try:
for item in result["data"]["song"]["list"]:
title = item["name"]
album_name = item["album"]["name"]
singer_names = ",".join([singer["name"] for singer in item["singer"]])
song_info = {"title": title,
"albumName": album_name,
"artistNames": singer_names}
song_list.append(song_info)
return song_list
except KeyError as e:
print("Error parsing JSON:", e)
for i in range(1, 11): # Fetch first ten pages
songs_on_page_i = fetch_songs(i)
for song in songs_on_page_i:
print(json.dumps(song))
```
此脚本定义了一个名为`fetch_songs()`的功能函数,该函数接受一个整数类型的参数表示要访问的具体页面编号;接着设置了包含必要查询项在内的字典对象作为GET方法中的参数传递给指定的目标站点;最后对响应体内的结构化数据进行了适当转换以便于后续操作。
请注意,上述代码片段仅适用于说明目的,具体实施时还需要考虑更多细节问题,例如错误处理机制的设计、反爬策略规避措施的应用等方面。
#### 方案二:借助自动化测试框架Selenium
如果遇到某些情况下难以定位到确切的API端点或者对方采取了一定程度上的防护手段使得常规手段失效,则可转而运用像Selenium这样的工具来进行交互式的浏览行为仿真。这种方式虽然效率较低且资源消耗较大,但在面对复杂场景时却能提供更高的灵活性和成功率。
安装依赖包之后,可以通过下面这段示范性的代码完成相似的任务:
```python
from selenium import webdriver
from time import sleep
driver_path = '/path/to/chromedriver' # Replace this path according to your environment setup.
options = webdriver.ChromeOptions()
prefs = {'profile.managed_default_content_settings.images': 2} # Disable image loading to speed up the process
options.add_experimental_option('prefs', prefs)
browser = webdriver.Chrome(executable_path=driver_path, options=options)
try:
base_url = f"https://y.qq.com/n/ryqq/search?page={i}&query=%E5%91%A8%E6%9D%B0%E4%BC%A6&type=song"
browser.get(base_url.format(i))
while True:
soup = BeautifulSoup(browser.page_source, features="lxml")
tracks = []
track_elements = soup.select('.result__item')
for element in track_elements[:len(track_elements)]:
name = element.h4.a.string.strip().replace('\n', '')
artist = ''.join(element.span.stripped_strings).strip()
tracks.append({
'trackTitle': name,
'artists': artist
})
for t in tracks:
print(t)
next_button = browser.find_element_by_css_selector(".btn-next")
if not ('disabled' in next_button.get_attribute('class')):
next_button.click()
sleep(2) # Wait until new content loads completely before continuing
else:
break
finally:
browser.quit() # Ensure that WebDriver instance is closed properly even when an exception occurs during execution.
```
这里选择了ChromeDriver作为驱动器实例化了一个WebDriver对象,并配置了一些选项以优化性能表现。随后进入循环迭代过程直至遍历完所有的分页记录为止。每次读取当前视图下的DOM树节点集合后即刻执行下一步动作直到找不到可用的“下一页”按钮位置才停止整个流程。
阅读全文
相关推荐


















