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

Python BeautifulSoup循环爬取谷歌数据时find返回None问题

问题原因
  • 最直接的错误有两处:一是两份代码的元素定位逻辑不一致,批量爬取代码中查找的是class为EDblX DAVP1的元素,单测代码中查找的是class为KKHQ8c的元素,定位目标从一开始就不匹配;二是批量代码拼接搜索关键词时,电影名和movie genre之间漏了空格,拼出来的搜索词是错误的(比如会把Se7en拼成Se7enmovie genre),直接导致搜索结果不符合预期。
  • 批量请求触发谷歌反爬机制:循环无间隔连续发送搜索请求,短时间的高频访问会被谷歌判定为爬虫流量,返回的页面是人机验证页或异常结构的结果页,不存在正常搜索结果里的电影信息卡片,因此查找元素始终返回None。
  • 定位方式本身不稳定:谷歌搜索结果页的class类名是前端混淆后动态生成的,会随版本迭代、访问环境、请求上下文变化,硬编码写死这类随机类名的方式本身就很容易失效,哪怕单测偶然能跑通,换个请求环境就可能找不到元素。
  • 代码存在不规范写法:用Python内置关键字list作为电影名列表的变量名,会覆盖内置列表方法,存在隐性bug风险。另外单测代码的赋值逻辑也有问题,循环给同一个key赋值最终只会保留最后一个类型标签,拿不到全量结果。
可行解决方法
  • 修正基础逻辑错误:拼接搜索词时在电影名和movie genre之间补上空格,统一元素定位的选择器规则。
  • 替换不稳定的硬编码类名选择器:不要依赖EDblX DAVP1、KKHQ8c这类动态类名,改为通过固定文本特征定位,比如先找到页面中包含「Genre/类型」文本的父级块,再提取块内的标签链接,适配不同结构的返回结果。
  • 给批量请求增加随机间隔,避免触发反爬:每完成一次请求后随机等待2-5秒再发下一次,模拟真人浏览的访问频率,示例代码如下:
import time
import random

# 放在每次请求完成、解析完页面之后
time.sleep(random.uniform(2, 5))
  • 补全请求头参数,模拟真实浏览器请求:不要只携带User-Agent字段,补充Accept、Accept-Language、Referer等常规请求头,降低被识别为爬虫的概率,参考配置:
headers = {
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.5005.63 Safari/537.36',
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8',
    'Accept-Language': 'en-US,en;q=0.9',
    'Referer': 'https://www.google.co.in/'
}
  • 增加调试和异常兜底逻辑:每次请求后先判断响应状态码,如果返回429、403状态码说明已经被反爬拦截,直接触发重试或者等待更长时间;调试阶段可以把返回的页面内容保存到本地文件,确认拿到的是正常搜索结果页再做元素解析,不要盲目调用find方法。
  • 修正不规范写法:把存储电影名的列表变量名从list改为movie_list等自定义名称,避免覆盖内置关键字;提取类型标签时,把单部电影的所有类型存为列表赋值给对应字典key,不要循环覆盖同一个key的值。

内容的提问来源于stack exchange,提问作者Haga Menezes

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 20:31:11