2016-09-19 124 views
0

我想使用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') 

有很多在它的IPS,但他們中的一部分不工作我設置超時時間= 5秒。應,從而改變IPS浪費大量時間的大量操作

因爲scrapy是使用雙絞線,其工作流是
spider.py(生成請求) - > HttpProxyMiddleware.py(添加代理請求,檢查響應看看如果ip正在工作) - > spider.py(parse()process response)

起初,我嘗試使用多線程來加快速度。結果表明所有線程都依賴於同一個定製中間件「HttpProxyMiddleware.py」。據我所知這只是一個類,它不是一個單身人士。我不知道如何實施它。所以我必須創建多個HttpProxyMiddleware,像HttpProxyMiddleware1.py HttpProxyMiddleware2.py ......,並且我還創建了mutilple spider.py作爲spider1.py,spider2.py ......每個蜘蛛使用一個HttpProxyMiddleware相應地。它的工作。但看起來很糟糕。我問谷歌的幫助,我得到的答案是,利用反應器(扭曲),我用它:

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

,但它不能正常工作。也許我的用法是錯誤的。所以我的問題是如何使用reactor或多線程方法來加速這一點?

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  
    } 

最後,我是這裏的新手,如果我對問題的描述不清楚,請指出。我會立即糾正它。謝謝,我感謝每一個幫助。

+3

這太寬泛了。這裏你確切的問題是什麼?在這個範圍內有很多答案可以被認爲是有效的時候,你似乎要求採取一種通常的做法。 –

+0

感謝您的建議,我會改正它 – user6847893

回答

0

使用很多代理。

例如對於類似的項目,我已經安裝了tor。

您可以運行tor的多個實例,從而有多個專用代理可用。

在127.0.0.1:9050上運行實例,在127.0.0.1:9051上運行另一個實例,依此類推。

腳本啓動所有這些實例,並腳本重新啓動(所以你得到一個不同的出口節點,因此另一個IP)。

現在,有你scrapy腳本走的是代理ADRESS作爲參數(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