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

BeautifulSoup抓取谷歌SERP时返回错误href值如何解决

你的代码存在以下4个核心问题:

  • 缺少html模块导入:代码中调用了html.unescape()但没有提前导入html模块,运行会直接抛出名称错误
  • 未设置请求头UA:直接用requests默认UA发起请求,谷歌会识别为爬虫请求,返回的页面结构和真实浏览器访问的结构存在差异,元素定位稳定性极差
  • 元素定位逻辑脆弱:通过parent.parent两层父节点查找a标签的方式完全依赖当前谷歌SERP的DOM层级,只要谷歌调整页面结构就会定位错误,拿到无关链接
  • 未处理谷歌搜索结果的跳转前缀:谷歌所有自然搜索结果的href属性本身就默认携带/url?q=前缀的跳转追踪参数,你拿到的不是错误链接,是没有解析提取真实目标地址的谷歌跳转链接

修复后可正常提取目标链接的代码如下:

import requests
from bs4 import BeautifulSoup
import html
from urllib.parse import urlparse, parse_qs

# 模拟Chrome浏览器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"
}

URL = "https://www.google.com/search?q=beautiful+soup&rlz=1C1GCEB_enIN922IN922&oq=beautiful+soup&aqs=chrome..69i57j69i60l3.2455j0j7&sourceid=chrome&ie=UTF-8"
r = requests.get(URL, headers=headers)
webPage = html.unescape(r.text) 

soup = BeautifulSoup(webPage, 'html.parser')
# 直接定位搜索结果块的a标签,不再依赖h3的父节点层级
g_results = soup.select('div.g a[href^="/url?q="]')

for a_tag in g_results:
    # 提取h3标题
    title_tag = a_tag.find('h3')
    if not title_tag:
        continue
    print(title_tag.text)
    # 解析href参数提取真实目标地址
    href = a_tag.get('href')
    parsed_href = urlparse(href)
    real_url = parse_qs(parsed_href.query).get('q', [None])[0]
    if real_url:
        print(real_url)

额外提示:如果需要长期稳定抓取谷歌SERP,建议不要直接通过静态HTML解析的方式,谷歌反爬策略更新频率很高,频繁请求很容易被封禁IP。

内容的提问来源于stack exchange,提问作者Ahmed Osama

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 09:15:02