[Python] 爬虫系统与数据处理实战 Part.8 日志系统
1、登录
登录方式
- 表单
- ajax
- xml(国内少用)
表单类型
- row
- from-data
- x-www-form-urlencoded
urllib2 插件
- ProxyHandler 代理
- build_opener,注册 handler
- CookieJar
python3
- 设置 redirect=False 禁止跳转,获取 cookie
- 带上 cookie 访问登陆后的页面
2、Log
Log 系统用途
- 多线程情况下,debug 调试困难
- 错误可能有随机性
- 性能分析
- 错误记录与分析
- 错误状态实时监测
Log 系统设计
- 错误级别:Debug,Info,Warning,Error,Fatal
- 日志来源:MySQL,Connection,Threading
- 日志输出位置:File,console,database
Python 日志系统(logging)
- loggers:创建日志并指明文件
- handlers:处理器,配置过滤器,输出
- filters:配置过滤规则
- formatters:配置输出的日志格式
dictlog.py
1 # -*- coding: utf-8 -*- 2 3 import logging 4 import logging.config 5 6 class SpiderFilter(logging.Filter): 7 8 def __init__(self, allow=None, disable=None): 9 self.allow_channels = allow 10 self.disable_channels = disable 11 12 def filter(self, record): 13 if self.allow_channels is not None: 14 if record.name in self.allow_channels: 15 allow = True 16 else: 17 allow = False 18 elif self.disable_channels is not None: 19 if record.name in self.disable_channels: 20 allow = False 21 else: 22 allow = True 23 else: 24 allow = False 25 return allow 26 27 28 LOGGING = { 29 'version': 1, 30 'disable_existing_loggers': True, 31 'formatters': { 32 'verbose': { 33 'format': '%(levelname)s %(asctime)s %(module)s %(process)d %(thread)d %(message)s' 34 }, 35 'simple': { 36 'format': '%(asctime)s -- %(name)s !!!%(levelname)s!!!: %(message)s' 37 }, 38 }, 39 'filters': { 40 'basic': { 41 '()': SpiderFilter, 42 'allow': ('mongo', 'redis', 'mysql'), 43 }, 44 'warn': { 45 '()': SpiderFilter, 46 'disable': () 47 } 48 }, 49 'handlers': { 50 'file': { 51 'level': 'WARN', 52 'formatter': 'simple', 53 'class': 'logging.FileHandler', 54 'filename': 'spider.log', 55 'mode': 'a', 56 'filters': ['warn'] 57 }, 58 'console': { 59 'level': 'DEBUG', 60 'class': 'logging.StreamHandler', 61 'formatter': 'simple' 62 }, 63 'database': { 64 'level': 'DEBUG', 65 'class': 'logging.FileHandler', 66 'formatter': 'simple', 67 'filename': 'spider.log', 68 'mode': 'a', 69 'filters': ['basic'] 70 } 71 }, 72 'loggers': { 73 'mongo': { 74 'handlers':['file'], 75 'propagate': True, 76 'level':'DEBUG', 77 }, 78 'mysql': { 79 # 使用database的handler 80 'handlers': ['database'], 81 # log 的级别为 DEBUG 82 'level': 'DEBUG', 83 # 是否要把log继续传递给更高级别(ancestor)的logger 84 'propagate': False, 85 }, 86 'redis': { 87 'handlers': ['file', 'database'], 88 'level': 'INFO', 89 'filters': ['basic'], 90 'propagate': False, 91 } 92 }, 93 'root': { 94 'level': 'DEBUG', 95 'handlers': ['console'] 96 } 97 } 98 99 if __name__ == '__main__': 100 logging.config.dictConfig(LOGGING) 101 logging.getLogger('redis').debug('Simple Log Test!')
3、daemon
Daemontool
- 监测爬虫状态,开启自启,失败重启
- svscan 每 5s 扫描 /service 目录所有子文件夹,运行其中 run 文件(爬虫脚本)
- 应用:增加爬虫worker,通过复制 VM 镜像,或阿里云中新启动实例