分布式爬虫的基本框架非常简单:服务端→发送数据→客户端→处理数据→客户端→客户端保存数据。
分布式爬虫的优点是大大降低了主机的任务负担,将许多任务分配给各个客户端,让他们把结果返回给主机,然后主机对他们的提交上来的数据进行汇总就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!