WebMonitor 实时监控网页变化,并发送通知程序

简介

WebMonitor 是一款 python 写的开源的网页监控程序,能监控网页变化和 RSS 更新,并支持多种通知方式。

功能

  • 支持requests请求网页,支持使用PhantomJS抓取异步加载的网页
  • 支持 xpath 和 css selector 选择器,支持 JsonPath 提取 json 数据
  • 支持邮件,pushover,微信提醒(support by server酱),Bark推送,自定义GET/POST通知, Slack 通知以及 Telegram 通知
  • 支持一个任务多个选择器提取信息
  • 支持自定义消息模板
  • 简洁的UI,可视化操作
  • 支持自定义请求头,抓取需要登录的网页
  • 支持设置监控规则
  • 监控RSS更新
  • 数据导入导出

部署

手动部署

安装

下载 WebMonitor 的源码

git clone https://github.com/LogicJake/WebMonitor.git
cd WebMonitor

下载完成后安装依赖

pip install -r requirements.txt

如果需要使用无头浏览器,请确认已经安装 phantomjs,且 phantomjs 被添加到系统路径

首次运行需要迁移数据库且设置管理账号,假设账号为 admin,密码为 password,运行端口为 8000

python manage.py migrate
python manage.py initadmin --username admin --password password
python manage.py runserver 0.0.0.0:8000 --noreload

非首次运行,只需指定端口

python manage.py runserver 0.0.0.0:8000 --noreload

Docker 部署

安装

运行下面的命令下载 WebMonitor 镜像

docker pull logicjake/webmonitor

然后运行 webmonitor 即可,假设账号为 admin,密码为 password,运行端口为 8000
强烈建议通过 docker 文件夹映射参数 -v,将数据库文件保存到主机,否则在容器重建之后会丢失数据库文件,假设映射的主机目录为 /etc/webmonitor

docker run -d --name webmonitor -v /etc/webmonitor:/app/db -p 8000:8000 -e PORT=8000 -e USERNAME=admin -e PASSWORD=password logicjake/webmonitor

您可以使用下面的命令来关闭 webmonitor

docker stop webmonitor

预览

使用

设置通知方式

支持7种通知方式:邮件,pushover, Server 酱的微信提醒,Bark,自定义GET/POST通知, Slack 通知以及 Telegram 通知。邮件提醒只需要设置接收邮箱,微信提醒需要申请 SCKEY,自行搜索 Server 酱注册,简单免费。Pushover 需要填写注册就得到的 User Key。Bark需要安装客户端取得对应设备Key。Slack 需要填写“#”开头的 channel 名称,且需要保证 Slack app 已在该 channel 中。

设置系统邮箱

如果采用邮件提醒,则必须设置“系统管理/系统邮箱”,该邮箱为提醒邮件的发信人。自行根据需要使用的邮箱查找相关设置,密码一般指授权码。

系统邮箱配置只需设置一个,多于一个默认只生效第一条。

设置 Pushover Application

如果采用 Pushover 提醒,则必须设置“系统管理/Pushover 设置”中的 Pushover api token。

设置 Slack

如果采用 Slack 提醒,则必须设置“系统管理/Slack 设置”中的 Slack OAuth Access Token。具体教程见:https://github.com/slackapi/python-slack-sdk/blob/main/tutorial/01-creating-the-slack-app.md

设置 Telegram Bot

如果采用 Telegram 提醒,则必须设置“系统管理/Telegram Bot 设置”中的 Telegram Bot Token。

设置自定义GET/POST通知

如果采用自定义通知,则必须设置自定义网址。

GET

{header}{content}替换掉标题和内容的位置。以Bark为例,格式如下:

https://api.day.app/yourkey/{header}/{content}
POST

发送网址{data=}。将要发送的body内容放在{data=}内,其中{header}{content}替换掉标题和内容的位置。以WxPusher为例,格式如下:

http://wxpusher.zjiecode.com/api/send/message{data={
  "appToken":"AT_xxx",
  "content":{content},
  "summary":{header},
  "contentType":3,
  "uids":["UID_xxxx"],
  "url":"http://wxpusher.zjiecode.com"
}}

添加网页监控任务

在 任务管理 > 网页监控管理 添加新任务

  • 必须选择一种通知方式
  • 默认抓取频率为5分钟,自行根据需要调整,单位分钟,不建议调太快,以防反爬

选择器

元素选择器类型可以选择 Xpath, Css selector 或 JsonPath。

一行一个元素选择器,每一行的格式为:选择器名称{选择器内容},例如:

