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
相关产品推荐
相关产品推荐

