Scrapy与代理
你怎么在使用Python的网页抓取框架Scrapy时,利用代理支持呢?
9 个回答
33
1- 创建一个新的文件,命名为“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 - 打开你项目的配置文件(./project_name/settings.py),然后添加以下代码。
DOWNLOADER_MIDDLEWARES = {
'scrapy.contrib.downloadermiddleware.httpproxy.HttpProxyMiddleware': 110,
'project_name.middlewares.ProxyMiddleware': 100,
}
现在,你的请求应该会通过这个代理发送。简单吧?
55
单个代理
在你的
settings.py
文件中启用HttpProxyMiddleware
,像这样:DOWNLOADER_MIDDLEWARES = { 'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware': 1 }
通过
request.meta
将代理传递给请求:request = Request(url="http://example.com") request.meta['proxy'] = "host:port" yield request
如果你有多个代理地址,可以随机选择一个地址,像这样:
多个代理
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
54
来自 Scrapy 常见问题解答,
Scrapy 支持 HTTP 代理吗?
支持的。自 Scrapy 0.8 版本起,通过 HTTP 代理下载中间件提供了对 HTTP 代理的支持。具体可以查看
HttpProxyMiddleware
。
使用代理的最简单方法是设置一个环境变量 http_proxy
。具体怎么设置取决于你使用的命令行工具。
C:\>set http_proxy=http://proxy:port csh% setenv http_proxy http://proxy:port sh$ export http_proxy=http://proxy:port
如果你想使用 HTTPS 代理并访问 HTTPS 网站,设置环境变量 http_proxy
的方法如下:
C:\>set https_proxy=https://proxy:port csh% setenv https_proxy https://proxy:port sh$ export https_proxy=https://proxy:port