Esempio n. 1
0
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)
Esempio n. 2
0
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)
Esempio n. 4
0
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)