谷歌歌词爬取失败:无法精准提取歌词,返回全部文本
谷歌歌词爬取问题:仅需歌词内容却返回整页文本
我尝试从谷歌搜索结果中提取歌曲《Raindrops Keep Fallin' on My Head》的歌词,但返回的是页面全部文本,而非目标歌词。以下是我试过的两段代码:
第一段代码
import requests from bs4 import BeautifulSoup page = requests.get('https://www.google.com/search?q=RaindropsKeepFallinonMyHead+lyrcis&') soup = BeautifulSoup(page.content, 'html.parser').find_all('div',jsname="WbKHeb") print(soup)
第二段代码
def extract(Title): headers = {'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36'} url= f'https://www.google.com/search?q={Title}lyrics' r= requests.get(url, headers) # starting to get data from bilboard website soup= BeautifulSoup(r.content,'html.parser') # pull html from the website return soup def transform(soup): page = soup.find('div',class_="B03h3d V14nKc EN1f2d ptcLIOszQJu__wholepage-card wp-ms") pageTEXT=BeautifulSoup(page.prettify(), 'html.parser').get_text() return print(page) c=extract('RaindropsKeepFallinonMyHead') print(c)
问题分析与修复方案
问题点
- 第一段代码存在关键词拼写错误:
lyrcis应为lyrics,且谷歌搜索的动态属性名(如jsname="WbKHeb")会频繁变更,依赖这类属性定位元素稳定性差。 - 第二段代码:
transform函数未被调用,导致仅打印了原始解析对象,未处理歌词;- 依赖的动态类名
B03h3d V14nKc...是谷歌临时生成的,时效性极低,且重复解析BeautifulSoup属于冗余操作。
修复后的代码
谷歌搜索结果中,歌词区域通常带有data-lyricid属性,这是相对稳定的定位标识。以下是更可靠的实现:
import requests from bs4 import BeautifulSoup def get_google_lyrics(song_title): headers = { 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36' } # 修正关键词格式,用+替换空格提升搜索准确性 url = f'https://www.google.com/search?q={song_title.replace(" ", "+")}+lyrics' response = requests.get(url, headers=headers) soup = BeautifulSoup(response.text, 'html.parser') # 优先通过data-lyricid定位歌词容器 lyric_container = soup.find('div', attrs={'data-lyricid': True}) if not lyric_container: # 备用方案:定位通用歌词容器 lyric_container = soup.find('div', class_='hwc') if lyric_container: # 提取并过滤空行,输出整洁歌词 lyrics = [line.strip() for line in lyric_container.stripped_strings if line.strip()] print('\n'.join(lyrics)) else: print("未找到目标歌词内容") # 调用示例 get_google_lyrics('Raindrops Keep Fallin on My Head')
说明
- 采用
data-lyricid属性定位,比动态类名稳定性更高; - 增加备用定位逻辑,避免单一选择器失效;
- 处理关键词格式,优化搜索结果匹配度;
- 过滤空行,让歌词输出更规整。
内容的提问来源于stack exchange,提问作者Joao Fernandes
相关产品推荐
相关产品推荐

