You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何BeautifulSoup无法抓取eBay商品列表中的标题?

解决eBay商品标题抓取返回None的问题

问题原因分析

  1. 反爬拦截:无浏览器标识的请求会被eBay识别为爬虫,返回的页面结构被调整,导致标题元素无法匹配。
  2. 页面结构变更:eBay商品标题的元素类名或层级已更新,原h3.s-item__title选择器无法定位目标内容。
  3. 无效条目干扰: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 22:17:38