爬取QQ音乐周杰伦歌曲的歌词

代码如下:

import requests
import json
# 引用requests,json模块

url = 'https://c.y.qq.com/soso/fcgi-bin/client_search_cp'

headers = {
    'origin':'https://y.qq.com',
    # 请求来源,本案例中其实是不需要加这个参数的,只是为了演示
    'referer':'https://y.qq.com/n/yqq/song/004Z8Ihr0JIu5s.html',
    # 请求来源,携带的信息比“origin”更丰富,本案例中其实是不需要加这个参数的,只是为了演示
    'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36',
    # 标记了请求从什么设备,什么浏览器上发出
    }

for x in range(20):
# 伪装请求头
    params = {
    'ct':'24',
    'qqmusic_ver': '1298',
    'new_json':'1',
    'remoteplace':'sizer.yqq.lyric_next',
    'searchid':'48335540534966617',
    'aggr':'1',
    'cr':'1',
    'catZhida':'1',
    'lossless':'0',
    'sem':'1',
    't':'7',
    'p':str(x+1),
    'n':'10',
    'w':'周杰伦',
    'g_tk':'1714057807',
    'loginUin':'0',
    'hostUin':'0',
    'format':'json',
    'inCharset':'utf8',
    'outCharset':'utf-8',
    'notice':'0',
    'platform':'yqq.json',
    'needNewCode':'0'
    }
    res = requests.get(url, params = params)
    #下载该网页,赋值给res
    json_music=res.json()
    # 使用json来解析res.text
    list_music=json_music['data']['lyric']['list']
    # 一层一层地取字典,获取歌词的列表
    for music in list_music:
    #list_music是一个列表,x是它里面的元素
        print(music['content'].replace('\\n', ' '))
    #以content为键,查找歌词
    print("-----------------------------------------------------------------------------------------------------")

注意:

### 使用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树节点集合后即刻执行下一步动作直到找不到可用的“下一页”按钮位置才停止整个流程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

独行者~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值