123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278 |
- # -*- coding: utf-8 -*-
- """爬虫配置文件"""
- import os
- # 用户根目录,输出类似:C:\Users\用户名 或 /home/用户名
- _USER_ROOT_DIR = os.path.expanduser("~")
- # 列表任务表模版
- TAB_REQUESTS = "{redis_key}:z_requests"
- # 详情待处理任务表模版
- TAB_ITEMS = "{redis_key}:z_items"
- # 任务失败表
- TAB_FAILED_REQUESTS = os.getenv("TAB_FAILED_REQUESTS", "spider:z_failed_requests")
- # 数据保存失败表
- TAB_FAILED_ITEMS = os.getenv("TAB_FAILED_ITEMS", "spider:s_failed_items")
- # 采集任务生产表
- TASK_REQUEST_PRODUCE = os.getenv("TASK_REQUEST_PRODUCE", "spider_listdata")
- # 失败任务记录表
- TASK_REQUEST_FAILED = os.getenv("TASK_REQUEST_FAILED", "spider_listdata_err")
- # MYSQL
- MYSQL_IP = os.getenv("MYSQL_IP")
- MYSQL_PORT = int(os.getenv("MYSQL_PORT", 3306))
- MYSQL_DB = os.getenv("MYSQL_DB")
- MYSQL_USER_NAME = os.getenv("MYSQL_USER_NAME")
- MYSQL_USER_PASS = os.getenv("MYSQL_USER_PASS")
- # MONGODB
- MONGO_IP = os.getenv("MONGO_IP", "localhost")
- MONGO_PORT = int(os.getenv("MONGO_PORT", 27017))
- MONGO_DB = os.getenv("MONGO_DB")
- MONGO_USER_NAME = os.getenv("MONGO_USER_NAME")
- MONGO_USER_PASS = os.getenv("MONGO_USER_PASS")
- # REDIS
- # ip:port 多个可写为列表或者逗号隔开 如 ip1:port1,ip2:port2 或 ["ip1:port1", "ip2:port2"]
- REDISDB_IP_PORTS = os.getenv("REDISDB_IP_PORTS")
- REDISDB_USER_PASS = os.getenv("REDISDB_USER_PASS")
- REDISDB_DB = int(os.getenv("REDISDB_DB", 0))
- # 适用于redis哨兵模式
- REDISDB_SERVICE_NAME = os.getenv("REDISDB_SERVICE_NAME")
- # rabbitMq
- RABBITMQ_IP_PORT = os.getenv("RABBITMQ_IP_PORT")
- RABBITMQ_USER = os.getenv("RABBITMQ_USER")
- RABBITMQ_USER_PASS = os.getenv("RABBITMQ_USER_PASS")
- RABBITMQ_VIRTUAL_HOST = os.getenv("RABBITMQ_VIRTUAL_HOST", "/")
- RABBITMQ_HEARTBEAT = int(os.getenv("RABBITMQ_HEARTBEAT", 1200))
- RABBITMQ_SOCKET_TIMEOUT = int(os.getenv("RABBITMQ_SOCKET_TIMEOUT", 10))
- RABBITMQ_EXCHANGE = os.getenv("RABBITMQ_EXCHANGE", "spider")
- RABBITMQ_EXCHANGE_TYPE = os.getenv("RABBITMQ_EXCHANGE_TYPE", "direct")
- # 数据入库的pipeline,可自定义,默认MongoPipeline
- ITEM_PIPELINES = [
- # "feapder.pipelines.mysql_pipeline.MysqlPipeline",
- "feapder.pipelines.mongo_pipeline.MongoPipeline",
- ]
- EXPORT_DATA_MAX_FAILED_TIMES = 10 # 导出数据时最大的失败次数,包括保存和更新,超过这个次数报警
- EXPORT_DATA_MAX_RETRY_TIMES = 10 # 导出数据时最大的重试次数,包括保存和更新,超过这个次数则放弃重试
- # 爬虫相关
- # COLLECTOR
- COLLECTOR_SLEEP_TIME = 1 # 从任务队列中获取任务到内存队列的间隔
- COLLECTOR_TASK_COUNT = 10 # 每次获取任务数量
- # SPIDER
- SPIDER_THREAD_COUNT = 1 # 爬虫并发数
- SPIDER_SLEEP_TIME = (
- 0
- ) # 下载时间间隔 单位秒。 支持随机 如 SPIDER_SLEEP_TIME = [2, 5] 则间隔为 2~5秒之间的随机数,包含2和5
- SPIDER_TASK_COUNT = 1 # 每个parser从内存队列中获取任务的数量
- SPIDER_MAX_RETRY_TIMES = 100 # 每个请求最大重试次数
- SPIDER_AUTO_START_REQUESTS = (
- True
- ) # 是否主动执行添加 设置为False 需要手动调用start_monitor_task,适用于多进程情况下
- KEEP_ALIVE = False # 爬虫是否常驻
- # 浏览器渲染
- WEBDRIVER = dict(
- pool_size=1, # 浏览器的数量
- load_images=True, # 是否加载图片
- user_agent=None, # 字符串 或 无参函数,返回值为user_agent
- proxy=None, # xxx.xxx.xxx.xxx:xxxx 或 无参函数,返回值为代理地址
- headless=False, # 是否为无头浏览器
- driver_type="CHROME", # CHROME、EDGE、PHANTOMJS、FIREFOX
- timeout=30, # 请求超时时间
- window_size=(1024, 800), # 窗口大小
- executable_path=None, # 浏览器路径,默认为默认路径
- render_time=0, # 渲染时长,即打开网页等待指定时间后再获取源码
- custom_argument=[
- "--ignore-certificate-errors",
- "--disable-blink-features=AutomationControlled",
- ], # 自定义浏览器渲染参数
- xhr_url_regexes=None, # 拦截xhr接口,支持正则,数组类型
- auto_install_driver=True, # 自动下载浏览器驱动 支持chrome 和 firefox
- download_path=None, # 下载文件的路径
- use_stealth_js=False, # 使用stealth.min.js隐藏浏览器特征
- service_log_path=os.devnull # 日志路径
- )
- PLAYWRIGHT = dict(
- user_agent=None, # 字符串 或 无参函数,返回值为user_agent
- proxy=None, # xxx.xxx.xxx.xxx:xxxx 或 无参函数,返回值为代理地址
- headless=False, # 是否为无头浏览器
- driver_type="chromium", # chromium、firefox、webkit
- timeout=30, # 请求超时时间
- window_size=(1024, 800), # 窗口大小
- executable_path=None, # 浏览器路径,默认为默认路径
- download_path=None, # 下载文件的路径
- render_time=0, # 渲染时长,即打开网页等待指定时间后再获取源码
- wait_until="networkidle", # 等待页面加载完成的事件,可选值:"commit", "domcontentloaded", "load", "networkidle"
- use_stealth_js=False, # 使用stealth.min.js隐藏浏览器特征
- page_on_event_callback=None, # page.on() 事件的回调 如 page_on_event_callback={"dialog": lambda dialog: dialog.accept()}
- storage_state_path=None, # 保存浏览器状态的路径
- url_regexes=None, # 拦截接口,支持正则,数组类型
- save_all=False, # 是否保存所有拦截的接口, 配合url_regexes使用,为False时只保存最后一次拦截的接口
- )
- DRISSIONPAGE = dict(
- pool_size=1, # 浏览器标签页的数量,默认开启一个新标签页
- singleton_tab=True, # 一个标签页是否支持多例操作,True=单例;False=多例
- browser_path=None, # 浏览器可执行文件路径
- headless=True, # 是否为无头浏览器
- port=None, # 浏览器端口
- user_data_path=None, # 用户数据目录
- scope=None, # 浏览器端口范围, 与port 同时只能生效一个
- load_images=True, # 是否加载图片
- user_agent=None, # 字符串
- proxy=None, # xxx.xxx.xxx.xxx:xxxx
- timeout=15, # 请求超时时间,用于元素等待、alert 等待、WebPage的 s 模式连接等等
- retry=3, # 连接失败浏览器重试次数
- interval=0.5, # 连接失败重试间隔(秒)
- page_load=30, # 页面加载超时时间(秒)
- render_time=0, # 渲染时长,即打开网页等待指定时间后再获取源码
- window_size=(1024, 800), # 窗口大小
- driver_type="chromium",
- load_mode="normal", # 网页加载策略, 可选值:"normal", "eager", "none"
- download_path=None, # 下载文件的路径
- custom_argument=[
- "--no-sandbox",
- "--ignore-certificate-errors"
- ]
- )
- # 爬虫启动时,重新抓取失败的requests
- RETRY_FAILED_REQUESTS = False
- # 爬虫启动时,重新入库失败的item
- RETRY_FAILED_ITEMS = False
- # 保存失败的request
- SAVE_FAILED_REQUEST = False
- # request防丢机制。(指定的REQUEST_LOST_TIMEOUT时间内request还没做完,会重新下发 重做)
- REQUEST_LOST_TIMEOUT = 600 # 10分钟
- # request网络请求超时时间
- REQUEST_TIMEOUT = 22 # 等待服务器响应的超时时间,浮点数,或(connect timeout, read timeout)元组
- # 下载缓存 利用redis缓存,但由于内存大小限制,所以建议仅供开发调试代码时使用,防止每次debug都需要网络请求
- RESPONSE_CACHED_ENABLE = False # 是否启用下载缓存 成本高的数据或容易变需求的数据,建议设置为True
- RESPONSE_CACHED_EXPIRE_TIME = 3600 # 缓存时间 秒
- RESPONSE_CACHED_USED = False # 是否使用缓存 补采数据时可设置为True
- # redis 存放item与request的根目录
- REDIS_KEY = ""
- # 爬虫启动时删除的key,类型: 元组/bool/string。 支持正则; 常用于清空任务队列,否则重启时会断点续爬
- DELETE_KEYS = []
- # 设置代理
- PROXY_EXTRACT_API = None # 代理提取API ,返回的代理分割符为\r\n 或者 json数据{"http":"http://xxx", "https":"https://xxx"}
- PROXY_ENABLE = True
- PROXY_TUNNEL = False # 代理是否为隧道代理
- PROXY_MAX_FAILED_TIMES = 5 # 代理最大失败次数,超过则不使用,自动删除
- PROXY_AUTH = os.getenv("PROXY_AUTH")
- PROXY_POOL = "feapder.network.proxy_pool.ProxyPool" # 代理池
- # PROXY_POOL = "feapder.network.proxy_pool.DirectProxyPool"
- # PROXY_POOL = "feapder.network.proxy_pool.JySocks5ProxyPool"
- # PROXY_POOL = "feapder.network.proxy_pool.SpringBoardProxyPool"
- # 随机headers
- RANDOM_HEADERS = True
- # UserAgent类型 支持 'chrome', 'opera', 'firefox', 'internetexplorer', 'safari','mobile' 若不指定则随机类型
- USER_AGENT_TYPE = "chrome"
- # 默认使用的浏览器头
- 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"
- # requests 使用session
- USE_SESSION = False
- SESSION_REQUEST_CIPHERS = ["DH+AES", "RSA+AES"] # 若使用 ja3 发起 session请求时,必须修改 requests 模块用的传输密码
- # 下载器
- DOWNLOADER = "feapder.network.downloader.RequestsDownloader" # 请求下载器
- SESSION_DOWNLOADER = "feapder.network.downloader.RequestsSessionDownloader"
- # SESSION_DOWNLOADER = "feapder.network.downloader.RequestsJa3SessionDownloader"
- RENDER_DOWNLOADER = "feapder.network.downloader.SeleniumDownloader" # 渲染下载器
- # RENDER_DOWNLOADER = "feapder.network.downloader.PlaywrightDownloader"
- # RENDER_DOWNLOADER = "feapder.network.downloader.DrissionPageDownloader"
- MAKE_ABSOLUTE_LINKS = True # 自动转成绝对连接
- # 去重
- ITEM_FILTER_ENABLE = False # item 去重
- ITEM_FILTER_SETTING = dict(
- filter_type=1 # 永久去重(BloomFilter)= 1; 内存去重(MemoryFilter)= 2; 临时去重(ExpireFilter)= 3; 轻量去重(LiteFilter)= 4;
- )
- REQUEST_FILTER_ENABLE = False # request 去重
- REQUEST_FILTER_SETTING = dict(
- filter_type=3, # 永久去重(BloomFilter)= 1; 内存去重(MemoryFilter)= 2; 临时去重(ExpireFilter)= 3; 轻量去重(LiteFilter)= 4;
- expire_time=2592000, # 过期时间1个月
- )
- # 报警 支持钉钉、企业微信、邮件
- # 钉钉报警
- DINGDING_WARNING_URL = "" # 钉钉机器人api
- DINGDING_WARNING_PHONE = "" # 报警人 支持列表,可指定多个
- DINGDING_WARNING_ALL = False # 是否提示所有人, 默认为False
- # 邮件报警
- EMAIL_SENDER = "" # 发件人
- EMAIL_PASSWORD = "" # 授权码
- EMAIL_RECEIVER = "" # 收件人 支持列表,可指定多个
- EMAIL_SMTPSERVER = "smtp.163.com" # 邮件服务器 默认为163邮箱
- # 企业微信报警
- WECHAT_WARNING_URL = "" # 企业微信机器人api
- WECHAT_WARNING_PHONE = "" # 报警人 将会在群内@此人, 支持列表,可指定多人
- WECHAT_WARNING_ALL = False # 是否提示所有人, 默认为False
- # 时间间隔
- WARNING_INTERVAL = 3600 # 相同报警的报警时间间隔,防止刷屏; 0表示不去重
- WARNING_LEVEL = "DEBUG" # 报警级别, DEBUG / ERROR
- WARNING_FAILED_COUNT = 1000 # 任务失败数 超过WARNING_FAILED_COUNT则报警
- # 日志
- LOG_NAME = os.path.basename(os.getcwd())
- LOG_PATH = "log/%s.log" % LOG_NAME # log存储路径
- LOG_LEVEL = os.getenv("LOG_LEVEL", "DEBUG") # 日志级别
- LOG_COLOR = True # 是否带有颜色
- LOG_IS_WRITE_TO_CONSOLE = True # 是否打印到控制台
- LOG_IS_WRITE_TO_FILE = False # 是否写文件
- LOG_MODE = "w" # 写文件的模式
- LOG_MAX_BYTES = 10 * 1024 * 1024 # 每个日志文件的最大字节数
- LOG_BACKUP_COUNT = 20 # 日志文件保留数量
- LOG_ENCODING = "utf8" # 日志文件编码
- # 是否详细的打印异常
- PRINT_EXCEPTION_DETAILS = True
- # 设置不带颜色的日志格式
- LOG_FORMAT = "%(threadName)s|%(asctime)s|%(filename)s|%(funcName)s|line:%(lineno)d|%(levelname)s| %(message)s"
- # 设置带有颜色的日志格式
- os.environ["LOGURU_FORMAT"] = (
- "<green>{time:YYYY-MM-DD HH:mm:ss.SSS}</green> | "
- "<level>{level: <8}</level> | "
- "<cyan>{name}</cyan>:<cyan>{function}</cyan>:<cyan>line:{line}</cyan> | <level>{message}</level>"
- )
- OTHERS_LOG_LEVAL = "ERROR" # 第三方库的log等级
- # 打点监控 influxdb 配置
- INFLUXDB_HOST = os.getenv("INFLUXDB_HOST", "localhost")
- INFLUXDB_PORT = int(os.getenv("INFLUXDB_PORT", 8086))
- INFLUXDB_UDP_PORT = int(os.getenv("INFLUXDB_UDP_PORT", 8089))
- INFLUXDB_USER = os.getenv("INFLUXDB_USER")
- INFLUXDB_PASSWORD = os.getenv("INFLUXDB_PASSWORD")
- INFLUXDB_DATABASE = os.getenv("INFLUXDB_DB")
- # 监控数据存储的表名,爬虫管理系统上会以task_id命名
- INFLUXDB_MEASUREMENT = "task_" + os.getenv("TASK_ID") if os.getenv("TASK_ID") else None
- # 打点监控其他参数,若这里也配置了influxdb的参数, 则会覆盖外面的配置
- METRICS_OTHER_ARGS = dict(retention_policy_duration="180d", emit_interval=60)
- # 剑鱼验证码识别Api
- CAPTCHA_URL = os.getenv("CAPTCHA_URL", "http://pycaptcha.spdata.jianyu360.com")
- # 剑鱼任务中心地址
- JY_TASK_URL = os.getenv("JY_TASK_URL", "http://pytask.spdata.jianyu360.com")
- # 剑鱼附件管理服务地址
- JY_OSS_URL = os.getenv("JY_OSS_URL", "http://172.17.162.27:18011")
- JY_OSS_URL_TEST = os.getenv("JY_OSS_URL_TEST", "http://172.31.31.203:1111")
- ############# 导入用户自定义的setting #############
- try:
- from setting import *
- # 兼容老版本的配置
- KEEP_ALIVE = not AUTO_STOP_WHEN_SPIDER_DONE
- except:
- pass
|