对转卖商和电商分析师而言,eBay 有一样几乎没有别的市场平台会公开给你的东西:已售商品(sold listings)。大多数站点给你看的是要价。eBay 给你看的,是东西实际卖了多少钱、在哪一天、什么成色、来自哪个卖家。那不是一个价格信号,那是交易数据,也正因如此,eBay 对从球鞋到工业零件的一切,扮演着一个公开价格预言机的角色。
难的地方在于可靠地把它采下来。eBay 运营着价格与需求各不相同的多个地区站点、会防御自动化访问,并按访客个性化结果。从一个办公室 IP 去拉这些数据,你得到的是一个国家的视角,且满是缺口。这份指南讲清楚什么值得采、什么时候该改用官方 API,以及如何用住宅代理把其余部分精准地收集起来。
到底什么才值得采
一个 eBay 商品页信息密集,但分析师真正在意的是一个特定的子集:
商品层面
- 价格与形式 —— 价格,以及关键的:是拍卖还是一口价(Buy It Now)。把两者混在一起,会污染你算出的任何均值。
- 成色 —— 全新、二手、翻新、配件损坏。在 eBay 上,成色对价格离散度的驱动,几乎超过其他任何因素。
- 运费与所在地 —— 费用和物品所在地,它们会改变真正的到手价。
- 物品参数 —— 品牌、型号、尺码,以及那些让商品彼此可比的结构化属性。
已售 / 已结束商品(最有价值的部分)
- 成交价与售出日期 —— 买家实际付了多少,以及什么时候。
- 售罄率(sell-through) —— 某个物品的挂牌中,有多少真的卖出去了,对比多少是流拍过期。这就是把”值得进货”和”永远压在手里”分开的那个数字。
卖家层面
- 信誉分与好评率、店铺名,以及是否为商业卖家。
- 品类结构与定价行为 —— 一个竞争卖家挂了什么、什么价、动得多快。
第三类,正是把采集变成竞争情报的那部分:不只是一件商品卖多少钱,而是哪些卖家正在靠它赚钱。
在官方 API 够用的地方,就从它开始
这一点值得直说,因为它能替你省力气:eBay 有官方 API,在它能覆盖你需求的地方,它就是正确的第一站。它稳定、结构化、不会因为页面标记变动而崩,而且是被明确许可的。如果你要的是标准的商品数据,而你的量级和地区又落在它的条款和限额之内,那就用它。
代理登场的,是 API 服务不好的那些场景:超出其覆盖范围的公开数据、以分析师所需广度跨越各地区站点的覆盖,或是完全以一个本地买家的视角去看这个市场。诚实的说法是:它们是互补,而不是替代;在 API 够用的地方从 API 开始,只是更好的工程实践。
为什么其余部分是一个代理问题
eBay 的三个特性,让宽泛的公开采集成为一个访问问题。
eBay 按站点切分,且做地理个性化。 ebay.com、ebay.co.uk、ebay.de、ebay.com.au 是库存、价格、需求和售罄率都不同的站点。哪怕在同一个站点内,结果也会按访客位置个性化,运送选项和可得性都会变。对一个做跨境套利的转卖商来说,这就是分析本身:同一件东西在英国与在德国分别能卖多少。用一个美国 IP 去抓 ebay.de,两边的视角你都拿不准,所以你必须身处你正在度量的那个市场(国家与城市级定位)。
eBay 会防御自动化访问。 和任何大型市场平台一样,它跑着反机器人系统。数据中心 IP 会被标记、限流,或被投喂插页,于是你记录到的是机器人版本,而不是买家看到的页面(为什么爬虫会被封)。住宅 IP 带着真实用户的信任,看到的是真实的商品页。
覆盖既广又要反复。 跨多个站点做一次品类扫荡,还要每天刷新以保持售罄率是最新的,这是海量请求。从少数几个 IP 出发,你会触发速率限制,最后拿到一个片面的样本,而这在这里是致命的:一个从被封锁扭曲过的样本里算出来的售罄率,比没有这个数字还糟。
路由到正确的站点
在 Shifter gateway 上,你通过把国家编码进代理用户名来挑选它,一个端点,没有 IP 列表。让代理国家与站点域名相匹配:
# 作为美国买家访问 ebay.comcurl -x customer-USERNAME-country-us:PASSWORD@p.shifter.io:443 \ "https://www.ebay.com/itm/123456789012"
# 作为英国买家访问 ebay.co.ukcurl -x customer-USERNAME-country-gb:PASSWORD@p.shifter.io:443 \ "https://www.ebay.co.uk/itm/123456789012"注意英国的国家代码是 gb,不是 uk,这个小细节一旦弄错,就会悄无声息地产出错误市场的数据。
用代码采集
eBay 的大部分商品数据都在初始 HTML 里,所以一个简单的 HTTP 客户端,比驱动一个浏览器更快、也便宜得多(完整的客户端配置见用 Python 使用住宅代理):
import os, requestsfrom bs4 import BeautifulSoup
USER, PASS = os.environ["SHIFTER_USER"], os.environ["SHIFTER_PASS"]
def proxy(country="us"): url = f"http://{USER}-country-{country}:{PASS}@p.shifter.io:443" return {"http": url, "https": url}
MARKETS = {"us": "ebay.com", "gb": "ebay.co.uk", "de": "ebay.de"}
def fetch_listing(item_id, country="us"): domain = MARKETS[country] url = f"https://www.{domain}/itm/{item_id}" headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36", "Accept-Language": "en-GB,en;q=0.9" if country == "gb" else "en-US,en;q=0.9", "Accept-Encoding": "gzip, br", } r = requests.get(url, headers=headers, proxies=proxy(country), timeout=30) r.raise_for_status() soup = BeautifulSoup(r.text, "html.parser") return { "item_id": item_id, "market": country, "title": (t := soup.select_one("h1")) and t.get_text(strip=True), "price": (p := soup.select_one(".x-price-primary")) and p.get_text(strip=True), # 成色、运费和物品参数各自在自己的区块里; # 把每个选择器都当作可选的,并对你提取到的东西做校验。 }两点实务提醒。把 Accept-Language 设成与你所定位的站点相匹配,一个英国 IP 却发 en-US,是一个你完全不需要的不一致。以及,把每个选择器都当作可选:eBay 的页面标记会随品类和商品类型而变,所以要做防御性解析并校验,而不是假定某个字段一定存在。
做宽泛的品类扫荡时按请求轮换;当你翻阅单个卖家的库存时,保持一个粘性会话,好让这一串序列看起来像一个买家。因为 IP 质量决定了你有多频繁地看到真实页面,IP 信誉值得理解;而持续(而非偶尔)的封锁,指向的是质量或行为(如何避免被封)。
把商品数据变成分析
采集只是输入;分析才是转卖商真正赚钱的地方。在给这些数据建模时,有几件事很要紧:
把已售与在售分开。 在售商品是要价,那是愿望。已售商品是交易。永远不要把它们平均在一起,也永远不要在没说清是哪一种的情况下报一个”eBay 价格”。
按成色和形式分段。 一件二手品的成交价和一件全新品的,是不同的市场。拍卖成交和一口价成交,行为也不一样。跨这些分段去平均,产出的是一个什么都没描述的数字。
算售罄率,而不只是价格。 在一个时间窗内,已售除以总挂牌数,告诉你流动性。一个高价配 10% 的售罄率,是比一个能稳定出清的较低价更差的进货目标。
有意识地跨站点比较。 跨境价差是转卖商的优势所在,但前提是每个市场的数字,确实是从那个市场采来的,而这正是上面那套地理路由要紧的原因。
要把产出结构化成一个可供研究使用的数据集,如何用网络抓取构建数据集讲了机制;同样的功课也支撑着价格监测与数字货架分析。
负责任地使用
只采集公开的商品数据,任何买家都能看到的标题、价格、成色、运费,以及公开的卖家指标。个人数据属于禁区:买家身份、私信,以及挂在账号上的个人细节都不是可取之物;而评价留言应当谨慎处理,因为它们可能包含个人信息。
除此之外:遵守 eBay 的条款和速率限制、不要削弱站点,并在官方 API 能覆盖你用例的地方优先用它。eBay 的条款限制自动化访问,所以把采集守在公开数据上、保持合理的节奏,并对任何不确定的事项获取法律意见(网络抓取合法吗)。代理改变的是一个请求从哪个 IP 发出,而不是你是否应该发出它;我们的可接受使用政策是 Shifter 上何为允许的权威依据。
常见问题
我为什么需要代理来获取 eBay 数据? 因为 eBay 运营着价格与需求各异的多个地区站点、按位置个性化结果,并防御自动化访问。从一个 IP 出发,你看到的是一个市场,而且是片面的。住宅代理让你以真实本地买家的身份去采集每一个站点。
我该改用 eBay 的 API 吗? 在它能覆盖你需求的地方,该用,它稳定、结构化、且被许可。代理用于其覆盖范围之外的公开数据,或用于跨地区站点的广度。从 API 开始,其余用采集补上。
我能采集已售和已结束的商品吗? 已售商品是公开展示的,而且是对转卖商最有价值的输入,因为它们是成交价而非要价。把它们当作公开数据来采集,在分析中把已售与在售分开,并遵守 eBay 的条款和速率限制。
为什么英国要用国家代码 gb?
因为 gateway 用的是 ISO 国家代码,其中英国是 gb。用 uk 会悄无声息地定位失败,也就意味着你会在错误的市场里去抓 ebay.co.uk,还意识不到。
eBay 该用住宅代理还是数据中心代理? 住宅。市场平台会检测并区别对待数据中心 IP,所以你会被限流或被投喂一个降级页面。住宅 IP 看到的是一个真实买家会看到的、真实且地理精准的商品页。
底线
eBay 公开的已售数据之所以格外有价值,是因为它是交易性的、而非愿望性的,它是转卖商做进货、定价和售罄率分析的骨架。麻烦在于,它被切分在各地区站点之间、按位置个性化、且受防护,所以你分析的准确度,完全取决于你是否以那个市场里真实买家的身份去采集每一个市场。在官方 API 合适的地方用它,其余的经由与站点相匹配的住宅 IP 路由,做防御性解析,并在模型里把已售与在售分开。
做到这些,你拿到的就是可以据以进货和定价的数字,而不是一个什么都没描述的混合均值。一个优质的住宅代理网络,就是让这份采集保持地理精准且完整的关键;定价页面有按 GB 计费的套餐,可以拿它对着你真正在做的品类和站点试用。