【问题标题】:Crawl a large number of web pages抓取大量网页
【发布时间】: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    
   }

最后,我是一个新人,如果我的问题描述不清楚,请指出。我会立即纠正。谢谢,感谢您的每一次帮助。

【问题讨论】:

  • 这太宽泛了。您在这里的确切问题是什么?当有许多答案在此范围内可以被认为是有效的时,您似乎要求一种通用的做事方式。
  • 谢谢你的建议,我会改正的

标签: python scrapy


【解决方案1】:

使用大量代理。

例如对于一个类似的项目,我已经安装了 tor。

您可以运行多个 tor 实例,从而有多个可用的专用代理。

在 127.0.0.1:9050 上运行一个实例,在 127.0.0.1:9051 上运行另一个实例,以此类推。

为所有这些实例的启动编写脚本,并为它们的重启编写脚本(这样您将获得一个不同的出口节点,从而获得另一个 IP)。

现在,让您的 scrapy 脚本将代理地址作为参数 (argv)

并有一个控制器脚本像这样运行所有内容:

# pseudo code
while 1:
    tor_restart.sh # restart all tor nodes
    for i between 0 and n:
        python scrapy_script.py 9050+i &
    while there is a scrapy_script.py in the process list, sleep.

看看这个:

https://tor.stackexchange.com/questions/327/how-may-i-run-multiple-tor-relay-instances-in-a-single-linux-machine

【讨论】:

    猜你喜欢
    • 2020-11-17
    • 2020-06-18
    • 1970-01-01
    • 2018-10-01
    • 2017-07-04
    • 1970-01-01
    • 2010-10-25
    • 2017-11-06
    相关资源
    最近更新 更多