溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

python分布式進(jìn)程爬蟲怎樣模擬

發(fā)布時(shí)間:2020-11-30 09:46:02 來(lái)源:億速云 閱讀:115 作者:小新 欄目:編程語(yǔ)言

小編給大家分享一下python分布式進(jìn)程爬蟲怎樣模擬,希望大家閱讀完這篇文章后大所收獲,下面讓我們一起去探討吧!

比如我們需要抓取某個(gè)圖片網(wǎng)站的所有圖片,如果用我們的分布式進(jìn)程的思想,我們會(huì)創(chuàng)建一個(gè)進(jìn)程負(fù)責(zé)抓取圖片的鏈接地址,然后將這些鏈接地址存放到Queue中,另外的進(jìn)程負(fù)責(zé)從Queue中讀取鏈接進(jìn)行圖片的下載或者進(jìn)行其他操作(存在本地)

其實(shí)我們的Queue是暴露在網(wǎng)絡(luò)中的,通過(guò)分布式就是將其進(jìn)行了封裝,其實(shí)也就是所謂的本地隊(duì)列的網(wǎng)絡(luò)化。

接下來(lái),我們來(lái)分析一下如何去創(chuàng)建一個(gè)分布式的服務(wù)進(jìn)程,總體可以分為六步:

1、首先我們需要建立一個(gè)隊(duì)列queue,這個(gè)主要用作進(jìn)程之間的通信??傮w來(lái)說(shuō)就是兩種進(jìn)程,一種是服務(wù)進(jìn)程,一種是任務(wù)進(jìn)程。服務(wù)進(jìn)程創(chuàng)建任務(wù)隊(duì)列task_queue,用作傳遞任務(wù)給任務(wù)進(jìn)程的通道。服務(wù)進(jìn)程又創(chuàng)建result_queue,作為任務(wù)進(jìn)程完成任務(wù)后回復(fù)服務(wù)進(jìn)程的通道。在分布式進(jìn)程的環(huán)境下,我們需要通過(guò)Queuemanager 獲得的Queue接口來(lái)添加任務(wù)。

2、把我們?cè)诘谝徊街嘘?duì)列在網(wǎng)絡(luò)上進(jìn)行注冊(cè),暴露給其他的進(jìn)程或者主機(jī),注冊(cè)后獲得網(wǎng)絡(luò)隊(duì)列,相當(dāng)于本地隊(duì)列的映像。

3、建立Queuemanager的對(duì)象,并且實(shí)例化,綁定端口和口令

4、啟動(dòng)第三步中建立的實(shí)例,即啟動(dòng)管理manager,監(jiān)管信息通道

5、通過(guò)管理實(shí)例的方法獲取到通過(guò)網(wǎng)絡(luò)訪問(wèn)的queue對(duì)象,也就是把網(wǎng)絡(luò)對(duì)象實(shí)體化成本地的一個(gè)隊(duì)列。

6、創(chuàng)建任務(wù)到“本地”隊(duì)列中,自動(dòng)上傳任務(wù)到網(wǎng)絡(luò)隊(duì)列中,分配給任務(wù)進(jìn)程進(jìn)行處理。

我們來(lái)寫一下服務(wù)進(jìn)程的代碼 taskManager.py:

import queue
from multiprocessing.managers import BaseManager
from multiprocessing import freeze_support
# 任務(wù)個(gè)數(shù)
task_num = 500
# 定義收發(fā)隊(duì)列
task_queue = queue.Queue(task_num)
result_queue = queue.Queue(task_num)
def get_task():
    return task_queue
def get_result():
    return result_queue
# 創(chuàng)建類似的QueueManager
class QueueManager(BaseManager):
    pass
def run():
    # Windows下綁定調(diào)用接口不能使用lambda,所以只能先定義函數(shù)再綁定
    QueueManager.register('get_task_queue', callable = get_task)
    QueueManager.register('get_result_queue', callable=get_result)
    #綁定端口并設(shè)置驗(yàn)證口令,windows下需要填寫ip地址,Linux中不填默認(rèn)為本地
    manager = QueueManager(address=('127.0.0.1', 8001), authkey='jap'.encode('utf-8'))
    # 啟動(dòng)
    manager.start()
    try:
        # 通過(guò)網(wǎng)絡(luò)獲取任務(wù)隊(duì)列和結(jié)果隊(duì)列
        task = manager.get_task_queue()
        result = manager.get_result_queue()
        # 添加任務(wù)
        for url in ["JAP君url:"+str(i) for i in range(500)]:
            print("添加任務(wù) %s" %url)
            task.put(url)
        print("正在獲取結(jié)果...")
        for i in range(500):
            print("result is %s" %result.get(timeout=10))
    except:
        print('Manager error')
    finally:
        # 一定要關(guān)閉,否則會(huì)報(bào)管道未關(guān)閉的錯(cuò)
        manager.shutdown()
if __name__ == '__main__':
    # windows下多進(jìn)程可能會(huì)出現(xiàn)問(wèn)題,添加這句話可以解決
    freeze_support()
    run()

看完了這篇文章,相信你對(duì)python分布式進(jìn)程爬蟲怎樣模擬有了一定的了解,想了解更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI