setting.py 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204
  1. # -*- coding: utf-8 -*-
  2. """爬虫配置文件"""
  3. import os
  4. # 列表任务表模版
  5. TAB_REQUESTS = "{redis_key}:z_requests"
  6. # 详情待处理任务表模版
  7. TAB_ITEMS = "{redis_key}:z_items"
  8. # 任务失败表
  9. TAB_FAILED_REQUESTS = os.getenv("TAB_FAILED_REQUESTS", "spider:z_failed_requests")
  10. # 数据保存失败表
  11. TAB_FAILED_ITEMS = os.getenv("TAB_FAILED_ITEMS", "spider:s_failed_items")
  12. # 采集任务生产表
  13. TASK_REQUEST_PRODUCE = os.getenv("TASK_REQUEST_PRODUCE", "spider_listdata")
  14. # 失败任务记录表
  15. TASK_REQUEST_FAILED = os.getenv("TASK_REQUEST_FAILED", "spider_listdata_err")
  16. # MYSQL
  17. MYSQL_IP = os.getenv("MYSQL_IP")
  18. MYSQL_PORT = int(os.getenv("MYSQL_PORT", 3306))
  19. MYSQL_DB = os.getenv("MYSQL_DB")
  20. MYSQL_USER_NAME = os.getenv("MYSQL_USER_NAME")
  21. MYSQL_USER_PASS = os.getenv("MYSQL_USER_PASS")
  22. # MONGODB
  23. MONGO_IP = os.getenv("MONGO_IP", "localhost")
  24. MONGO_PORT = int(os.getenv("MONGO_PORT", 27017))
  25. MONGO_DB = os.getenv("MONGO_DB")
  26. MONGO_USER_NAME = os.getenv("MONGO_USER_NAME")
  27. MONGO_USER_PASS = os.getenv("MONGO_USER_PASS")
  28. # REDIS
  29. # ip:port 多个可写为列表或者逗号隔开 如 ip1:port1,ip2:port2 或 ["ip1:port1", "ip2:port2"]
  30. REDISDB_IP_PORTS = os.getenv("REDISDB_IP_PORTS")
  31. REDISDB_USER_PASS = os.getenv("REDISDB_USER_PASS")
  32. REDISDB_DB = int(os.getenv("REDISDB_DB", 0))
  33. # 适用于redis哨兵模式
  34. REDISDB_SERVICE_NAME = os.getenv("REDISDB_SERVICE_NAME")
  35. # rabbitMq
  36. RABBITMQ_IP_PORT = os.getenv("RABBITMQ_IP_PORT")
  37. RABBITMQ_USER = os.getenv("RABBITMQ_USER")
  38. RABBITMQ_USER_PASS = os.getenv("RABBITMQ_USER_PASS")
  39. RABBITMQ_VIRTUAL_HOST = os.getenv("RABBITMQ_VIRTUAL_HOST", "/")
  40. RABBITMQ_HEARTBEAT = int(os.getenv("RABBITMQ_HEARTBEAT", 1200))
  41. RABBITMQ_SOCKET_TIMEOUT = int(os.getenv("RABBITMQ_SOCKET_TIMEOUT", 10))
  42. RABBITMQ_EXCHANGE = os.getenv("RABBITMQ_EXCHANGE", "spider")
  43. RABBITMQ_EXCHANGE_TYPE = os.getenv("RABBITMQ_EXCHANGE_TYPE", "direct")
  44. # 数据入库的pipeline,可自定义,默认MongoPipeline
  45. ITEM_PIPELINES = [
  46. # "feapder.pipelines.mysql_pipeline.MysqlPipeline",
  47. "feapder.pipelines.mongo_pipeline.MongoPipeline",
  48. ]
  49. EXPORT_DATA_MAX_FAILED_TIMES = 10 # 导出数据时最大的失败次数,包括保存和更新,超过这个次数报警
  50. EXPORT_DATA_MAX_RETRY_TIMES = 10 # 导出数据时最大的重试次数,包括保存和更新,超过这个次数则放弃重试
  51. # 爬虫相关
  52. # COLLECTOR
  53. COLLECTOR_SLEEP_TIME = 1 # 从任务队列中获取任务到内存队列的间隔
  54. COLLECTOR_TASK_COUNT = 10 # 每次获取任务数量
  55. # SPIDER
  56. SPIDER_THREAD_COUNT = 1 # 爬虫并发数
  57. SPIDER_SLEEP_TIME = (
  58. 0
  59. ) # 下载时间间隔 单位秒。 支持随机 如 SPIDER_SLEEP_TIME = [2, 5] 则间隔为 2~5秒之间的随机数,包含2和5
  60. SPIDER_TASK_COUNT = 1 # 每个parser从内存队列中获取任务的数量
  61. SPIDER_MAX_RETRY_TIMES = 100 # 每个请求最大重试次数
  62. SPIDER_AUTO_START_REQUESTS = (
  63. True
  64. ) # 是否主动执行添加 设置为False 需要手动调用start_monitor_task,适用于多进程情况下
  65. KEEP_ALIVE = False # 爬虫是否常驻
  66. # 浏览器渲染
  67. WEBDRIVER = dict(
  68. pool_size=1, # 浏览器的数量
  69. load_images=True, # 是否加载图片
  70. user_agent=None, # 字符串 或 无参函数,返回值为user_agent
  71. proxy=None, # xxx.xxx.xxx.xxx:xxxx 或 无参函数,返回值为代理地址
  72. headless=False, # 是否为无头浏览器
  73. driver_type="CHROME", # CHROME、PHANTOMJS、FIREFOX
  74. timeout=30, # 请求超时时间
  75. window_size=(1024, 800), # 窗口大小
  76. executable_path=None, # 浏览器路径,默认为默认路径
  77. render_time=0, # 渲染时长,即打开网页等待指定时间后再获取源码
  78. custom_argument=["--ignore-certificate-errors"], # 自定义浏览器渲染参数
  79. )
  80. # splash 渲染
  81. SPLASH_API = os.getenv("SPLASH_API")
  82. # 验证码
  83. CAPTCHA_URL = os.getenv("CAPTCHA_URL", "http://pycaptcha.spdata.jianyu360.com")
  84. # 爬虫启动时,重新抓取失败的requests
  85. RETRY_FAILED_REQUESTS = False
  86. # 爬虫启动时,重新入库失败的item
  87. RETRY_FAILED_ITEMS = False
  88. # 保存失败的request
  89. SAVE_FAILED_REQUEST = False
  90. # request防丢机制。(指定的REQUEST_LOST_TIMEOUT时间内request还没做完,会重新下发 重做)
  91. REQUEST_LOST_TIMEOUT = 600 # 10分钟
  92. # request网络请求超时时间
  93. REQUEST_TIMEOUT = 22 # 等待服务器响应的超时时间,浮点数,或(connect timeout, read timeout)元组
  94. # 下载缓存 利用redis缓存,但由于内存大小限制,所以建议仅供开发调试代码时使用,防止每次debug都需要网络请求
  95. RESPONSE_CACHED_ENABLE = False # 是否启用下载缓存 成本高的数据或容易变需求的数据,建议设置为True
  96. RESPONSE_CACHED_EXPIRE_TIME = 3600 # 缓存时间 秒
  97. RESPONSE_CACHED_USED = False # 是否使用缓存 补采数据时可设置为True
  98. # redis 存放item与request的根目录
  99. REDIS_KEY = ""
  100. # 爬虫启动时删除的key,类型: 元组/bool/string。 支持正则; 常用于清空任务队列,否则重启时会断点续爬
  101. DELETE_KEYS = []
  102. # 设置代理
  103. PROXY_EXTRACT_API = None # 代理提取API ,返回的代理分割符为\r\n
  104. PROXY_ENABLE = True
  105. # 剑鱼代理
  106. JY_PROXY_URL = None
  107. JY_PROXY_AUTHOR = os.getenv("JY_PROXY_AUTHOR")
  108. # 随机headers
  109. RANDOM_HEADERS = True
  110. # UserAgent类型 支持 'chrome', 'opera', 'firefox', 'internetexplorer', 'safari','mobile' 若不指定则随机类型
  111. USER_AGENT_TYPE = "chrome"
  112. # 默认使用的浏览器头 RANDOM_HEADERS=True时不生效
  113. DEFAULT_USERAGENT = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36"
  114. # requests 使用session
  115. USE_SESSION = False
  116. USE_JA3_SESSION = False
  117. # 遇见 ja3 反爬网站,修改 requests模块用的传输密码
  118. JA3_REQUEST_CIPHERS = ["DH+AES", "RSA+AES"]
  119. # 去重
  120. ITEM_FILTER_ENABLE = False # item 去重
  121. ITEM_FILTER_SETTING = dict(
  122. filter_type=1 # 永久去重(BloomFilter)= 1; 内存去重(MemoryFilter)= 2; 临时去重(ExpireFilter)= 3; 轻量去重(LiteFilter)= 4;
  123. )
  124. REQUEST_FILTER_ENABLE = False # request 去重
  125. REQUEST_FILTER_SETTING = dict(
  126. filter_type=3, # 永久去重(BloomFilter)= 1; 内存去重(MemoryFilter)= 2; 临时去重(ExpireFilter)= 3; 轻量去重(LiteFilter)= 4;
  127. expire_time=2592000, # 过期时间1个月
  128. )
  129. TASK_FILTER_ENABLE = False # task 去重
  130. TASK_FILTER_SETTING = dict(
  131. filter_type=3, # 永久去重(BloomFilter)= 1; 内存去重(MemoryFilter)= 2; 临时去重(ExpireFilter)= 3; 轻量去重(LiteFilter)= 4;
  132. expire_time=2592000, # 过期时间1个月
  133. )
  134. # 报警 支持钉钉、企业微信、邮件
  135. # 钉钉报警
  136. DINGDING_WARNING_URL = "" # 钉钉机器人api
  137. DINGDING_WARNING_PHONE = "" # 报警人 支持列表,可指定多个
  138. DINGDING_WARNING_ALL = False # 是否提示所有人, 默认为False
  139. # 邮件报警
  140. EMAIL_SENDER = "" # 发件人
  141. EMAIL_PASSWORD = "" # 授权码
  142. EMAIL_RECEIVER = "" # 收件人 支持列表,可指定多个
  143. EMAIL_SMTPSERVER = "smtp.163.com" # 邮件服务器 默认为163邮箱
  144. # 企业微信报警
  145. WECHAT_WARNING_URL = "" # 企业微信机器人api
  146. WECHAT_WARNING_PHONE = "" # 报警人 将会在群内@此人, 支持列表,可指定多人
  147. WECHAT_WARNING_ALL = False # 是否提示所有人, 默认为False
  148. # 时间间隔
  149. WARNING_INTERVAL = 3600 # 相同报警的报警时间间隔,防止刷屏; 0表示不去重
  150. WARNING_LEVEL = "DEBUG" # 报警级别, DEBUG / ERROR
  151. WARNING_FAILED_COUNT = 1000 # 任务失败数 超过WARNING_FAILED_COUNT则报警
  152. LOG_NAME = os.path.basename(os.getcwd())
  153. LOG_PATH = "log/%s.log" % LOG_NAME # log存储路径
  154. LOG_LEVEL = "DEBUG"
  155. LOG_COLOR = True # 是否带有颜色
  156. LOG_IS_WRITE_TO_CONSOLE = True # 是否打印到控制台
  157. LOG_IS_WRITE_TO_FILE = False # 是否写文件
  158. LOG_MODE = "w" # 写文件的模式
  159. LOG_MAX_BYTES = 10 * 1024 * 1024 # 每个日志文件的最大字节数
  160. LOG_BACKUP_COUNT = 20 # 日志文件保留数量
  161. LOG_ENCODING = "utf8" # 日志文件编码
  162. OTHERS_LOG_LEVAL = "ERROR" # 第三方库的log等级
  163. LOG_IS_SEND_TO_LOGSTASH = False # 是否开启elk服务
  164. LOG_STASH_IP = os.getenv("STASH_IP", "localhost") # elk服务地址
  165. LOG_STASH_PORT = os.getenv("STASH_IP", 5959) # elk服务端口
  166. # 打点监控 influxdb 配置
  167. INFLUXDB_HOST = os.getenv("INFLUXDB_HOST", "localhost")
  168. INFLUXDB_PORT = int(os.getenv("INFLUXDB_PORT", 8086))
  169. INFLUXDB_UDP_PORT = int(os.getenv("INFLUXDB_UDP_PORT", 8089))
  170. INFLUXDB_USER = os.getenv("INFLUXDB_USER")
  171. INFLUXDB_PASSWORD = os.getenv("INFLUXDB_PASSWORD")
  172. INFLUXDB_DATABASE = os.getenv("INFLUXDB_DB")
  173. # 监控数据存储的表名,爬虫管理系统上会以task_id命名
  174. INFLUXDB_MEASUREMENT = "task_" + os.getenv("TASK_ID") if os.getenv("TASK_ID") else None
  175. # 打点监控其他参数,若这里也配置了influxdb的参数, 则会覆盖外面的配置
  176. METRICS_OTHER_ARGS = dict(retention_policy_duration="180d", emit_interval=60)
  177. ############# 导入用户自定义的setting #############
  178. try:
  179. from setting import *
  180. # 兼容老版本的配置
  181. KEEP_ALIVE = not AUTO_STOP_WHEN_SPIDER_DONE
  182. except:
  183. pass