为何BeautifulSoup无法抓取eBay商品列表中的标题?
解决eBay商品标题抓取返回None的问题
问题原因分析
- 反爬拦截:无浏览器标识的请求会被eBay识别为爬虫,返回的页面结构被调整,导致标题元素无法匹配。
- 页面结构变更:eBay商品标题的元素类名或层级已更新,原
h3.s-item__title选择器无法定位目标内容。 - 无效条目干扰:
s-item__info包含的第一个元素是页面顶部的推荐栏(非商品),该条目没有标题元素。
修复方案
1. 添加请求头模拟浏览器
给请求添加User-Agent,避免被反爬机制拦截:
headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36" } page = requests.get(url, headers=headers)
2. 调整标题元素选择器
当前eBay商品标题嵌套在a.s-item__link标签内,修改选择器定位:
title_tag = item.find("a", class_="s-item__link") if title_tag: listing["title"] = title_tag.get_text(strip=True)
3. 跳过无效非商品条目
页面第一个s-item__info是推荐栏,直接跳过:
for item in items[1:]: # 跳过第一个无效条目 listing = {} # 后续抓取逻辑
完整修复代码
import requests from bs4 import BeautifulSoup import csv def scrape_rolex_listings(reference_numbers, num_pages=1): listings = [] headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36" } for reference_number in reference_numbers: for page_number in range(1, num_pages + 1): url = f"https://www.ebay.com/sch/i.html?_from=R40&_trksid=p2380057.m570.l1313&_nkw={reference_number}&_sacat=0&_pgn={page_number}" page = requests.get(url, headers=headers) soup = BeautifulSoup(page.content, "html.parser") items = soup.find_all("div", class_="s-item__info") for item in items[1:]: listing = {} title_tag = item.find("a", class_="s-item__link") if title_tag: listing["title"] = title_tag.get_text(strip=True) price = item.find("span", class_="s-item__price") if price: listing["price"] = price.text.strip() listings.append(listing) return listings if __name__ == "__main__": reference_numbers = ["116233"] num_pages = 3 listings = scrape_rolex_listings(reference_numbers, num_pages) csv_filename = "rolex712.csv" with open(csv_filename, "w", newline="", encoding="utf-8") as csvfile: csv_writer = csv.writer(csvfile) csv_writer.writerow(["Title", "Price"]) for listing in listings: csv_writer.writerow([listing.get("title", ""), listing.get("price", "")]) print(f"Listings saved to {csv_filename}")
额外提示
- 定期核对页面结构:电商网站会频繁调整元素,若再次抓取失败需重新验证选择器。
- 控制请求频率:在页面请求间添加
time.sleep(1),降低被封禁风险。
内容的提问来源于stack exchange,提问作者Rahman Awan
相关产品推荐
相关产品推荐

