python爬虫开发之一:分布式进程

    分布式进程指的是将Process进程分布到多台机器上,充分利用多台机器的性能完成复杂的任务。我们可以将这一点应用到分布式爬虫的开发中。

    比如:在做爬虫程序时,常常会遇到这样的场景,我们想抓取某个网站的所有图片,如果是引用多进程的话,一般是一个进程负责抓取图片的链接地址,将链接地址存放到Queue中,另外的进程负责从Queue中读取链接地址进行下载和存储到本地。现在我们用这个分布式进程来做的话,一台机器上的进程负责抓取链接,其他机器上的进程负责下载存储。python爬虫开发之一:分布式进程

一.服务进程,分为6个步骤:

# -*- coding:utf-8 -*-

import Queuefrom multiprocessing.managers import  BaseManager

from multiprocessing 

import freeze_support

import timeimport random

# 任务个数

task_number = 10

# 定义收发队列

#  第一步:建立task_queue和result_queue,用来存放任务和结果

task_queue = Queue.Queue(task_number)

result_queue = Queue.Queue(task_number

)# win下不支持lambda,所以定义方法,linux下可以直接用lambda(下面已给出)

def get_task():

    return task_queuedef 

get_result():

    return result_queue

# 创建类似的QueueManager

class QueueManager(BaseManager):

    pass

def win_run():

    # linux下可以直接用lambda

    #QueueManager.register('get_task_queue',callable=lambda:task_queue)

    #    第二步:创建2个队列注册在网络上

    QueueManager.register('get_task_queue',callable=get_task)

    QueueManager.register('get_result_queue',callable=get_result)

    #    第三步:绑定端口,设置验证口令

    manager = QueueManager(address=('127.0.0.1',8001),authkey = 'keke')

    #    第四步:启动管理,监听信息通道

    manager.start()

    #    第五步:通过管理实例的方法获得通过网络访问的Queue对象

    task = manager.get_task_queue()

    result = manager.get_result_queue()

    # 第六步:添加任务

    # 接受任务

    while 1:

        task.put(random.randint(100,999))

        time.sleep(4)

        print result.get()

    manager.shutdown()

if __name__ == '__main__':

    # win下调用freeze_support,linux可以不用

    freeze_support()

    win_run()

二.任务进程,分为4个步骤:   

# -*- coding:utf-8 -*-

import time

import random

from multiprocessing.managers import  BaseManager

class QueueManager(BaseManager):

    pass

#    第一步:使用QueueManager注册用于获取Queue的方法名称    

QueueManager.register('get_task_queue')

QueueManager.register('get_result_queue')

#    第二步:链接到服务器

m = QueueManager(address=('127.0.0.1',8001), authkey='keke')

m.connect()

#    第三步:获取Queue对象

task = m.get_task_queue()

result = m.get_result_queue()

#    第四步:从task队列中获取任务,并把结果返回到result队列中

while 1:

    time.sleep(2)

    print task.get(), 11111111

    result.put(random.randint(1,10))

效果图如下: 

python爬虫开发之一:分布式进程python爬虫开发之一:分布式进程




本内容参考:范伟辉编著的《Python爬虫开发与项目实战》

以上是 python爬虫开发之一:分布式进程 的全部内容, 来源链接: www.h5w3.com/116090.html

回到顶部