Web Scraping w/ Scrapy-Splash——不同代理的不同结果?

Web Scraping w/ Scrapy-Splash -- different results for different proxies?

我有一个代理地址列表,我从中随机选择并输入 Scrapy 蜘蛛中的 SplashRequest。为了确认这是否有效,我决定尝试从 What Is My IP? 中抓取结果。由于代理是随机选择的,我注意到基于 IP 的三种不同响应:

  1. 502 错误网关
  2. 200 OK body 表示 "Sorry, whatismyip.com is not available because it is categorized as security.nettools."
  3. 200 OK 正确的代理地址被 returned

如果有人能向我解释#1 和#2 中发生了什么,将不胜感激!

编辑

我在 Docker 容器中有一个 Splash 实例,我正在创建一个 SplashReqeuest(不是 scrapy 请求)并为其提供一个随机选择的代理 IP。对于某些 IP,我能够确认它正在传递给请求(请参阅第 3 项),因此这似乎验证了这种方法——随机代理 IP is 被馈送通过到 SplashRequest。但是,对于某些 IP,我得到一个 502 Bad Gateway 或那个奇怪的 200 Ok,其中 "What Is My IP" 不是 return IP。

给定 IP 地址的结果是一致的,即如果地址 X 给出结果 1,它总是给出结果 1。

我只用过几次 scrapy-splash,但严重依赖 scrapy。我的猜测是您正在使用来自 scrapinghub 的 splash 实例。我认为这是因为实际用于发出请求的 ip。

我举的一个例子是试图抓取 google 购物。 Google ip溯源。所以不管我的 ip 池位于美国。一些 ips 可以追溯到其他国家并返回该县的结果。 假设我们有以下代码。

def start_request:
  yield scrapy.Request(url='https://www.googleshopping.com/shopping/ID','splash':{})

这将触发 scrapy 创建请求。即使请求是在您的设备上发出的,它也会将该请求发送到启动服务器。它可以存在于 docker 或抓取中心上的启动实例中,无论它在哪里。 splash 实例将有自己的 ip 地址附加到它,并且 ip 是 Google 将看到的。现在,如果您在该请求中包含代理,则该 ip 可以来自世界上任何地方,具体取决于托管它的人,这会使 ip 更加混淆。长话短说,请求可能不是来自您认为它来自的 IP。