Scrapy和代理

你如何利用python网页抓取框架Scrapy的代理支持?

从Scrapy常见问题 ,

Scrapy是否可以使用HTTP代理?

是。 通过HTTP代理下载中间件提供了对HTTP代理的支持(从Scrapy 0.8开始)。 请参阅HttpProxyMiddleware

使用代理最简单的方法是设置环境variableshttp_proxy 。 这个怎么做取决于你的shell。

 C:\>设置http_proxy = http:// proxy:port
 csh%setenv http_proxy http:// proxy:port
 sh $ export http_proxy = http:// proxy:port

如果你想使用https代理并访问https web,设置环境variableshttp_proxy你应该按照下面的方式,

 C:\>设置https_proxy = https:// proxy:port
 csh%setenv https_proxy https:// proxy:port
 sh $ export https_proxy = https:// proxy:port

单一代理

  1. settings.py启用HttpProxyMiddleware ,如下所示:

     DOWNLOADER_MIDDLEWARES = { 'scrapy.contrib.downloadermiddleware.httpproxy.HttpProxyMiddleware': 1, } 
  2. 通过request.meta传递代理请求:

     request = Request(url="http://example.com") request.meta['proxy'] = "host:port" yield request 

如果您有一个地址池,您也可以随机select一个代理地址。 喜欢这个:

多个代理

 class MySpider(BaseSpider): name = "my_spider" def __init__(self, *args, **kwargs): super(MySpider, self).__init__(*args, **kwargs) self.proxy_pool = ['proxy_address1', 'proxy_address2', ..., 'proxy_addressN'] def parse(self, response): ...parse code... if something: yield self.get_request(url) def get_request(self, url): req = Request(url=url) if self.proxy_pool: req.meta['proxy'] = random.choice(self.proxy_pool) return req 

1 – 创build一个名为“middlewares.py”的新文件,并将其保存在scrapy项目中,并向其中添加以下代码。

 import base64 class ProxyMiddleware(object): # overwrite process request def process_request(self, request, spider): # Set the location of the proxy request.meta['proxy'] = "http://YOUR_PROXY_IP:PORT" # Use the following lines if your proxy requires authentication proxy_user_pass = "USERNAME:PASSWORD" # setup basic authentication for the proxy encoded_user_pass = base64.encodestring(proxy_user_pass) request.headers['Proxy-Authorization'] = 'Basic ' + encoded_user_pass 

2 – 打开项目的configuration文件(./project_name/settings.py)并添加下面的代码

 DOWNLOADER_MIDDLEWARES = { 'scrapy.contrib.downloadermiddleware.httpproxy.HttpProxyMiddleware': 110, 'project_name.middlewares.ProxyMiddleware': 100, } 

现在,你的请求应该通过这个代理。 简单,不是吗?

那将是:

导出http_proxy = http://用户:密码@代理:端口

在Windows中,我放了几个以前的答案,它的工作。 我只是做了:

 C:> set http_proxy = http://username:password@proxy:port 

然后我启动了我的程序:

 C:/.../RightFolder> scrapy crawl dmoz 

其中“dmzo”是程序名(我正在写,因为它是在互联网上的教程中find的,如果你在这里,你可能已经从教程开始了)。

有人写的很好的中间件[1]: https : //github.com/aivarsk/scrapy-proxies “Scrapy代理中间件”

正如我在/ etc / environment中设置环境时遇到的问题一样,下面是我放在我的蜘蛛(Python)中的内容:

 os.environ["http_proxy"] = "http://localhost:12345"