本文解决问题
因为代理ip的API每次请求的ip都不一样,所以说,我们在scrapy直接使用代理时,会出现每次都要请求代理IP的API,这样的话,会大大降低爬虫的效率。 本文的代码思路是: 请求到有效的代理ip后,接下来爬取的url都会使用该代理Ip,而不再请求代理IP的API,直到代理ip不可用时,再请求代理IP的API。
代码实现
1. 配置文件settings.py
添加一个变量:USE_PROXY,用来记录当前有效的代理ip。 代码如下:
USE_PROXY = None
2. 中间件层middlewares.py
这一层添加中间件获取代理类,用来实现使用代理ip以及异常后换代理ip。 代码如下:
import settings
class ProxyMiddleware(object):
def process_request(self, request, spider):
if settings.USE_PROXY is not None:
request.meta['proxy'] = settings.USE_PROXY
def process_exception(self, request, exception, spider):
res = requests.get('http://xx.xx.xx.xx:xxxx/api')
ip = res.text
settings.USE_PROXY = "http://" + ip
return request
3. 在settings.py中添加代理中间件
找到DOWNLOADER_MIDDLEWARES ,添加代理中间件。
DOWNLOADER_MIDDLEWARES = {
'项目名.middlewares.ProxyMiddleware': 543,
}
4. 结束
这样就实现了一个持久化的代理,可以实现高效率的爬虫。
|