python分布式爬虫中spider_Worker节点指的是什么
创始人
2024-11-20 23:03:43
0次

在将多线程版本改写成分布式的爬虫,主要用的可跨平台的multiprocessing.managers的BaseManager模块,这个模块的主要功能就是将task_queue和result_queue两个队列注册成函数暴露到网上去,Master节点监听端口,让Worker子节点去连接,不同主机之间就可以通过注册的函数来共享同步资源,Master节点主要负责发送任务和获取结果,Worker就获取任务队列的任务开始跑,并将获取的结果存储到数据库获取返回回来。

spider_Worker 节点主要调用spider()函数对任务进行处理,方法都类似,子节点每获取一个链接就传回Master, 另外需要注意的是Master文件只能运行一个,但Worker节点可以同时运行多个并行同步处理task任务队列。

spider_Master.py

#coding:utf-8
 
from multiprocessing.managers import BaseManager
from Queue import Queue
import time
import argparse
import MySQLdb
import sys
 
page = 2
word = 'inurl:login.action'
output = 'test.txt'
 
page = (page+1) * 10
 
host = '127.0.0.1'
port = 500
urls = []
 
class Master():
def __init__(self):
        self.task_queue = Queue() #server需要先创建两个共享队列,worker端不需要
        self.result_queue = Queue()
 
def start(self):
        BaseManager.register('get_task_queue',callable=lambda:self.task_queue) #在网络上注册一个get_task_queue函数,即把两个队列暴露到网上,worker端不需要callable参数
        BaseManager.register('get_result_queue',callable=lambda:self.result_queue)
 
        manager = BaseManager(address=(host,port),authkey='sir')
        manager.start() #master端为start,即开始监听端口,worker端为connect
 
        task = manager.get_task_queue() #master和worker都是从网络上获取task队列和result队列,不能在创建的两个队列
        result = manager.get_result_queue()
 
 
print 'put task'
for i in range(0,page,10):
            target = 'https://www.baidu.com/s?wd=%s&pn=%s'%(word,i)
print 'put task %s'%target
            task.put(target)
 
print 'try get result'
while True:
try:
                url = result.get(True,5) #获取数据时需要超时长一些
print url
                urls.append(url)
except:
break
        manager.shutdown()
 
if __name__ == '__main__':
    start = time.time()
    server = Master()
    server.start()
print '共爬取数据%s条'%len(urls)
print time.time()-start
with open(output,'a') as f:
for url in urls:
            f.write(url[1]+'\n')
 
    conn = MySQLdb.connect('localhost','root','root','Struct',charset='utf8')
    cursor = conn.cursor()
for record in urls:
        sql = "insert into s045 values('%s','%s','%s')"%(record[0],record[1],str(record[2]))
        cursor.execute(sql)
    conn.commit()
conn.close()

spider_Worker

#coding:utf-8
 
 
import re
import Queue
import time
import requests
from multiprocessing.managers import BaseManager
from bs4 import BeautifulSoup as bs
 
 
host = '127.0.0.1'
port = 500
 
 
 
class Worder():
def __init__(self):
        self.headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0'}
 
def spider(self,target,result):
        urls = []
        pn = int(target.split('=')[-1])/10 +1
# print pn
# print target
        html = requests.get(target,headers=self.headers)
        soup = bs(html.text,"lxml")
        res = soup.find_all(name="a", attrs={'class':'c-showurl'})
for r in res:
try:
                h = requests.get(r['href'],headers=self.headers,timeout=3)
if h.status_code == 200:
                    url = h.url
# print url
                    time.sleep(1)
                    title = re.findall(r'(.*?)',h.content)[0]
# print url,title
                    title = title.decode('utf-8')
print 'send spider url:',url
                    result.put((pn,url,title))
else:
continue
except:
continue
 
# return urls
 
 
def start(self):
        BaseManager.register('get_task_queue')
        BaseManager.register('get_result_queue')
 
print 'Connect to server %s'%host
        m = BaseManager(address=(host,port),authkey='sir')
        m.connect()
 
        task = m.get_task_queue()
        result = m.get_result_queue()
 
print 'try get queue'
while True:
try:
                target = task.get(True,1)
print 'run pages %s'%target
                res = self.spider(target,result)
# print res
 
except:
break
 
 
 
 
if __name__ == '__main__':
    w = Worder()
w.start()

相关内容

热门资讯

空调连续工作多久需要停机休息 空调连续工作的时间取决于多个因素,包括空调的型号、功率、使用环境和维护情况等。一般来说,空调可以连续...
空调哪个符号是除湿的 空调除湿功能通常用一个水滴形状的符号表示。不同品牌和型号的空调遥控器可能会有所差异,但一般来说,除湿...
格力空调多长时间加一次氟利昂 1、一般情况下,空调对氟利昂的使用量是非常小的,所以在空调使用了四年左右的时候再考虑加也没问题。2、...
空调用多长时间需要加氟一次 一般情况下是五年。当出现以下这几种情况时,空调才需要加氟。1、空调的室内机和室外机各有两个接口,当接...
格调生活·C标思享荟:卡萨帝在... 9月12日的郑州龙湖金融岛,夜风轻拂,灯光璀璨。“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑...
品牌价值破千亿、高端份额持续领... 9月12日,“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑州站”在郑州龙湖金融岛举办。2026...
空调主板坏了修800还是换新的 空调主板坏了是修还是换新,需要考虑多个因素,以下是一些建议:1. 维修成本:如果维修费用较低,比如 ...
空调开多久需要休息多长时间 问题:空调开多久需要休息多长时间回答:1、在使用空调的过程中,一般空调开7~8个小时左右需要休息2~...
中央空调多长时间清洗一次 1、一般空调开机前清洗一次即可,空调开机中间时段再清洗一次,空调关机时清洗一次,这样比较合理。2、空...
中央空调氟利昂多久加一次 看空调制热和制冷程度,很多人的观点认为氟利昂必须一年放一次,其实这个观点是错误的,理解上面有点偏差,...