You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

谷歌歌词爬取失败:无法精准提取歌词,返回全部文本

谷歌歌词爬取问题:仅需歌词内容却返回整页文本

我尝试从谷歌搜索结果中提取歌曲《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)

问题分析与修复方案

问题点

  1. 第一段代码存在关键词拼写错误:lyrcis应为lyrics,且谷歌搜索的动态属性名(如jsname="WbKHeb")会频繁变更,依赖这类属性定位元素稳定性差。
  2. 第二段代码:
    • 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 02:40:55