dongzhaorui 2 月之前
父節點
當前提交
193535c1e2
共有 1 個文件被更改,包括 92 次插入23 次删除
  1. 92 23
      FworkSpider/feapder/setting.py

+ 92 - 23
FworkSpider/feapder/setting.py

@@ -2,6 +2,9 @@
 """爬虫配置文件"""
 import os
 
+# 用户根目录,输出类似:C:\Users\用户名 或 /home/用户名
+_USER_ROOT_DIR = os.path.expanduser("~")
+
 # 列表任务表模版
 TAB_REQUESTS = "{redis_key}:z_requests"
 # 详情待处理任务表模版
@@ -79,19 +82,65 @@ WEBDRIVER = dict(
     user_agent=None,  # 字符串 或 无参函数,返回值为user_agent
     proxy=None,  # xxx.xxx.xxx.xxx:xxxx 或 无参函数,返回值为代理地址
     headless=False,  # 是否为无头浏览器
-    driver_type="CHROME",  # CHROME、PHANTOMJS、FIREFOX
+    driver_type="CHROME",  # CHROME、EDGE、PHANTOMJS、FIREFOX
     timeout=30,  # 请求超时时间
     window_size=(1024, 800),  # 窗口大小
     executable_path=None,  # 浏览器路径,默认为默认路径
     render_time=0,  # 渲染时长,即打开网页等待指定时间后再获取源码
-    custom_argument=["--ignore-certificate-errors"],  # 自定义浏览器渲染参数
+    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  # 日志路径
 )
 
-# splash 渲染
-SPLASH_API = os.getenv("SPLASH_API")
+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时只保存最后一次拦截的接口
+)
 
-# 验证码
-CAPTCHA_URL = os.getenv("CAPTCHA_URL", "http://pycaptcha.spdata.jianyu360.com")
+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
@@ -115,23 +164,34 @@ REDIS_KEY = ""
 DELETE_KEYS = []
 
 # 设置代理
-PROXY_EXTRACT_API = None  # 代理提取API ,返回的代理分割符为\r\n
+PROXY_EXTRACT_API = None  # 代理提取API ,返回的代理分割符为\r\n 或者 json数据{"http":"http://xxx", "https":"https://xxx"}
 PROXY_ENABLE = True
-# 剑鱼代理
-JY_PROXY_URL = None
-JY_PROXY_AUTHOR = os.getenv("JY_PROXY_AUTHOR")
+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"
-# 默认使用的浏览器头 RANDOM_HEADERS=True时不生效
+# 默认使用的浏览器头
 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
-USE_JA3_SESSION = False
-# 遇见 ja3 反爬网站,修改 requests模块用的传输密码
-JA3_REQUEST_CIPHERS = ["DH+AES", "RSA+AES"]
+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(
@@ -142,11 +202,6 @@ REQUEST_FILTER_SETTING = dict(
     filter_type=3,  # 永久去重(BloomFilter)= 1; 内存去重(MemoryFilter)= 2; 临时去重(ExpireFilter)= 3; 轻量去重(LiteFilter)= 4;
     expire_time=2592000,  # 过期时间1个月
 )
-TASK_FILTER_ENABLE = False  # task 去重
-TASK_FILTER_SETTING = dict(
-    filter_type=3,  # 永久去重(BloomFilter)= 1; 内存去重(MemoryFilter)= 2; 临时去重(ExpireFilter)= 3; 轻量去重(LiteFilter)= 4;
-    expire_time=2592000,  # 过期时间1个月
-)
 
 # 报警 支持钉钉、企业微信、邮件
 # 钉钉报警
@@ -167,9 +222,10 @@ 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 = "DEBUG"
+LOG_LEVEL = os.getenv("LOG_LEVEL", "DEBUG")  # 日志级别
 LOG_COLOR = True  # 是否带有颜色
 LOG_IS_WRITE_TO_CONSOLE = True  # 是否打印到控制台
 LOG_IS_WRITE_TO_FILE = False  # 是否写文件
@@ -177,10 +233,17 @@ 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等级
-LOG_IS_SEND_TO_LOGSTASH = False  # 是否开启elk服务
-LOG_STASH_IP = os.getenv("STASH_IP", "localhost")  # elk服务地址
-LOG_STASH_PORT = os.getenv("STASH_IP", 5959)  # elk服务端口
 
 # 打点监控 influxdb 配置
 INFLUXDB_HOST = os.getenv("INFLUXDB_HOST", "localhost")
@@ -194,6 +257,12 @@ INFLUXDB_MEASUREMENT = "task_" + os.getenv("TASK_ID") if os.getenv("TASK_ID") el
 # 打点监控其他参数,若这里也配置了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")
+
 ############# 导入用户自定义的setting #############
 try:
     from setting import *