使用Selenium和BeautifulSoup爬取商品库存返回空列表如何解决
亚马逊商品库存爬取问题修复方案
核心共性问题
亚马逊有严格的反爬机制,未做伪装的请求会被拦截,返回人机验证页或空内容响应,这是两种方案都返回空结果的核心原因,除此之外两个版本的代码还存在各自的语法、逻辑错误,具体修复点如下:
Selenium版本问题
- 方法调用错误:Selenium没有
find_element_by_class方法,且多类名不能直接传空格分隔的字符串,需要改用CSS选择器定位,定位到元素后必须取.text属性才能拿到库存文本,原代码直接用元素对象和字符串对比,永远无法匹配。 - 缺少反爬配置:无配置的Chrome浏览器会被亚马逊识别为爬虫,需要添加无头模式、UA伪装、禁用自动化标识等配置,参考配置如下:
from selenium.webdriver.chrome.service import Service options = webdriver.ChromeOptions() # 无头模式(可选,不想弹出窗口就开启) options.add_argument('--headless=new') # 伪装浏览器UA options.add_argument('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') # 隐藏自动化标识 options.add_experimental_option("excludeSwitches", ["enable-automation"]) options.add_experimental_option('useAutomationExtension', False) # 初始化驱动 s = Service('你的chromedriver路径') driver = webdriver.Chrome(service=s, options=options)
- 逻辑优化:拿到的库存文本可能前后带空格、换行,建议用
.strip()处理后再做对比,修改定位和取值代码如下:
status = driver.find_element(By.CSS_SELECTOR, '.a-size-medium.a-color-state') ps5_avail = status.text.strip()
BeautifulSoup版本问题
- 缺少请求头伪装:直接用
requests.get请求亚马逊会被拦截,必须添加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', 'Accept-Language': 'en-US,en;q=0.9' } res = requests.get(url, headers=headers)
- 查找逻辑错误:
find_all(string='In Stock')是完全匹配文本,实际亚马逊的库存文本前后会有多余字符、大小写可能不一致,建议改用模糊匹配;原代码的判断逻辑完全写反,find_all返回的是列表,空列表对应无货,有内容对应有货。修改查找和判断代码如下:
# 模糊匹配包含in stock的文本,不区分大小写 text = soup.find_all(string=lambda t: 'in stock' in t.strip().lower()) if len(text) == 0: print("Out of Stock") else: print("Get it!")
内容的提问来源于stack exchange,提问作者EveryDayDev
相关产品推荐
相关产品推荐

