多平台爬虫框架模块与流程构思

一、模块分析

1、爬虫基础模块

1)初始化模块(start_callback)

初始化爬虫所需的栏目配置、请求所需参数、最大翻页数等信息,
此模块为运行爬虫的第一个方法,最为重要
示例代码:

    def start_callback(self):
         Menu = namedtuple('Menu', ['channel', 'code', 'types', 'crawl_page'])
         self.menus = [
             Menu('栏目名称', '爬虫唯一标识', "变量", "最大翻页数(int)"),
			 Menu('栏目名称', '爬虫唯一标识', "变量", "最大翻页数(int)"),
         ]

2)爬虫入口(start_requests)

读取start_callback后,根据所需参数,生成的爬虫配置后,生成request请求信息,发送给调度器,等待调度执行
示例代码:

    def start_requests(self):
         for menu in self.menus:
             for page in range(1,menu.crawl_page+1):
                 start_url = f'https://gas.in-en.com/zhaobiao/'
                 yield feapder.Request(url=start_url, item=menu._asdict(),proxies=False)

3)下载中间件模块(download_midware)

调度器分配给下载器的任务首先会经过下载器中间件处理,可实时生成请求所需的参数,如实时加密的参数,具有时效性的动态cookie,请求的验证码等等,验证码及cookie优先在此处添加,以免请求时效
示例代码:

    def download_midware(self, request):
        down_mid = request.down_mid
        key = down_mid.get("key")
        page_url = down_mid.get("page_url")
        cookie_pool = PageCookiePool(redis_key=key, page_url=page_url, selenium=False)
        request.cookies = cookie_pool.get_cookie()
        return request

4)爬虫模块(spider)

爬虫的执行模块,对请求结果的解析及处理

5)数据管道(Item Pipeline)

对结果数据进行清洗、分类、存储等功能

2、任务管理模块(生产)

1)自动审核模块

扫描代码,并实例化对象,检测代码的完整性,并判断部分参数是否符合逻辑,
具体判断条件如下:

 '''
 	1:不允许出现print方法,所有print方法均由log.info/log.debug/log.error代替,非必要数据请使用log.debug,防止无效数据写入到日志中
    2:列表页爬虫的类名请使用驼峰命名法(站点全拼或简拼等),定制快照页解析请设置唯一parser_name
    3:快照页爬虫每次取值不可太小或太大(太小可能导致爬虫处理数据过慢,太大可能会使爬虫运行时长超出预期)根据网站数据量设置,定制快照页数值必须设置在10-99之间
    4:各个模块完整性识别
    5:自动识别menus中crawl_page
    6:自动识别site
'''

示例代码:

sys.path.append(mod_path)
        if '.py' not in mod_name:
            continue
        t2 = __import__(mod_name.replace(".py", ""))
        result = inspect.getmembers(t2, inspect.isclass)
        for class_name in result:
            if hasattr(class_name[-1], 'start'):
                result2 = inspect.getsource(t2)  # 获取模块的全部代
                if "print(" in result2:
                    print("爬虫存在print字符,请使用log.info/log.debug/log.error代替print", mod_name)
                if hasattr(class_name[-1], 'start_callback'):
                    if 'Details' not in class_name[0]:
                        ss = class_name[-1]("ss") # 实例化对象
                        ss.start_callback()
                        for menu in ss.menus:
                        	if menu.crawl_page > 10:
                        		print('此爬虫可能为历史采集爬虫,请注意根据上线时间修')

2)自动测试模块

自动获取待测试的爬虫信息,执行爬虫,并分析结果,没问题后,自动部署

3)自动部署模块

代码提交到git之后,平台会自动同步代码,自动审核会定时执行,审核通过后,会将爬虫信息存入到数据库中,并打上待测试的标签,等代码自动测试完成后,将爬虫信息写入到配置表中,完成部署

4)任务生成

读取配置,想任务执行模块发起请求,执行对应的爬虫

3、任务执行模块 (消费)

1)主进程

nginx + gunicorn + flask 处理任务
nginx 处理任务,将任务转发至不同的服务器之间
gunicorn:

pre-fork worker model ,由一个master进程,来管理一组worker进程,master进程是不管处理请求的,只负责管理worker进程,比如对worker进程的创建、销毁、以及根据负载情况增减
flask 用接口的方式来处理爬虫

2)常规接口

请求传入爬虫文件的地址和名称,自动引入爬虫并进入爬虫所在的目录空间,实例化并执行爬虫

示例代码

@app.route('/exec/one', methods=['POST'])
def create_app():
    mod_path = request.form['mod_path']
    mod_name = request.form['mod_name']
    sys.path.append(mod_path)
    os.chdir(mod_path)

    t2 = __import__(mod_name.replace(".py", ""))
    result = inspect.getmembers(t2, inspect.isclass)
    for class_name in result:
        if hasattr(class_name[-1], 'start'):
            spider = class_name[-1](redis_key="python:details:" + mod_name[:-3], wait_lock=False)
            spider.start_callback()
            spider.start()
            spider.join()
            sys.path.remove(mod_path)
            print("执行结束", mod_name)
    return '{"code":200,"msg":"run_over"}'

3)历史采集接口

请求传入爬虫文件的地址、地址和部分配置信息,初始化配置并执行爬虫
示例代码

@app.route('/actuator/history', methods=['POST'])
def actuator_history():
    mod_path = request.form['mod_path']
    mod_name = request.form['mod_name']
    print(request.form['mod_info'])
    mod_info = eval(request.form['mod_info'])
    sys.path.append(mod_path)
    os.chdir(mod_path)

    t2 = __import__(mod_name.replace(".py", ""))
    result = inspect.getmembers(t2, inspect.isclass)
    for class_name in result:
        if hasattr(class_name[-1], 'start'):
            spider = class_name[-1](redis_key="python:details:" + mod_name[:-3], wait_lock=False)
            spider.start_callback()
            new_menus = []
            for menu in spider.menus:
                crawl_page = mod_info.get(menu.code) # 获取最大页数配置
                new_menu = menu._replace(crawl_page=crawl_page)# 修改爬虫的最大页数
                new_menus.append(new_menu)
            spider.menus = new_menus
            del class_name[-1].start_callback
            spider.start()
            spider.join()
            sys.path.remove(mod_path)
            print("执行结束", mod_name)
    return '{"code":200,"msg":"run_over"}'

二、流程分析

待编辑

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值