【发布时间】:2016-09-20 17:52:39
【问题描述】:
我想使用 Scrappy 抓取大量网页。因为我必须使用代理,而且代理很糟糕,所以在更改 IP 上浪费了很多时间。如何使用多线程来加快速度?
(Ps:我使用一个HttpProxyMiddleware.py从redis数据库中获取proxyIP。
proxy_config = settings.get("PROXY_CONFIG")
self.r =redis.Redis(host=proxy_config.get('redis_host'),
port=proxy_config.get("redis_port", 6379))
self.ips_key = proxy_config.get('ip_key')
里面有很多ip。但其中一部分不起作用。我设置了 timeout = 5s ,所以很多更改 ips 的操作会浪费很多时间。
因为scrapy是使用twisted的,所以它的工作流是
spider.py(生成请求)-> HttpProxyMiddleware.py(向请求添加代理,检查响应以查看ip是否工作)-> spider.py(parse() 处理响应)
起初,我尝试使用多线程来加快速度。结果表明所有线程都依赖于同一个自定义中间件“HttpProxyMiddleware.py”。正如我所知,这只是一个类,它不是一个单例。我不知道如何实现它。所以我要创建多个 HttpProxyMiddleware ,作为 HttpProxyMiddleware1.py HttpProxyMiddleware2.py ......,并且我还创建了多个 spider.py 作为 spider1.py ,spider2.py...... 每个蜘蛛都对应使用一个 HttpProxyMiddleware .它工作。但看起来很糟糕。我向谷歌寻求帮助,我得到的答案是使用 reactor(Twisted),并且我使用了它:
from twisted.internet import reactor
reactor.suggestThreadPoolSize(30)
但它不起作用。也许我的用法是错误的。所以我的问题是如何使用反应器或多线程方法来加快速度?
HttpProxyMiddleware.py extends scrapy's downloadmiddleware
class HttpProxyMiddleware(object):{
def process_request(self, request, spider):
#add proxy to request
def process_response(self, request, response, spider):
#check response to decide to change ips or not
}
最后,我是一个新人,如果我的问题描述不清楚,请指出。我会立即纠正。谢谢,感谢您的每一次帮助。
【问题讨论】:
-
这太宽泛了。您在这里的确切问题是什么?当有许多答案在此范围内可以被认为是有效的时,您似乎要求一种通用的做事方式。
-
谢谢你的建议,我会改正的