一、模块分析
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"}'
二、流程分析
待编辑