Python爬虫运行时如何实时读取用户的配置参数?
场景是这样的: 一个爬虫,一个网站。 用户在网站中配置爬虫的参数,爬虫实时根据配置的参数决定其运行状态。
那么,如何将用户修改更新的参数反映到爬虫呢?
当前的做法是,爬虫执行新的一轮爬取前,读取用户配置的 rest api,通过 api 传递数据,但总感觉不优雅,也不是很方便。
是否又专门针对这种场景更好的方式呢?
Python爬虫运行时如何实时读取用户的配置参数?
10 回复
将最新配置实时通过 MQ 发送,爬虫开个线程消费 MQ
在Python爬虫中实时读取用户配置参数,一个实用的方法是使用watchdog库监控配置文件变化,并结合configparser或json解析配置。下面是一个完整的示例:
import json
import time
from threading import Lock
from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler
class ConfigManager:
def __init__(self, config_path):
self.config_path = config_path
self.config = {}
self.lock = Lock()
self.load_config()
self.start_watcher()
def load_config(self):
"""加载配置文件"""
try:
with open(self.config_path, 'r', encoding='utf-8') as f:
with self.lock:
self.config = json.load(f)
print(f"配置已加载: {self.config}")
except Exception as e:
print(f"加载配置失败: {e}")
def get_config(self, key, default=None):
"""获取配置值"""
with self.lock:
return self.config.get(key, default)
def start_watcher(self):
"""启动文件监控"""
event_handler = ConfigFileHandler(self)
observer = Observer()
observer.schedule(event_handler, path='.', recursive=False)
observer.start()
class ConfigFileHandler(FileSystemEventHandler):
def __init__(self, config_manager):
self.config_manager = config_manager
def on_modified(self, event):
if event.src_path.endswith('config.json'):
print("检测到配置文件变化,重新加载...")
self.config_manager.load_config()
# 示例爬虫类
class MySpider:
def __init__(self, config_manager):
self.config = config_manager
def crawl(self):
while True:
# 实时获取最新配置
delay = self.config.get_config('request_delay', 1)
max_pages = self.config.get_config('max_pages', 10)
print(f"当前配置: 延迟={delay}s, 最大页数={max_pages}")
# 这里执行实际的爬取逻辑
time.sleep(delay)
if __name__ == "__main__":
# 创建配置管理器
config_mgr = ConfigManager('config.json')
# 启动爬虫
spider = MySpider(config_mgr)
spider.crawl()
config.json示例:
{
"request_delay": 2,
"max_pages": 20,
"user_agent": "MySpider/1.0"
}
工作原理:
ConfigManager类负责加载和提供配置访问- 使用
watchdog监控配置文件变化,修改后自动重新加载 - 线程锁保证配置读取的线程安全
- 爬虫循环中每次都会获取最新的配置值
使用方式:
- 运行爬虫后,修改
config.json文件 - 配置变化会自动生效,无需重启爬虫
- 支持JSON、YAML等多种格式(只需修改
load_config方法)
总结:用文件监控实现配置热更新最直接。
信号
从 api 拉配置不是很常规的操作么?
我觉得爬虫没必要搞得多复杂
你要觉得不好
爬虫端再开一个线程接受配置的推送?
协议用 api/rpc 之类的都行
看了一下,觉得消息队列比较契合。
通过数据库来做,Crawlab 就是这么做的,将环境变量存入数据库中,爬虫去数据库中拿环境变量。
http://github.com/tikazyq/crawlab
新版的 crawlab 是用 golang 写的后台,还没发布,预先打个广告。
你需要的是配置中心(zookeeper 之类的), 别用消息队列
太重了吧,就是想在用户更新配置后发送给后端,感觉一个轻量级的后端足以应付?
#7 第一次听说 zookeeper 比 mq 重
手机布局现在还没有优化,只能暂时用 PC 来看

