def wait_feed_back(): """用于启动顺序中获取子节点的反馈""" que = config.task_que_fb while True: if redis_cli.exists(que): # 说明有反馈了,把该条数据拿出来 redis_cli.rpop(que) break time.sleep(0.1)
def init_mark_que(): """重置mark_que,并置mark为0""" que = config.mark_que while True: if redis_cli.exists(que): redis_cli.rpop(que) continue break # 重置 redis_cli.lpush(config.mark_que, 0)
def listn_the_psm_que(): """持续监听psm_que这个队列 只要一有数据过来,就做存储 """ # 先反馈 # 完成后像队里推送一条已完成启动 print('持久化队列启动') que = config.task_que_fb ctx = dumps_json({'psm': 'done'}) redis_cli.lpush(que, ctx) while True: if redis_cli.exists(psm_que): # 就开始处理 token_set = make_set(token, blank='', index='') msg = redis_cli.rpop(psm_que) seed = loads_json(translate_2_json_dict(msg)) print('{0}\t收到数据'.format( datetime.datetime.today().strftime('%Y-%m-%d %H:%M:%S'))) # 接下来就是做持久化处理了 do_persistence(seed, token_set) time.sleep(0.1)
def listen_task_que(): """启动后 开始监听 Task_Que 拿到任务,先弄清是是个啥 在转换自己的角色 正常的种子 {"url": "xxxx", ......} 任务: {"command": "xxxx"} session管理: ssnm seed管理: sedm persistence管理: psm # 09-07更新。需要为每一个节点打上一个标记 为了不放js文件混乱,才这样的。 """ task_que = config.task_que mark_que = config.mark_que # 在监听任务前,需要先监听mark_que # 具体就是,从mark队列里拿到数字标号 # 自增1作为自己的标号 # 同时将自己的标号放入mark队列里 # 先监听mark队列,拿到自己的编号 while True: if redis_cli.exists(mark_que): msg = redis_cli.rpop(mark_que) if not msg: continue mark = int(msg.decode()) + 1 break time.sleep(random.random()) # 放入队列里 redis_cli.lpush(mark_que, mark) print('当前slave编号\t{0}'.format(mark)) # 完成了后,才开始监听这个任务队列 while True: if redis_cli.exists(task_que): msg = redis_cli.rpop(task_que) # 开始分类msg属于什么任务: # if not msg: continue msg_dict = loads_json(msg.decode()) print('{0}\t收到数据'.format( datetime.datetime.today().strftime('%Y-%m-%d %H:%M:%S'))) # 开始分类: if msg_dict.get('command'): # 这里commend commend = msg_dict.get('command') if commend == 'ssnm': sm = SessionMangement() sm.session_main_logic() elif commend == 'sedm': sm = SeedsMangement() sm.seed_main_logic() else: # 化身持久化模块 listn_the_psm_que() else: # 那就是种子了 # 这里要做的事情有 # 1. 请求一个cookie # 2. 完成html的请求 # 3. data放入psm队列里 # 4. 反馈给seesion/seed模块 time.sleep(random.random() * 10) seed = msg_dict # 调度spider, 把mark放入实例化中 sp = SpiderHandler(mark) sp.receive_seed_and_start_crawl(seed) # 结束上一个,等下一个种子 del sp time.sleep(0.1)