使用bs4的find方法爬取亚马逊页面返回None该如何排查?
问题原因
你的代码返回None的核心原因是亚马逊的反爬虫机制拦截了无标识的请求:
- 默认情况下
requests库发起的请求会携带默认的User-Agent标识(值类似python-requests/2.28.0),亚马逊识别到该标识属于爬虫请求后,不会返回正常的商品详情页,而是返回验证页或者错误页,返回的页面源码中不存在id="productTitle"的元素,因此find方法返回None。 - 少数情况下也可能是解析器匹配效率的问题,你也可以将
html.parser替换为lxml提升解析兼容性(需要先安装lxml库:pip install lxml)。
修复方案
给请求添加模拟浏览器的请求头即可解决大部分拦截问题,修改后的代码如下:
from bs4 import BeautifulSoup import requests url = "https://www.amazon.fr/HyperX-Cloud-Sans-fil-interrupteur/dp/B08NTYB4M7/ref=sr_1_2?__mk_fr_FR=%C3%85M%C3%85%C5%BD%C3%95%C3%91&crid=3O51QACXTGCAX&dchild=1&keywords=hyperx+cloud+2+wireless&qid=1630444291&sprefix=hyperx+cloud+2+w%2Caps%2C203&sr=8-2" # User-Agent可替换为你自己浏览器实际的UA,打开浏览器F12控制台的网络选项卡即可查看 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", "Accept-Language": "fr-FR,fr;q=0.9" } # 请求时携带headers参数 page = requests.get(url, headers=headers) # 可选:打印状态码确认请求是否正常,200代表请求成功 print(f"请求状态码:{page.status_code}") soup = BeautifulSoup(page.content, "html.parser") title_ele = soup.find(id="productTitle") if title_ele: print(f"商品标题:{title_ele.get_text().strip()}") else: # 调试用:打印返回的页面前1000字符,确认是否被拦截 print(page.text[:1000])
额外注意事项
- 如果添加请求头后仍返回None,说明触发了更严格的反爬验证,可尝试降低请求频率、添加代理IP,或使用Selenium、Playwright等模拟真实浏览器操作的工具发起请求。
- 亚马逊页面结构会不定期更新,定位元素时可结合class属性、父节点层级等多种方式提升定位稳定性。
内容的提问来源于stack exchange,提问作者Wassim Maestro
相关产品推荐
相关产品推荐

