您好,登錄后才能下訂單哦!
小編給大家分享一下python分布式進程爬蟲怎樣模擬,希望大家閱讀完這篇文章后大所收獲,下面讓我們一起去探討吧!
比如我們需要抓取某個圖片網站的所有圖片,如果用我們的分布式進程的思想,我們會創建一個進程負責抓取圖片的鏈接地址,然后將這些鏈接地址存放到Queue中,另外的進程負責從Queue中讀取鏈接進行圖片的下載或者進行其他操作(存在本地)
其實我們的Queue是暴露在網絡中的,通過分布式就是將其進行了封裝,其實也就是所謂的本地隊列的網絡化。
接下來,我們來分析一下如何去創建一個分布式的服務進程,總體可以分為六步:
1、首先我們需要建立一個隊列queue,這個主要用作進程之間的通信。總體來說就是兩種進程,一種是服務進程,一種是任務進程。服務進程創建任務隊列task_queue,用作傳遞任務給任務進程的通道。服務進程又創建result_queue,作為任務進程完成任務后回復服務進程的通道。在分布式進程的環境下,我們需要通過Queuemanager 獲得的Queue接口來添加任務。
2、把我們在第一步中隊列在網絡上進行注冊,暴露給其他的進程或者主機,注冊后獲得網絡隊列,相當于本地隊列的映像。
3、建立Queuemanager的對象,并且實例化,綁定端口和口令
4、啟動第三步中建立的實例,即啟動管理manager,監管信息通道
5、通過管理實例的方法獲取到通過網絡訪問的queue對象,也就是把網絡對象實體化成本地的一個隊列。
6、創建任務到“本地”隊列中,自動上傳任務到網絡隊列中,分配給任務進程進行處理。
我們來寫一下服務進程的代碼 taskManager.py:
import queue from multiprocessing.managers import BaseManager from multiprocessing import freeze_support # 任務個數 task_num = 500 # 定義收發隊列 task_queue = queue.Queue(task_num) result_queue = queue.Queue(task_num) def get_task(): return task_queue def get_result(): return result_queue # 創建類似的QueueManager class QueueManager(BaseManager): pass def run(): # Windows下綁定調用接口不能使用lambda,所以只能先定義函數再綁定 QueueManager.register('get_task_queue', callable = get_task) QueueManager.register('get_result_queue', callable=get_result) #綁定端口并設置驗證口令,windows下需要填寫ip地址,Linux中不填默認為本地 manager = QueueManager(address=('127.0.0.1', 8001), authkey='jap'.encode('utf-8')) # 啟動 manager.start() try: # 通過網絡獲取任務隊列和結果隊列 task = manager.get_task_queue() result = manager.get_result_queue() # 添加任務 for url in ["JAP君url:"+str(i) for i in range(500)]: print("添加任務 %s" %url) task.put(url) print("正在獲取結果...") for i in range(500): print("result is %s" %result.get(timeout=10)) except: print('Manager error') finally: # 一定要關閉,否則會報管道未關閉的錯 manager.shutdown() if __name__ == '__main__': # windows下多進程可能會出現問題,添加這句話可以解決 freeze_support() run()
看完了這篇文章,相信你對python分布式進程爬蟲怎樣模擬有了一定的了解,想了解更多相關知識,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。