如何使用bs4获取谷歌搜索第一条结果链接,返回None如何解决?
错误原因
- 核心问题是请求未携带合法浏览器身份标识:
requests库默认发送的请求头中User-Agent字段值为python-requests/版本号,谷歌的反爬策略会识别这类爬虫请求,返回的是反爬验证页面,而非正常用户访问的搜索结果页,页面结构中不存在class为yuRUbf的div标签,因此find方法返回None。 - 次要可优化点:你使用的url携带了大量谷歌生成的临时会话参数,这类参数有有效期,过期后访问也可能返回异常页面,搜索请求只需要保留核心的
q参数即可。
修复代码
import requests import bs4 # 简化url,仅保留核心搜索参数 url = 'https://www.google.com/search?q=site:stackoverflow.com how to use bs4 in python' # 添加模拟浏览器的请求头 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' } request_result = requests.get(url, headers=headers) # 也可以将解析器换成lxml,容错性比html.parser更高,需要提前执行pip install lxml安装 soup = bs4.BeautifulSoup(request_result.text, "html.parser") productDivs = soup.find("div", {"class": "yuRUbf"}) print(productDivs) # 如果要提取第一条结果的链接可以新增代码:print(productDivs.a['href'])
注意事项
- 不要短时间内发送大量请求,否则谷歌会触发验证码验证甚至封禁IP。
- 谷歌页面结构可能会不定期调整,若后续再次获取失败可以重新核对对应标签的class属性是否有变更。
内容的提问来源于stack exchange,提问作者user16748482
相关产品推荐
相关产品推荐

