[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!')
View Code

 

3、daemon

Daemontool

  • 监测爬虫状态,开启自启,失败重启
  • svscan 每 5s 扫描 /service 目录所有子文件夹,运行其中 run 文件(爬虫脚本)
  • 应用:增加爬虫worker,通过复制 VM 镜像,或阿里云中新启动实例

 

posted @ 2023-01-31 21:42  cxc1357  阅读(35)  评论(0编辑  收藏  举报