如何抓取eBay搜索结果:会话预热和反检测指南
Advanced Data Extraction Specialist
主要收获:
- 冷请求被eBay的搜索端点阻止。 直接自动导航到
https://www.ebay.com/sch/i.html?_nkw=laptop会跳转到eBay的错误页面,即使是在全新的美国住宅云浏览器会话中——eBay对搜索路径的保护比其商品和浏览页面更严格。 - 预热会话是解锁的关键。 打开一个持久的云浏览器会话,首先访问eBay的主页,以便让Cookies和导航状态稳定,然后在同一会话中导航到搜索URL。此时,搜索页面会以完整的结果网格加载。
- 在
.su-card-container上提取锚点。 eBay旋转了其结果卡片的标记;旧的li.s-item选择器现在不匹配任何内容。当前的自然结果卡片携带.su-card-container类——根据该类进行选择,并读取每张卡片上的子字段。 - 集成是一个CDP端点。 使用你的API密钥构建一个Scrapeless Scraping Browser WebSocket URL,Playwright的
connect_over_cdp就像驱动本地浏览器一样精确驱动它——因此,渲染、住宅出网和指纹识别都在云端进行。 - 住宅出网支持运行。 Scrapeless Scraping Browser 通过195多个国家的住宅代理进行路由,并在每个会话中随机化浏览器指纹,因此云浏览器呈现出eBay页面,而本地自动化浏览器会被过滤。
- 免费开始。 新的Scrapeless账户包括免费的Scraping Browser运行时——在 app.scrapeless.com 注册。
引言:为什么eBay的搜索页面阻止明显的方法
eBay是网络上最大的公共市场之一,其搜索结果是一个密集的定价、列表和竞争数据来源。定价团队跟踪类似商品的销售价格,品牌保护团队监测未经授权的列表,AI代理提取列表上下文以回答产品问题。所有这些都存在于 /sch/i.html 的搜索端点后面。
显而易见的方法——将HTTP客户端或本地无头浏览器指向该URL——很快就会失败。对 https://www.ebay.com/sch/i.html?_nkw=laptop 的冷自动请求会转到eBay的错误页面而不是结果。这种情况即使在干净的美国住宅IP上也会发生:eBay会评估IP信誉、设备指纹、请求速率和行为信号,并比其商品和浏览页面更积极地保护搜索路径。该页面对人类可渲染,但对脚本则被阻止。
本教程基于Scrapeless Scraping Browser构建了一个Python管道,通过像真正的访客一样到达主页首先,让会话预热,然后在同一会话中进行搜索,从而清除了该门槛。你可以通过CDP与Playwright连接到云浏览器,作为官方支持客户端,从而使渲染、住宅出网和反检测指纹识别都发生在云端。有关使用相同原语构建的不同大型市场的示例,请参见最佳亚马逊抓取工具总结;有关 across 工具的本地定价比较,参见2026年最佳Zillow抓取工具。
你可以用它做什么
预热会话模式——先访问主页,然后在一个保持的云浏览器会话中进行搜索和详细页面——覆盖了eBay数据管道所需的大部分工作:
- 跟踪竞争对手定价。 从搜索查询中的每个结果卡片中提取价格和列表标题,然后定期与自己的目录进行比较。
- 监控产品类别。 在类别或关键字查询中跨页面浏览,收集列表以进行趋势分析。
- 监测未经授权的列表。 搜索你的品牌或SKU,并标记不应列出它的卖家。
- 捕获地理特定结果。 锁定美国住宅出网,以查看美国购物者将看到的列表、货币和可用性,而不是办公室IP解析的任何内容。
- 将列表上下文传送给AI代理。 渲染搜索和商品页面,以清晰结构化的字段,使检索层或代理能够用当前数据回答产品问题。
- 构建价格历史数据集。 随时间快照相同的查询,并存储渲染结果,以研究价格变动。
为什么选择Scrapeless Scraping Browser
Scrapeless Scraping Browser 是一个可自定义的反检测云浏览器,专为网络爬虫和AI代理设计。对于eBay特别而言,它带来了:
- 反检测云浏览器。 它运行一个自开发的Chromium,具有完整的云端JavaScript渲染,因此在解析器读取之前,搜索网格、延迟加载的图像和商品详情都会得到填充。
- 在195多个国家的住宅代理。 在连接URL上设置
proxyCountry,云浏览器将从您目标地区的真实住宅IP出口,因此eBay返回的内容是当地购物者所看到的。 - 每会话指纹随机化。 每个会话获得一个随机的指纹——用户代理、时区、WebGL和画布——因此自动化浏览器不会崩溃成单一可检测身份。
- 通过
sessionTTL保持会话持久性。 通过在连接URL上设置sessionTTL,在首页预热和搜索导航之间保持一个会话开启,因此cookies和导航状态在单次运行中的请求之间携带。 - 单一CDP端点。 使用您的API密钥构建一个WebSocket URL;Playwright的
connect_over_cdp像本地浏览器一样驱动它,因此您的解析代码无需更改。
运行时免费开始,并随使用情况扩展——请参阅Scrapeless定价了解各个层级,并在app.scrapeless.com的免费计划中获取您的API密钥。
前提条件
在开始之前,请确保您具备:
- Python 3.10+ — 下方获取程序库所需。
- pip — 安装软件包。
- 一个Scrapeless帐户和API密钥 — 在app.scrapeless.com注册免费计划,然后在设置 → API密钥管理中获取您的密钥。
- 对CSS选择器和终端的基本熟悉 — 您将使用这两者来抓取页面并提取值。
安装
您需要一个软件包:Playwright,这是Scrapeless抓取浏览器的官方支持客户端。
1. 安装Playwright
bash
pip install playwright
Playwright的connect_over_cdp连接到远程Scrapeless云浏览器,因此您不需要运行playwright install或下载任何本地浏览器二进制文件——渲染发生在云端。Playwright在多个页面加载之间保持一个连接开放,这使得首页预热和搜索共享一个会话身份。
2. 设置您的Scrapeless API密钥
导出您的密钥,以便它可以在连接URL中使用:
bash
export SCRAPELESS_API_KEY=your_api_token_here
在Windows上,请使用setx SCRAPELESS_API_KEY "your_api_token_here"(持久性,新shell)或$env:SCRAPELESS_API_KEY="your_api_token_here"(当前PowerShell会话)。下方的连接助手读取此变量并将其嵌入到URL中作为token。
第一步 — 构建连接并确认冷请求被阻止
首先重现阻止,以便其余的管道有一个清晰的基准。构建Scrapeless抓取浏览器URL,使用Playwright连接,并直接导航到搜索端点,而不先访问首页。
python
import os
from urllib.parse import urlencode
from playwright.sync_api import sync_playwright
def scraping_browser_url(proxy_country="US", session_ttl=240):
# API密钥作为`token`通过URL传递;出口和生命周期是查询参数。
params = urlencode({
"token": os.environ["SCRAPELESS_API_KEY"],
"sessionTTL": session_ttl,
"proxyCountry": proxy_country,
})
return f"wss://browser.scrapeless.com/api/v2/browser?{params}"
with sync_playwright() as p:
browser = p.chromium.connect_over_cdp(scraping_browser_url("US"))
page = browser.new_page()
# 冷导航直接到搜索端点,不做首页预热。
page.goto("https://www.ebay.com/sch/i.html?_nkw=laptop",
wait_until="domcontentloaded")
print(page.title()) # -> "错误页面 | eBay" / "访问被拒绝"
browser.close()
冷自动化导航到/sch/i.html落在eBay错误页面上,即使会话从干净的美国住宅IP出口。eBay将搜索端点视为敏感路径,并挑战没有建立浏览上下文的请求。解决方案不是不同的头或不同的IP——而是以人员到达的方式,这就是下一步。
第二步 — 在首页预热会话,然后搜索
解锁在于保持会话。打开一个云浏览器连接,首先加载eBay首页,以便cookies和导航状态得到稳定,然后在同一会话内导航到搜索URL。Playwright保持与Scrapeless云浏览器的单个CDP连接开放,并通过它驱动每个页面,因此预热和搜索共享同一身份。
python
with sync_playwright() as p:
browser = p.chromium.connect_over_cdp(scraping_browser_url("US"))
page = browser.new_page()
# 1. 预热会话:访问首页以便cookies/导航状态稳定。
page.goto("https://www.ebay.com/", wait_until="domcontentloaded")
page.wait_for_timeout(2500)
# 2. 现在在同一会话中导航到搜索。
page.goto("https://www.ebay.com/sch/i.html?_nkw=laptop",
等待直到 = "domcontentloaded"
页面等待超时(3000) # 让网格生成内容
打印(页面标题()) # -> "二手笔记本电脑出售 | eBay"
卡片 = 页面查询选择器所有(".su-card-container") # 渲染的结果卡片
打印(len(卡片), "卡片") # 网格现在已填充
---
在首先访问首页后,在步骤1中被阻止的相同搜索URL现在返回标题`二手笔记本电脑出售 | eBay`和填充的结果网格。在导航后的短时间`等待超时`让卡片生成内容,便于提取。整个区别在于在一个保持会话内的到达顺序 — 首页建立浏览上下文,搜索请求继承它。
---
## 步骤3 — 提取结果卡片
eBay 旋转了结果卡片的标记,因此依赖当前类。自然结果卡片携带 **`.su-card-container`**;较旧的 `li.s-item` 选择器现在不匹配任何内容。选择卡片,然后读取每个卡片的子字段。
```python
def文本_of(元素,选择器):
节点 = 元素查询选择器(选择器)
返回 节点.inner_text().strip()如果节点 其他 None
记录 = []
对于 卡片 在 页面查询选择器所有(".su-card-container"):
# 子选择器仅为说明 — 根据当前 eBay DOM 确认标题/价格/链接节点,
# 因为标记是会变动的。
标题 = 文本_of(卡片, ".su-styled-text") # 列表标题(说明路径)
价格 = 文本_of(卡片, ".su-styled-text.s-price") # 价格文本(说明路径)
链接元素 = 卡片查询选择器("a") # 列表网址
链接 = 链接元素.get_attribute("href")如果链接元素 其他 None
记录.追加({
"标题": 标题,
"价格": 价格,
"链接": 链接,
})
打印(len(记录), "列表")
将每次提取锚定在 .su-card-container;将子选择器(标题,价格,链接)视为确认当前实时 DOM 的起始点,因为 eBay 独立于卡片包装重新排列内部标记。将每个缺失的字段默认设置为 None,以便稀疏卡片不会崩溃运行 — eBay 在某些列表格式(竞标中的拍卖、"查看详情"位置)中省略价格,少数卡片是具有不同形状的赞助槽。
在免费计划中获取您的 API 密钥:app.scrapeless.com
步骤4 — 翻页结果并跟随列表到详细页面
大多数实际工作跨越多个 URL。由于会话已经温暖并保持打开,从结果中翻页并跟随单个列表到其物品页面不会额外消耗 — 相同的cookies,住宅身份和指纹在整个过程中保持不变。eBay通过_pgn查询参数对搜索端点进行分页。
python
行 = []
使用 sync_playwright() 作为 p:
浏览器 = p.chromium.connect_over_cdp(scraping_browser_url("US", session_ttl=300))
页面 = 浏览器.new_page()
页面.goto("https://www.ebay.com/", wait_until="domcontentloaded") # 加热一次
页面.wait_for_timeout(2500)
对于 n 在 范围(1, 4): # 页面 1..3
url = f"https://www.ebay.com/sch/i.html?_nkw=laptop&_pgn={n}"
页面.goto(url, wait_until="domcontentloaded")
页面.wait_for_timeout(3000)
对于 卡片 在 页面查询选择器所有(".su-card-container"):
链接元素 = 卡片查询选择器("a")
如果链接元素 和链接元素.get_attribute("href"):
行.追加({"链接":链接元素.get_attribute("href")})
# 在相同的温暖会话中跟随列表到其物品页面
如果 行:
页面.goto(行[0]["链接"], wait_until="domcontentloaded")
h1 = 页面查询选择器("h1") # 物品页面标题(与 DOM 确认)
物品标题 = h1.inner_text()如果 h1 其他 None
浏览器关闭()
打印(len(行), "收集的列表")
首页的加热只发生一次,在会话的顶部;之后的每个搜索页面和物品页面都会重用已建立的上下文。一次会话温暖后,物品页面和浏览或交易页面直接呈现 — 更严厉的限制特定于搜索端点。对于列表到详细的抓取,首先从搜索网格收集列表网址,然后通过相同的浏览器抓取每个,从而在整个过程中保持住宅会话和指纹的一致性。
步骤5 — 生产加强
从一个有效的脚本转变为一个可靠的工作主要在于保持在平台的容限内。以下几个规则承担了大部分权重:
- 限制并发。 保持每个主机 ≤3 个云浏览器会话。超出这个值会引发速率限制和连接重置,而边际吞吐量很少值得额外的摩擦。
- 仅需热启动一次并重用会话。 在连接 URL 上设置
sessionTTL(例如 240 秒),第一次访问主页,然后通过同一 Playwright 连接运行每次搜索和条目导航。每页重新启动会浪费保持的上下文和连接握手。 - 固定
proxyCountry=US。 eBay 的列表、货币和可用性因地区而异;固定美国住宅出口使结果与您目标的地区保持一致。 - 将缺失字段视为可为空。 真实卡片在某些列表格式中省略价格、评级或运输条目。默认为
None而不是断言它们存在,以便一个稀疏记录不会破坏批处理。
您将获得的内容
json
[
{
"title": "Dell Latitude 7420 14\" 笔记本电脑 i7 16GB 512GB SSD Windows 11 Pro",
"price": "$329.99",
"link": "https://www.ebay.com/itm/1234567890"
},
{
"title": "Apple MacBook Air 13.3\" M1 8GB 256GB - 深空灰",
"price": "$489.00",
"link": "https://www.ebay.com/itm/9876543210"
},
{
"title": "Lenovo ThinkPad X1 Carbon Gen 9 i5 16GB 256GB",
"price": "$415.50",
"link": "https://www.ebay.com/itm/5556667778"
}
]
// 形状反映第3步提取;字段值为示例。
关于运行此管道的一些诚实观察:
- 冷搜索被拒绝;热搜索则不然。 直接导航到
/sch/i.html会转到 eBay 错误页面;首先在同一保留会话中访问主页会清除它,搜索返回Laptop for sale | eBay标题,并且结果网格已填充。 - 短暂的导航后等待用于补充。 结果卡片在第一次渲染后加载,因此在
goto后进行简短的wait_for_timeout会使它们可用于选择器。 .su-card-container是稳定的锚点。 eBay 旋转其卡片标记 — 较旧的li.s-item不会返回任何内容。在.su-card-container上锚定,并在任何重新设计后重新确认子字段选择器。- 固定
proxyCountry以获得一致结果。 列表、货币和可用性因地区而异;固定美国住宅出口使输出与您目标的地区保持一致。 - 条目和浏览页面直接加载。 更重的门槛位于搜索端点;一旦会话加热,条目、浏览和交易页面便可在无需访问主页的情况下加载。
结论:扩展您的 eBay 列表管道
该管道缩减为四个步骤。连接到一个 ScrapeLess Scraping Browser 会话,并在主页上对其加热。在那个同一保持的会话中导航到搜索端点,以便请求继承一个已建立的浏览上下文。通过在 .su-card-container 上锚定来提取结果网格。然后通过结果翻页并在一个加热的会话中跟随列表到详细页面。您只在实际需要它时为云浏览器付费 — 参见 Scrapeless 定价 了解免费套餐的内容 — 其余部分保持普通 Python。
从这里开始,同样的热会话模式即可融入更大的市场构建中。请参阅 最佳亚马逊抓取器汇总 以进行大型市场比较,以及 2026 年最佳 Zillow 抓取器 进行本地定价工具比较。在发布之前:导出 SCRAPELESS_API_KEY,固定 proxyCountry=US,在访问 /sch/ 之前先在主页上热启动会话,保持每个主机的并发 ≤3 个会话,锚定在 .su-card-container 上,并将缺失字段视为可为空。连接和库指南见 docs.scrapeless.com。
准备好构建您的 AI 驱动的数据管道了吗?
加入我们的社区以获取免费计划并与构建 eBay 和市场数据管道的开发人员联系: Discord · Telegram。
在 app.scrapeless.com 注册以获得免费的 Scraping Browser 运行时,并将上述模式适配到管道所需的 eBay 查询和地区中。
常见问题
您需要代理吗?
是的 — 住宅出口会产生 eBay 运行。通过在连接 URL 中固定 proxyCountry=US 来固定美国住宅代理。Scrapeless Scraping Browser 提供在 195 个以上国家的住宅代理,因此您无需自己获取和轮换 IP,出口地址看起来像普通的家庭连接,而不是被标记的数据中心 IP。
为什么搜索端点返回“访问被拒绝”?
自动导航到 https://www.ebay.com/sch/i.html 会出现 eBay 的错误页面,因为请求是在没有建立浏览上下文的情况下到达的——eBay 对搜索路径的限制比其商品和浏览页面更严格。解决方法是先热身会话:打开一个持有的云浏览器会话,加载 eBay 首页,以便 cookies 和导航状态稳定,然后在同一会话中导航到搜索 URL。此时搜索将加载带有 Laptop for sale | eBay 标题和已填充网格的页面。
在 eBay 重新设计后我的选择器停止匹配。你怎么解决?
eBay 会旋转其 DOM。将提取锚定在结果卡片包装器 .su-card-container 上,而不是深层子路径,并在重新设计后根据当前的标记重新确认标题、价格和链接选择器。较旧的 li.s-item 选择器在当前布局中匹配不到任何内容,这就是为何卡片包装器是稳定锚点的原因。
有哪些并发限制需要遵守?
每个主机保持在 ≤3 个云浏览器会话。超过这个数量,你将交换一些吞吐量以换取大量速率限制和连接重置。使用有限并发和队列,而不是一次性发送每个请求。
这个可以在没有 AI 代理的情况下运行吗?
可以。上面的 Python 模式是独立的端到端——Playwright 通过 CDP 连接到 Scrapeless Scraping Browser,你的代码热身会话、导航并提取。AI 代理是可选层,不是必需的。
在Scrapeless,我们仅访问公开可用的数据,并严格遵循适用的法律、法规和网站隐私政策。本博客中的内容仅供演示之用,不涉及任何非法或侵权活动。我们对使用本博客或第三方链接中的信息不做任何保证,并免除所有责任。在进行任何抓取活动之前,请咨询您的法律顾问,并审查目标网站的服务条款或获取必要的许可。



