抓取大量网页

时间:2016-09-19 08:36:07

标签: python scrapy

我想使用Scrappy抓取大量网页。因为我必须使用代理,并且代理很糟糕,所以浪费了很多时间来改变IP。如何使用多线程来加速这一过程?

(Ps:我使用HttpProxyMiddleware.py从redis数据库获取proxyIP。

class YourComponent extends Component {
  state = {
    prices: 0,
  };

  componentDidMount() {
    const url = 'https://api.coinbase.com/v2/prices/BTC-USD/spot';
    axios.get(url)
      .then((response) => {
        let prices = response.data.data.amount;
        this.setState({ prices });
      });
  }

  render() {
    const { prices } = this.state;

    return(
      <div>
        <h3> {prices} </h3>
      </div>
    );
  }
}

里面有很多ips。但其中一部分不起作用。我设置超时= 5s,因此更改ips的大量操作会浪费大量时间。

因为scrapy是使用扭曲的,它的工作流是
spider.py(生成请求) - &gt; HttpProxyMiddleware.py(添加代理请求,检查响应以查看ip是否正常工作) - &gt; spider.py(parse()进程响应)

首先,我尝试使用多线程来加快速度。结果表明,所有线程都依赖于同一个定制中间件“HttpProxyMiddleware.py”。因为我知道这只是一个类,它不是一个单身人士。我不是如何实施它的scrapy。所以我必须创建多个HttpProxyMiddleware,如HttpProxyMiddleware1.py HttpProxyMiddleware2.py ......,我还创建了多个spider.py作为spider1.py,spider2.py ......每个蜘蛛相应地使用一个HttpProxyMiddleware 。它的工作原理。但看起来很糟糕。我问google的帮助,我得到的答案是使用reactor(Twisted),我用它:

    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')

但它不起作用。也许我的用法是错误的。所以我的问题是如何使用reactor或多线程方法来加速这一过程?

    from twisted.internet import reactor
    reactor.suggestThreadPoolSize(30)

最后,我是新手,如果我对问题的描述不清楚,请指出。我会马上纠正它。谢谢,我感谢您的一切帮助。

1 个答案:

答案 0 :(得分:0)

使用大量代理。

例如,对于类似的项目,我已安装了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