Python 抓取 Genius 网站歌词返回内容被截断的问题求助
问题根因
- 文件写入模式错误:你在遍历歌词标签的循环内部用
w(覆盖写入)模式打开文件,每匹配到一个歌词容器标签,就会清空之前写入的内容,最终文件只会保留最后一个标签的歌词内容,自然出现截断。 - 未携带请求头:Genius对无标识的请求会返回截断的页面内容,甚至触发反爬拦截。
- 选择器兼容性不足:Genius的页面结构有过多次迭代,你使用的混合选择器可能漏匹配部分歌词容器。
修复方案
- 将文件打开逻辑移到标签遍历的外层,先拼接所有匹配到的歌词内容再一次性写入,避免覆盖
- 给requests请求添加标准UA头,模拟浏览器访问,避免反爬返回不完整页面
- 优化索引获取和路径处理逻辑,提升兼容性
修复后代码如下:
import requests from bs4 import BeautifulSoup from time import time import os urls = ['https://genius.com/The-Stooges-1969-lyrics','https://genius.com/The-Stooges-1970-lyrics', 'https://genius.com/The-Rolling-Stones-19th-Nervous-Breakdown-lyrics','https://genius.com/Lil-Wayne-3-Peat-lyrics', 'https://genius.com/RunDMC-30-Days-lyrics','https://genius.com/Bob-marley-and-the-wailers-four-hundred-years-lyrics', 'https://genius.com/The-Clash-48-Hours-lyrics'] # 自定义存储路径,自动创建目录避免报错 save_path = "./lyrics" os.makedirs(save_path, exist_ok=True) # 添加UA头模拟浏览器访问 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" } start = time() # 用enumerate直接获取索引,避免list.index的性能问题和重复URL匹配错误 for idx, u in enumerate(urls): resp = requests.get(u, headers=headers) resp.encoding = "utf-8" soup = BeautifulSoup(resp.text, 'lxml') full_lyrics = [] # 兼容多版本页面的歌词选择器 for tag in soup.select('div[class^="Lyrics__Container"], .song_body-lyrics p, div[class*="lyrics"]'): lyrics = tag.get_text(strip=True, separator='\n') if lyrics.strip(): full_lyrics.append(lyrics) # 所有歌词拼接完成后一次性写入文件 with open(os.path.join(save_path, f"{idx}.txt"), 'w', encoding="utf-8") as f: f.write("\n".join(full_lyrics)) print(f'Time taken: {time() - start}')
- 代码指定了文件编码为utf-8,避免不同系统下写入出现乱码
- 用
os.path.join处理路径,适配Windows、macOS、Linux的路径规则,不会出现转义错误
内容的提问来源于stack exchange,提问作者PSCM
相关产品推荐
相关产品推荐

