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
单一代理
-
在
settings.py
启用HttpProxyMiddleware
,如下所示:DOWNLOADER_MIDDLEWARES = { 'scrapy.contrib.downloadermiddleware.httpproxy.HttpProxyMiddleware': 1, }
-
通过
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"