title{//*[@id="id3"]/text()}
myurl{//*[@id="id3"]/@href}

以下字段为系统默认保留字段,请不要使用且无法被覆盖:

  • url:该任务对应的监控网址

可以借助浏览器 F12 直接 copy 前两种选择器,需要注意的是,往往浏览器 copy 得到是元素,而不是文本信息,需要做以下补充:

xpath

  • 获取元素文本信息,在浏览器得到的选择器后加/text(),如
    //*[@id="id3"] => //*[@id="id3"]/text()
  • 获取元素属性信息,在浏览器得到的选择器后加/@属性名,如想获取元素href值
    //*[@id="id3"] => //*[@id="id3"]/@href
  • 获取元素及其子元素的所有文本信息,在浏览器得到的选择器后加/string(),如
    //*[@id="id3"] => //*[@id="id3"]/string()

css selector

  • 获取元素文本信息,在浏览器得到的选择器后加::text,如
    div#id3 > h3 => div#id3 > h3::text
  • 获取元素属性信息,在浏览器得到的选择器后加::attr(属性名),如想获取元素href值
    div#id3 > h3 => div#id3 > h3::attr(href)

JsonPath

针对返回 json 数据的接口, 可以使用 JsonPath 提取数据, 具体教程参考 https://goessner.net/articles/JsonPath/ 在Chrome F12开发者工具中,也可以找到对应元素,然后右键该元素,选择“Copy Property Path”。

消息体模板

消息体模板可为空,如果为空,则按照元素选择器的定义顺序以制表符为间隔拼接为字符串。下面介绍消息体模板的使用方式,如果元素选择器的设置为:

title{//*[@id="id3"]/text()}
myurl{//*[@id="id3"]/@href}

则消息体模板可以设置为:

{title}的网址是{myurl}

如果title对应的元素选择器提取的内容为“WebMonitor真棒”,myurl对应的元素选择器提取的内容为“https://www.logicjake.xyz/WebMonitor”,则得到的消息内容为“WebMonitor真棒的网址是https://www.logicjake.xyz/WebMonitor”。

是否选择无头浏览器

如果源网页没有异步加载,可以不使用无头浏览器获取网页

建议先选择不使用,假如提交时提示获取不到文本信息,再使用无头浏览器尝试

正则表达式

如果获取到的文本信息有冗余,可以采用正则进一步筛选,如
价格:1390使用正则([1-9]\d*)提取到纯数字1390

监控规则

默认不填则文本发生变化就发通知,多规则请以’;’分开。存在规则的情况下,如果文本发生变化,从前往后检查规则,若符合其中一项规则就发通知。
规则格式:-规则 参数
支持以下规则:

-without

如:文本发生变化且文本内容不包含上架

-without 上架

-contain

如:文本发生变化且文本内容包含上架

-contain 上架

-increase

如:文本发生变化且相较于旧值,数值增长超过3
如果文本内容不是纯数字,请用正则提取出纯数字,否则将会报错

-increase 3

-decrease

如:文本发生变化且相较于旧值,数值减少超过3
如果文本内容不是纯数字,请用正则提取出纯数字,否则将会报错

-decrease 3

-equal

如:文本发生变化且等于某个值,数值等于3
如果文本内容不是纯数字,请用正则提取出纯数字,否则将会报错

-equal 3

-less

如:文本发生变化且小于某个值,数值小于3
如果文本内容不是纯数字,请用正则提取出纯数字,否则将会报错

-less 3

-more

如:文本发生变化且大于某个值,数值大于3
如果文本内容不是纯数字,请用正则提取出纯数字,否则将会报错

-more 3

自定义请求头

可以自定义请求时的请求头,主要用于设置Cookie,获取需要登录才能查看的页面,格式为字典,如
{'Cookie':'自定义cookie值'}

添加RSS监控任务

可以在 任务管理 > RSS监控任务管理 添加新RSS监控任务

任务状态查看

可以在任务状态栏目下查看所有任务,包括任务状态(run or stop),上次运行时间,上次运行结果,运行结果包括三类:

  • 监测到变化,最新值:{最新值}
  • 成功执行但未监测到变化
  • 出错显示异常信息

可以通过修改任务状态,暂停或重启任务

数据导入导出

WARNING: 网页监控任务和RSS监控任务的通知方式是通过外键与通知方式表连接,在数据表发生变化的情况下,外键id可能失效或无法和导出时保持一致,建议每次导入任务数据后检查通知方式是否正常。

实例

一般都是用来监控价格变化,但暂时没有什么想买的东西,所以就监控下每天发布的新片子吧

打开网址 https://www.bd2020.com/movies/index.htm,按 F12 调出开发者工具

① 按左上角的小箭头(Ctrl+Shift+C)开启选择模式
② 选定区域后右键高亮的代码
③ Copy –> Copy XPath

在 任务管理 –> 网页监控管理 添加新任务

  • 任务名称:随便
  • 监控网址:填写监控网址
  • 元素选择器类型:选择 Xpath
  • 元素选择器:粘贴上一步复制的内容
  • 通知方式:同时添加了 WxPusher 和 Alertover

By 行政