分布式爬虫基本框架

分布式爬虫的基本框架非常简单:服务端→发送数据→客户端→处理数据→客户端→客户端保存数据。
分布式爬虫的优点是大大降低了主机的任务负担,将许多任务分配给各个客户端,让他们把结果返回给主机,然后主机对他们的提交上来的数据进行汇总就Ok了!使得爬虫效率大大提升!
废话不多说,贴代码!卤煮这里用的是python2.7
frist:服务端,也就是主机代码如下:

# -*- coding: utf-8 -*-
import multiprocessing.managers #分布式进程管理器
import Queue #队列

task_queue=Queue.Queue() #任务
result_queue=Queue.Queue() #结果

def  return_task(): #返回任务队列
    return task_queue
def return_result(): #返回结果队列
    return   result_queue

class  QueueManger(multiprocessing.managers.BaseManager):#继承,进程管理共享数据
    pass

if __name__ == '__main__':
    multiprocessing.freeze_support()#开启分布式支持
    QueueManger.register("get_task",callable=return_task)#注册函数给客户端调用
    QueueManger.register("get_result", callable=return_result)
    manger=QueueManger(address=("10.36.132.58",8848),authkey="123456") #创建一个管理器,设置地址与密码
    manger.start() #开启
    task,result=manger.get_task(),manger.get_result() #任务,结果
    url="https://baike.baidu.com/item/Python/407313"
    send=task.put(url)
    print u'发送数据:',url
    res = result.get(timeout=100)#获取客户端发来的结果
    print u'收到客户端发来的回复',res
    print '-------------------------------------------------------------------------'
    pass

second:下面是客户端代码:

# -*- coding: utf-8 -*-
import multiprocessing.managers #分布式进程管理器
import requests

class  QueueManger(multiprocessing.managers.BaseManager):#继承,进程管理共享数据
    pass
def getpage(url):
    user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)' #模拟浏览器
    headers = {'User-Agent': user_agent}
    response=requests.get(url,headers=headers)
    if response.status_code==200:
        response.encoding="utf-8" #设置编码
        return response.text
    else:
        return  None

if __name__ == '__main__':
    QueueManger.register("get_task")  # 注册函数调用服务器
    QueueManger.register("get_result")
    manger=QueueManger(address=("10.36.130.88",8008),authkey="123456")
    manger.connect()  #链接服务器
    task= manger.get_task()
    url=task.get()#取出服务端发来的数据
    print u'抓到数据',url
    result =manger.get_result()  # 任务,结果
    re=getpage(url)#结果赋值给re
    result.put(re)#将结果返回给服务端
    pass

上面的作用服务端将url地址传送给客户端,客户端定义一个方法获取网页的内容,然后再把内容传递给服务端!today is over!

你可能感兴趣的:(人工智能,网络爬虫,分布式架构)