通过代理进行草率更改/更新公共IP

时间:2018-12-04 10:18:06

标签: python scrapy web-crawler google-crawlers

我正在使用Scrapy爬网Google,并且想从代码中更改IP。即使响应的meta中的代理已更改,我也会从输出获得与本地相同的公共IP。如果我转到该VM并从该站点获得响应,那么它将显示我正在request.meta['proxy'] = ip中使用的VM的IP,但是从代码中它仅显示本地公共IP

这是我的代码。

middleware.py

class ProxyMiddleware(object):
def process_request(self, request, spider):
    encoded_user_pass = base64.encodestring(('%s:%s' % (username, pass)).encode()).decode().replace('\n', '').strip()
    request.headers['Proxy-Authorization'] = 'Basic ' + encoded_user_pass
    request.meta['proxy'] = ip

settings.py

DOWNLOADER_MIDDLEWARES = {
    'tutorial.middlewares.RotateUserAgentMiddleware': 400,
    'tutorial.middlewares.ProxyMiddleware': 100,
    'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware': None,
    'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware': 110,
}

spider1.py

 request = scrapy.Request(url='http://checkip.dyndns.org/', callback=self.check_ip)

 def check_ip(self, response):
    print(response.meta)
    pub_ip = response.xpath('//body/text()').re('\d+\.\d+\.\d+\.\d+')[0]
    print("My public IP is: " + pub_ip)

输出:

{'proxy': 'http://51.162.81.60', 'download_timeout': 360.0, 'download_slot': 'checkip.dyndns.org', 'download_latency': 19.054762840270996}
My public IP is: 118.110.179.234

1 个答案:

答案 0 :(得分:0)

根据我的理解,代理ip必须是代理服务器的ip,因为代理服务器中的ip应该可以通过您提供的ip到达。您不能简单地将任何随机IP分配给任何请求。如果要轮换IP,那就完全不同了。

还以防万一提到方案(http,https)和端口。如果未提及scheme和port,则不确定scrapy是否会恢复为默认值。

另外,请参见documentation