Python Scrapy如何使用代理池
我正在使用Scrapy,并试图通过创建一个定制的下载程序来使用代理池。我遇到了一些问题,希望在这里得到一些帮助(我查看了Scrapy网站上的文档,但没有代码示例) 我的python代码是:Python Scrapy如何使用代理池,python,web-scraping,scrapy,web-crawler,Python,Web Scraping,Scrapy,Web Crawler,我正在使用Scrapy,并试图通过创建一个定制的下载程序来使用代理池。我遇到了一些问题,希望在这里得到一些帮助(我查看了Scrapy网站上的文档,但没有代码示例) 我的python代码是: import random class ProxyRotator(object): proxy_pool = ['ip1...', 'ip2...', 'ip3...'] def process_request(self, request, spider): request
import random
class ProxyRotator(object):
proxy_pool = ['ip1...', 'ip2...', 'ip3...']
def process_request(self, request, spider):
request.meta['proxy'] = "http://" + self.proxy_pool[random.randint(0, len(self.proxy_pool) - 1)] + ":80"
return request
在settings.py中,我添加了
DOWNLOADER_MIDDLEWARES = {
'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware': 110,
'pricecheck_crawler.ProxyMiddleware.ProxyRotator': 100,
}
目前,爬虫程序无法从该站点获取任何信息。
日志显示:
2016-02-17 11:27:50[抓取]信息:抓取0页(以0页/分钟的速度),抓取0项(以0项/分钟的速度)
2016-02-17 11:27:50[scrapy]调试:Telnet控制台监听127.0.0.1:6051
2016-02-17 11:28:50[抓取]信息:抓取0页(以0页/分钟的速度),抓取0项(以0项/分钟的速度)
2016-02-17 11:29:50[抓取]信息:抓取0页(以0页/分钟的速度),抓取0项(以0项/分钟的速度)试试这个。删除
returnrequest
语句,因为它会将请求返回到process\u请求,并且永远不会调用process\u响应。在此之前,请确保仅使用http或https代理:
def process_request(self, request, spider):
request.meta['proxy'] = self.proxy_pool[random.randint(0, len(self.proxy_pool) - 1)]
您还可以将设置更改为以下内容:
'pricecheck_crawler.ProxyMiddleware.ProxyRotator': 100,
'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware': 110
还要验证request.meta['proxy']=”http://ip:port“
另一个方向可能是使用外部程序,例如proxifier
,以便通过代理来隧道带宽。您可以使用Scrapy\u proxy\u pool。”
只需在settings.py中添加到当前代码
PROXY_POOL_ENABLED = True
你得到的错误是什么?没有错误,但是爬虫程序没有从站点得到任何东西。例如,在日志中:2016-02-17 11:27:50[scrapy]信息:抓取0页(0页/分钟)、抓取0项(0项/分钟)2016-02-17 11:27:50[scrapy]调试:Telnet控制台监听127.0.0.1:6051 2016-02-17 11:28:50[scrapy]信息:抓取0页(0页/分钟)、抓取0项(0项/分钟)2016-02-17 11:29:50[scrapy]信息:爬网0页(0页/分钟),刮取0项(0项/分钟)您使用的代理是http
还是socks
?Scrapy不支持袜子。另外,请不要改变原来的问题。我仍然得到相同的结果。代理是http。您是否更改了设置?还要检查self.proxy\u pool[random.randint(0,len(self.proxy\u pool)-1)]
的输出是否类似于http://ip:port
所以代理池只是我传入的ip地址列表,我确保最终的输出看起来像http://ip:port。我更改了设置,同样的事情。我需要设置http_代理吗?代理应该有一个与之关联的端口。正如我在回答中提到的那样,改变它。