python爬虫开发之一:分布式进程
分布式进程指的是将Process进程分布到多台机器上,充分利用多台机器的性能完成复杂的任务。我们可以将这一点应用到分布式爬虫的开发中。
比如:在做爬虫程序时,常常会遇到这样的场景,我们想抓取某个网站的所有图片,如果是引用多进程的话,一般是一个进程负责抓取图片的链接地址,将链接地址存放到Queue中,另外的进程负责从Queue中读取链接地址进行下载和存储到本地。现在我们用这个分布式进程来做的话,一台机器上的进程负责抓取链接,其他机器上的进程负责下载存储。
一.服务进程,分为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爬虫开发之一:分布式进程 的全部内容, 来源链接: utcz.com/a/116090.html