住宅代理是我们销售的产品,所以我们写一篇关于何时不需要住宅代理的文章似乎有些奇怪。但那些每项任务都购买代理的团队会支出过多,而那些把每次失败都归咎于代理的团队则会浪费数周时间。了解哪些网站需要住宅IP,哪些完全不需要,哪些需要别的东西,是网络数据采集中最便宜的优化手段。
为了把这个问题说清楚,我们做了一个小测试。2026年10月9日,我们从一台带有数据中心IP地址的云服务器请求了30个公开页面,每个页面请求三次,然后又通过使用美国出口的Shifter住宅代理重复了一遍。两次运行都使用了相同的简单Python HTTP客户端。30个页面中有16个在每次请求中都能从数据中心IP正常获取。有3个只能通过住宅出口获取。其余11个两种方式都失败了,原因并非住宅IP所能解决的。
我们的测试:30个页面,数据中心IP与住宅代理对比
测试目标涵盖六类网站:公开API和开放数据、参考资料和文档网站、新闻主页、电商搜索页、旅游搜索页,以及一组社交、招聘和搜索页面。每次请求都使用相同的桌面浏览器User-Agent,并检查是否获取到真实内容,而不仅仅是状态码:只有当响应中包含仅出现在实际内容中的标记(例如搜索结果卡片)时,才算成功。因此,返回状态码200的拦截页面(这种情况很常见)会被计为失败。
我们在最终运行之前通过检查两种网络保存下来的响应来选定这些标记,并剔除了5个候选页面,因为我们无法分辨出真实内容与登录墙或空的JavaScript外壳。
| 类别 | 网站 | 数据中心IP | 住宅出口 | 结论 |
|---|---|---|---|---|
| 公开API和开放数据 | en.wikipedia.org | 3 of 3 | 3 of 3 | 无需代理 |
| 公开API和开放数据 | api.github.com | 3 of 3 | 3 of 3 | 无需代理 |
| 公开API和开放数据 | data.sec.gov | 3 of 3 | 3 of 3 | 无需代理 |
| 公开API和开放数据 | api.worldbank.org | 3 of 3 | 3 of 3 | 无需代理 |
| 公开API和开放数据 | ecb.europa.eu | 3 of 3 | 3 of 3 | 无需代理 |
| 参考资料和文档 | docs.python.org | 3 of 3 | 3 of 3 | 无需代理 |
| 参考资料和文档 | developer.mozilla.org | 3 of 3 | 3 of 3 | 无需代理 |
| 参考资料和文档 | rfc-editor.org | 3 of 3 | 3 of 3 | 无需代理 |
| 参考资料和文档 | en.wikipedia.org | 3 of 3 | 3 of 3 | 无需代理 |
| 参考资料和文档 | arxiv.org | 3 of 3 | 3 of 3 | 无需代理 |
| 参考资料和文档 | stackoverflow.com | 0 of 3 | 0 of 3 | 两种方式均被拦截 |
| 新闻 | bbc.com | 3 of 3 | 3 of 3 | 无需代理 |
| 新闻 | reuters.com | 0 of 3 | 0 of 3 | 两种方式均被拦截 |
| 新闻 | nytimes.com | 0 of 3 | 0 of 3 | 两种方式均被拦截 |
| 新闻 | theguardian.com | 3 of 3 | 3 of 3 | 无需代理 |
| 新闻 | edition.cnn.com | 3 of 3 | 3 of 3 | 无需代理 |
| 新闻 | bloomberg.com | 0 of 3 | 0 of 3 | 两种方式均被拦截 |
| 电商搜索 | amazon.com | 3 of 3 | 2 of 3 | 无需代理 |
| 电商搜索 | walmart.com | 0 of 3 | 3 of 3 | 需要住宅IP |
| 电商搜索 | ebay.com | 0 of 3 | 0 of 3 | 两种方式均被拦截 |
| 电商搜索 | bestbuy.com | 0 of 3 | 0 of 3 | 两种方式均超时 |
| 电商搜索 | etsy.com | 0 of 3 | 0 of 3 | 两种方式均被拦截 |
| 旅游 | booking.com | 0 of 3 | 2 of 3 | 需要住宅IP |
| 旅游 | expedia.com | 0 of 3 | 0 of 3 | 两种方式均被拦截 |
| 旅游 | airbnb.com | 3 of 3 | 2 of 3 | 无需代理 |
| 旅游 | tripadvisor.com | 0 of 3 | 0 of 3 | 两种方式均被拦截 |
| 旅游 | kayak.com | 0 of 3 | 3 of 3 | 需要住宅IP |
| 社交、招聘和搜索 | linkedin.com | 3 of 3 | 3 of 3 | 无需代理 |
| 社交、招聘和搜索 | indeed.com | 0 of 3 | 0 of 3 | 两种方式均被拦截 |
| 社交、招聘和搜索 | google.com | 0 of 3 | 0 of 3 | 需要浏览器 |
“两种方式均被拦截”指的是一个普通的HTTP客户端在两种网络上都被拦截。一个真正的浏览器或能处理浏览器检查的爬虫API很可能在这些网站上成功;本次测试没有尝试这些方式。
按类别汇总,结果如下:
| 类别 | 页面数 | 无需代理 | 需要住宅IP | 两种方式均失败 |
|---|---|---|---|---|
| 公开API和开放数据 | 5 | 5 | 0 | 0 |
| 参考资料和文档 | 6 | 5 | 0 | 1 |
| 新闻 | 6 | 3 | 0 | 3 |
| 电商搜索 | 5 | 1 | 1 | 3 |
| 旅游 | 5 | 1 | 2 | 2 |
| 社交、招聘和搜索 | 3 | 1 | 0 | 2 |
| 总计 | 30 | 16 | 3 | 11 |
这30个页面的测试说明了什么
公开API、开放数据和文档不需要代理。 除了一个网站之外,我们尝试的每个API和参考页面都在每次尝试中从数据中心IP正常获取了内容。这些服务本就是为程序调用而设计的。它们想要的是描述性的User-Agent、合理的请求频率,对某些服务而言还需要API密钥。代理只会增加成本,没有任何其他作用。
许多大型网站根本不会拦截数据中心IP。 六个新闻主页中有三个、亚马逊搜索、Airbnb搜索以及一个LinkedIn公司页面,三次尝试都从云服务器获取到了真实内容。对于这类网站的低量级采集,从不使用代理开始是合理的,只要遵守网站的服务条款和速率限制。
亚马逊和Airbnb在数据中心IP下三次尝试全部成功,而在住宅出口下三次中有两次成功。每个站点只进行了三次尝试,一次失败属于正常波动范围,并不能证明住宅IP在这些网站上表现更差。每次住宅请求都来自不同的家庭连接,单个出口可能较慢,或者最近刚被同一网站识别过,而固定的云服务器则不会有这种情况。教训是在下结论之前要多次测试,下面的检查方法可以很方便地做到这一点。
有些网站根据IP信誉进行拦截,这正是住宅出口发挥作用的地方。 Walmart、Kayak和Booking.com每次都拒绝数据中心IP,但通过住宅出口提供了内容。这些网站会对请求来源的网络进行打分,而云服务器的地址得分很低。这正是住宅代理存在的理由。
有些网站拦截的是客户端,而不是IP。 eBay、Etsy、Expedia、Tripadvisor、Indeed、Stack Overflow以及三个新闻网站,两种网络下都拦截了普通的Python客户端。它们在判断请求来源之前,会先检查客户端的连接方式和行为,比如TLS指纹、HTTP头以及是否运行JavaScript。住宅IP无法修复一个自曝为脚本的客户端。我们关于TLS和HTTP/2指纹识别的指南解释了这些检查的工作原理。
有些页面无论网络如何都需要浏览器。 Google搜索在两种网络下都返回了一个要求运行JavaScript的页面,HTML中没有任何结果。对于这类页面,选择在于无头浏览器和直接返回数据的API之间。
如何判断一个网站需要什么
你可以在购买任何东西之前,花一个下午的时间把大多数目标网站分到这些类别中。下面的函数就是我们在测试中使用的检查方法:它会抓取一个页面,并判断你得到的是真实内容、拦截、错误,还是空壳。
import re
import requests
BLOCK = re.compile(r"captcha|access denied|are you a robot|just a moment|unusual traffic|"
r"verify you are human|request blocked|pardon our interruption|enable javascript and cookies",
re.IGNORECASE)
HEADERS = {
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 "
"(KHTML, like Gecko) Chrome/141.0.0.0 Safari/537.36",
"Accept-Language": "en-US,en;q=0.9",
}
def check(url, marker, proxies=None):
"""Did this request get the real content, or a block, an error or an empty shell?"""
try:
response = requests.get(url, headers=HEADERS, proxies=proxies, timeout=30)
except requests.RequestException as error:
return {"url": url, "result": "error", "detail": type(error).__name__}
body = response.text
if response.status_code != 200:
result = "blocked" if response.status_code in (202, 401, 403, 429, 503) else "error"
elif BLOCK.search(body[:20000]) and marker.lower() not in body.lower():
result = "blocked"
elif marker.lower() not in body.lower():
result = "no content"
else:
result = "ok"
return {"url": url, "result": result, "status": response.status_code, "bytes": len(response.content)}
选择一个只出现在你想要的内容中的标记,例如结果卡片的类名,或JSON响应中的某个字段名。不要使用页面标题中的词:拦截页面和登录墙通常也会重复出现标题。然后对每个目标的几个页面运行它:
from check import check
print(check("https://api.github.com/repos/python/cpython", '"full_name"'))
print(check("https://www.ebay.com/sch/i.html?_nkw=laptop", "srp-results"))
{'url': 'https://api.github.com/repos/python/cpython', 'result': 'ok', 'status': 200, 'bytes': 6617}
{'url': 'https://www.ebay.com/sch/i.html?_nkw=laptop', 'result': 'blocked', 'status': 403, 'bytes': 1832}
在你的爬虫实际将要运行的地方(如果生产环境是云服务器,那就在云服务器上运行,而不是在你的笔记本电脑上),在一天之内多次运行它。结果可以映射为一个决策:
| 从云服务器看到的情况 | 通常意味着什么 | 应该使用什么 |
|---|---|---|
| 持续获取到真实内容 | 该网站在你的量级下不拦截数据中心流量 | 无需代理,或使用数据中心IP以扩大规模 |
| 被拦截或遇到验证,而家庭连接能获取到真实内容 | 该网站按IP信誉进行拦截 | 住宅代理 |
| 两种网络都被拦截 | 该网站在检查客户端 | 真正的浏览器或爬虫API,底层通常配合住宅IP |
| 空壳页面,没有数据 | 内容由JavaScript渲染 | 无头浏览器,或页面调用的API |
| 登录墙 | 内容不是公开的 | 未经许可不要采集 |
两点补充说明:
- 量级会改变结果。 一个忽略来自云服务器十次请求的网站,可能会拦截一万次请求。请按你计划运行的速率重新测试,而不仅仅测试一次。
- 地理位置会改变结果。 网站会根据国家提供不同的内容并应用不同的规则。如果你需要的是从德国看到的数据,就从德国进行测试。
何时特定位置的数据需要住宅代理
我们的测试只问了一个问题:网站是否会提供内容?但第二个问题往往更重要:它提供的内容,是否是某个特定地点的真实用户所看到的内容?
云服务器位于少数几个数据中心位置,许多网站能识别出数据中心地址,并向其展示默认版本:全球主页、以美元计价、没有本地库存,或者完全没有广告。如果你的工作依赖于特定国家或城市的用户所看到的内容,就需要在那个地方使用一个出口,并接入那里用户实际使用的网络。这涵盖了:
- 本地搜索结果和排名,这些会因城市而异。
- 价格、库存和配送选项,零售商和旅游网站会按市场设定这些内容。
- 广告和落地页,广告主会按地点进行定向投放,而这些内容往往不会展示给数据中心流量。检查它们是广告验证的核心内容。
- 按国家许可或限制的内容。
在这些情况下,网站可能从不拦截数据中心IP,但如果没有正确位置的住宅出口,你仍然会采集到错误的数据。
中间选项
选择并不只是“不使用代理”和“住宅代理”之间的二选一。
- 数据中心IP价格低廉、速度快,对于不拦截它们的网站来说完全够用。我们关于ISP代理和数据中心代理的对比文章介绍了何时它们已经足够。
- ISP代理是注册到消费者互联网服务商名下的地址,为你保留较长的一段时间。它们适合长会话以及登录你自己的账户。Shifter的ISP代理在整个计费周期内都保持在你选择的城市和ISP(ASN)上,并附带无限流量,因此也适合在可接受此类流量的网站上进行大量、持续的工作负载。
- 爬虫API会为你处理浏览器、重试和IP选择,并按成功页面而非按GB流量计费。对于会检查客户端的网站来说,这通常是最便宜的选择,因为你不必自己构建和维护浏览器层。参见我们关于抓取JavaScript繁重网站的指南。
- 住宅代理是当网站根据请求来源的网络进行判断时的正确工具:当同一个客户端从家庭连接能成功,而从云服务器却失败时。
常见问题
网络爬取需要代理吗?
不一定。在我们的测试中,30个公开页面中有16个,包括每一个公开API和大多数文档网站,在没有代理的情况下从云服务器获取到了真实内容。先从你的爬虫实际将要运行的地方测试你的目标网站。
什么时候需要住宅代理?
当一个网站拦截来自数据中心IP的请求,但对来自家庭连接的同一客户端却正常提供服务时。在我们的测试中,30个网站中有3个(Walmart、Kayak和Booking.com)表现出这种行为。
为什么使用住宅代理我仍然被拦截?
通常是因为网站在检查客户端,而不是IP。许多网站会拦截那些TLS指纹、HTTP头或缺少JavaScript执行能力暴露出其为脚本的HTTP客户端。我们测试中的30个页面里有11个,无论用哪种网络,用普通Python客户端都会失败。解决办法是使用真正的浏览器或爬虫API,而不是换一个IP。
数据中心代理足以用于爬取吗?
对于公开API、文档、许多新闻网站以及一些大型零售商来说,在适中的量级下是足够的。对于按IP信誉打分的网站来说则不够。应该对每个目标进行测试,而不是想当然。
数据中心IP和住宅IP有什么区别?
数据中心IP属于托管或云服务提供商。住宅IP属于消费者互联网服务提供商,由真实的家庭连接使用。许多网站更信任住宅地址,因为普通访客使用的就是这类地址。
我该如何测试一个网站是否拦截数据中心IP?
从云服务器请求几个页面,并检查响应中是否包含只出现在真实内容中的标记,而不仅仅是状态码。然后通过住宅出口重复这个过程。如果云服务器被拒绝而住宅出口能正常获取内容,那么该网站是按IP信誉进行拦截的。
特定位置的数据是否需要住宅代理?
通常需要。即使是那些从不拦截云服务器的网站,也经常会向其展示默认版本的页面。要看到某个国家或城市的用户所看到的本地搜索结果、价格或广告,你需要一个位于那个地方的出口。
为什么在你们的测试中,亚马逊和Airbnb通过住宅代理的成功率反而更低?
它们在三次住宅请求中各失败了一次,而三次尝试本身就存在正常的波动范围。每次住宅请求都来自不同的家庭连接,单个出口可能较慢,或者最近刚被该网站识别过。在下结论之前应该多次测试。
结论
住宅代理解决的是一个具体问题:网站根据请求来源的网络来判断请求。它对那些检查客户端的网站无济于事,对于公开API和不拦截云端流量的网站来说也是不必要的。从你的爬虫实际将要运行的地方测试每个目标,将其归入上述某一类别,只在能改变结果的地方为住宅流量付费。我们的网络爬取最佳实践涵盖了负责任采集的其余内容。