|
@@ -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 *
|