我想使用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是使用扭曲的,它的工作流是首先,我尝试使用多线程来加快速度。结果表明,所有线程都依赖于同一个定制中间件“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)
最后,我是新手,如果我对问题的描述不清楚,请指出。我会马上纠正它。谢谢,我感谢您的一切帮助。
答案 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.
看看这个: