使用Requests与BS4抓取亚马逊商品时如何提取销售排名数据
亚马逊商品销售排名提取实现
以下是直接可用的提取代码,适配亚马逊英国站的商品详情页结构:
核心提取逻辑
# 优先通过固定ID定位销售排名行 rank_row = soup.find('tr', {'id': 'SalesRank'}) if rank_row: rank_text = rank_row.find('td', class_='a-size-base').text.strip() # 过滤非数字字符,提取纯排名数值 sales_rank = ''.join([c for c in rank_text if c.isdigit() or c == ',']).split(' ')[0] else: # 兼容页面结构微调的降级匹配逻辑 for tr in soup.select('#productDetails_detailBullets_sections1 tr'): if 'Best Sellers Rank' in tr.text: rank_text = tr.find('td', class_='a-size-base').text.strip() sales_rank = ''.join([c for c in rank_text if c.isdigit() or c == ',']).split(' ')[0] break else: sales_rank = '未获取到排名'
整合后完整可运行代码
import requests from bs4 import BeautifulSoup import pandas as pd headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.82 Safari/537.36" } url = 'https://www.amazon.co.uk/dp/B083PHB6XX' r = requests.get(url, headers=headers) soup = BeautifulSoup(r.content, 'lxml') name = soup.find('span', {'id': 'productTitle'}).text.strip() price = soup.find('span', {'id': 'priceblock_ourprice'}).text.strip() # 提取销售排名 rank_row = soup.find('tr', {'id': 'SalesRank'}) if rank_row: rank_text = rank_row.find('td', class_='a-size-base').text.strip() sales_rank = ''.join([c for c in rank_text if c.isdigit() or c == ',']).split(' ')[0] else: sales_rank = '未获取到排名' print("商品名称:", name) print("商品价格:", price) print("销售排名:", sales_rank)
说明
- 原始排名文本会附带分类信息,例如
#106,505 in Home & Kitchen,通过字符过滤后仅保留数字与逗号,即可得到目标数值 - 如果运行后返回未获取到排名,先检查请求返回内容是否为亚马逊验证码页面,更换User-Agent值即可解决
内容的提问来源于stack exchange,提问作者in_d
相关产品推荐
相关产品推荐

