使用Beautiful Soup爬取亚马逊产品仅返回16条结果,页面实际有30条,原因何在?
为什么你的Beautiful Soup爬亚马逊只拿到16条商品?
我之前爬亚马逊的时候也碰到过这种情况,明明页面显示30条,但静态解析出来只有十几条,大概率是这几个原因:
1. 商品是动态加载的
亚马逊的搜索结果页经常不会一次性把所有商品都塞进初始HTML里。你看到的30条里,前16条可能是页面加载时就渲染好的,剩下的需要你滚动页面到下方,才会通过AJAX请求加载新的内容。而Beautiful Soup只能解析请求返回的静态HTML,自然拿不到后面没加载的商品。
解决办法是用浏览器自动化工具(比如Selenium或Playwright)模拟用户滚动页面,等所有商品都加载完成后再解析:
from selenium import webdriver from bs4 import BeautifulSoup import time # 初始化浏览器(这里用Chrome,需要对应版本的驱动) driver = webdriver.Chrome() driver.get("你的亚马逊搜索页面URL") # 模拟滚动到底部,触发加载 last_scroll_height = driver.execute_script("return document.body.scrollHeight") while True: # 滚动到当前页面底部 driver.execute_script("window.scrollTo(0, document.body.scrollHeight);") # 等待2秒让内容加载(根据网络情况调整) time.sleep(2) # 获取新的滚动高度 new_scroll_height = driver.execute_script("return document.body.scrollHeight") # 如果高度不再变化,说明已经加载完所有内容 if new_scroll_height == last_scroll_height: break last_scroll_height = new_scroll_height # 现在解析完整的页面源码 soup = BeautifulSoup(driver.page_source, 'html.parser') # 替换成你原来用的商品选择器 products = soup.select(".s-result-item") print(f"总共抓到{len(products)}条商品") driver.quit()
2. 亚马逊的反爬机制截断了内容
亚马逊对爬虫很敏感,如果你的请求没有模拟正常浏览器的行为,服务器可能会返回不完整的页面内容,只给你显示部分商品。
这时候可以先给请求加个真实的User-Agent头,模拟浏览器访问:
import requests from bs4 import BeautifulSoup 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' } response = requests.get("你的亚马逊搜索页面URL", headers=headers) # 先检查返回的状态码,200才是正常 print(f"请求状态码: {response.status_code}") soup = BeautifulSoup(response.text, 'html.parser') products = soup.select(".s-result-item") print(f"抓到{len(products)}条商品")
如果加了User-Agent还是不行,可能需要进一步处理,比如添加Referer头、设置请求间隔,甚至用代理IP。
3. 你的选择器只匹配了部分商品
有时候亚马逊的页面结构里,前几页的商品和后面的商品可能用了不同的类名或者容器。比如前16条在某个<div>里,剩下的在另一个<section>里,而你的选择器只定位了第一个容器。
解决办法是打开浏览器的开发者工具(F12),分别查看前16条和后面的商品的HTML结构,确认它们的共同选择器是什么,然后调整你的代码里的选择器。
你可以先按这个顺序排查:先检查请求返回的HTML里有没有30条商品(直接打印response.text搜索商品关键词),如果没有,那要么是动态加载要么是反爬;如果有,那就是选择器的问题。
内容的提问来源于stack exchange,提问作者Deps
相关产品推荐
相关产品推荐

