使用BeautifulSoup+Requests爬取亚马逊印度畅销书价格为空的解决方法
问题分析与解决方案
首先明确:lxml完全适用于你的场景,它是BeautifulSoup支持的高效HTML解析器,处理亚马逊这类结构复杂的页面比默认的html.parser更稳定。不过你遇到的价格列表为空问题,核心原因大概率不是解析器,而是亚马逊的反爬机制或者请求头不规范,导致返回的页面没有价格数据。
解决步骤
1. 修正请求头,模拟浏览器访问
亚马逊会检测请求的User-Agent,默认requests库的User-Agent是python-requests/xxx,很容易被识别为爬虫,返回的页面会缺失价格等核心数据。你需要添加真实的浏览器User-Agent(可通过浏览器F12→网络→请求头查看自己的UA)。
2. 安装并使用lxml解析器
先确保已经安装lxml:
pip install lxml
3. 正确定位价格元素
亚马逊的页面类名可能会动态调整,需要用浏览器F12工具实时查看价格元素的选择器(当前亚马逊印度图书畅销榜的价格元素类为p13n-sc-price)。
完整代码示例
import requests from bs4 import BeautifulSoup url = "https://www.amazon.in/gp/bestsellers/books/" headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36" } # 发送请求 response = requests.get(url, headers=headers) response.raise_for_status() # 确保请求成功 # 用lxml解析页面 soup = BeautifulSoup(response.text, "lxml") # 遍历每个畅销图书条目 for item in soup.select(".zg-item-immersion"): # 提取书名 title = item.select_one(".zg-item-title").get_text(strip=True) if item.select_one(".zg-item-title") else "无书名" # 提取作者 author = item.select_one(".a-size-small.a-color-secondary").get_text(strip=True) if item.select_one(".a-size-small.a-color-secondary") else "无作者" # 提取价格 price = item.select_one(".p13n-sc-price").get_text(strip=True) if item.select_one(".p13n-sc-price") else "无价格" print(f"书名: {title}\n作者: {author}\n价格: {price}\n---")
注意事项
- 如果还是获取不到价格,先查看
response.text的内容,确认页面里是否有价格数据。若没有,可能需要添加更多请求头(比如Accept-Language)或使用会话保持。 - 亚马逊的页面结构可能随时更新,若代码突然失效,先检查元素选择器是否需要调整。
内容的提问来源于stack exchange,提问作者ml ds
相关产品推荐
相关产品推荐

