Web Scraping抓取谷歌搜索结果页时无法获取全部链接如何解决?
问题成因
- 默认请求特征触发谷歌反爬:requests发送请求时默认携带的
User-Agent值为python-requests/[版本号],谷歌识别到是爬虫请求后,会直接返回精简版、截断版的搜索页面,不会返回和桌面浏览器一致的完整SERP内容,这是该问题最核心的诱因。 - 未携带有效会话参数:正常浏览器访问谷歌搜索时会被下发用于身份验证的Cookie,无有效Cookie的裸请求大概率会被限制返回内容的完整度。
- IP/区域匹配偏差:如果请求IP和你本地Chrome访问的IP所属区域不同,谷歌也会返回结构、内容量级完全不同的搜索结果,导致对应标签缺失。
另外你当前的代码逻辑也存在丢链问题:正则规则仅匹配.com后缀的域名,会直接漏掉.in、.org等其他后缀的站点。
修复方案
- 优先修改请求头,添加模拟桌面浏览器的标识,示例修改后代码如下:
import requests from bs4 import BeautifulSoup import re # 添加模拟Chrome的请求头配置 headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36" } url = "https://www.google.com/search?q=glass+beads+india" # 请求时携带headers参数 r = requests.get(url, headers=headers) page = r.text soup = BeautifulSoup(page, 'lxml') link_list = [] for tag in soup.find_all('a'): href = tag['href'] # 优先匹配谷歌跳转链接格式,提取目标地址 if href.startswith('/url?q='): raw_link = href.split('/url?q=')[1].split('&')[0] if 'google.com' not in raw_link: # 提取域名逻辑可根据需求调整,无需限制.com后缀 try: domain = re.search('https?://[^/]+', raw_link).group(0) link_list.append(domain) except: pass link_list = list(set(link_list)) print(link_list)
- 如果调整请求头后仍有内容缺失,说明对应内容是前端JS动态渲染生成的,需要改用
selenium、playwright等模拟浏览器的工具加载完整页面后再提取内容。
内容的提问来源于stack exchange,提问作者Sudheer G
相关产品推荐
相关产品推荐

