Python中是否有监听网页变化并实时通知的包?
目前用的是爬虫,但是自己写的每隔 5 秒访问 api 有点耗流量和占内存,有什么好的办法吗,另外要同时监听多个网页( 100 个)的话有什么好方法吗?
Python中是否有监听网页变化并实时通知的包?
怎么可能嘛。你不访问 api,api 又不会自己发信息给你。
有,requests-html 和 selenium 都能做到,但思路不同。
简单监控用 requests-html 就行,它轻量,适合静态页面。下面是个完整例子,它会每隔30秒检查一次页面,如果发现变化就打印提示:
from requests_html import HTMLSession
import time
import hashlib
def monitor_website(url, interval=30):
session = HTMLSession()
last_hash = None
while True:
try:
r = session.get(url)
r.html.render(sleep=2) # 执行JavaScript
current_content = r.html.html
current_hash = hashlib.md5(current_content.encode()).hexdigest()
if last_hash and current_hash != last_hash:
print(f"[{time.ctime()}] 页面内容已变化!")
# 这里可以添加邮件、微信通知等逻辑
last_hash = current_hash
time.sleep(interval)
except Exception as e:
print(f"监控出错: {e}")
time.sleep(interval)
# 使用示例
monitor_website("https://example.com", interval=30)
如果页面动态内容多,得用 selenium,它能完全模拟浏览器。不过资源消耗大,适合对准确性要求高的场景。
总结:轻量监控用 requests-html,复杂页面用 selenium。
可以只读头信息,如果头信息里有页面变化的相关值,就可以省流量。
#2 这样也需要请求吧,只是没处理相应消息
#2 api 又不是静态文件, 使用 head 方法没有任何意义
可以啊, 你可以写一套复杂到调度策略, 根据统计信息经过一系列逻辑判断来决定你到请求频率和请求时间。
当然, 在 99%的情况下, 你的时间估计比流量值钱
这点流量算个球啊。。
给钱让网站再更新的时候,给你发微信啊
付费让对方接口实现变化时 webhook 通知。
监听网页了都, 还不让访问么, 访问 http 就算爬虫了吧, 前段时间刚好追剧和追一拳超人漫画, 随手用写了个简单的爬虫后台, 主要目的就是把定位变化位置的部分用常规解析器+普通字符串来定位, css/Xpath/regex/Jsonpath 等等, 但是对你这种情况, 还是爬虫简单点啊, 你说的占内存费流量, 费流量看对方是否有 gzip, 不然只能通过 headers 判断了. 至于占内存, 我随手弄的协程爬虫百并发也没用多少内存, 你是不是姿势有问题, 不过高并发下 cpu 飙起来是挺正常的
主要是如果页面一多,这样每间隔 5 秒其实访问量也挺厉害的
找 xss 插入 js。
这是杀鸡用牛刀啊[哭笑]
header 里面没有 length 信息,也没有其他可以看到变化的值
了解一下 huginn ?
23333,真找到了很省事。
网页还是 api ?哪种网页?支持 head 方法?
楼主需要的应该不是包而是服务吧,毕竟如果要求本地不请求还能知道网页变没变只有外部主动通知才可能
可以考虑
https://versionista.com/
https://fluxguard.com/
https://www.sken.io/
HEAD 在实现良好的 RESTful 风格 Api 里面是很有用的。
#19
1. 按照楼主的提问, 那么肯定是从 http 协议层面考虑, 至于 api 是不是 rest 风格的,没法确定, 没法保证, 没法修改。
2. 其次, 我是没看懂为什么一个动态资源( api )需要实现 head 方法。
按照 mdn 和 rfc2616 的说法,head 方法就是一个 get 方法不返回 body, 主要到作用也是解决带宽和缓存处理。实现良好的 RESTful 风格 Api 可有任何实际的项目在使用?麻烦发一下 github 地址。
https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Methods/HEAD<br>HTTP HEAD 方法 请求资源的头部信息, 并且这些头部与 HTTP GET 方法请求时返回的一致. 该请求方法的一个使用场景是在下载一个大文件前先获取其大小再决定是否要下载, 以此可以节约带宽资源.<br>
rfc2616<br>9.4 HEAD<br>The HEAD method is identical to GET except that the server MUST NOT return a message-body in the response. The metainformation contained in the HTTP headers in response to a HEAD request SHOULD be identical to the information sent in response to a GET request. This method can be used for obtaining metainformation about the entity implied by the request without transferring the entity-body itself. This method is often used for testing hypertext links for validity, accessibility, and recent modification.<br><br>The response to a HEAD request MAY be cacheable in the sense that the information contained in the response MAY be used to update a previously cached entity from that resource. If the new field values indicate that the cached entity differs from the current entity (as would be indicated by a change in Content-Length, Content-MD5, ETag or Last-Modified), then the cache MUST treat the cache entry as stale.<br><br>
你要的是不是 Etag 或者 Last-Modified ?
占内存就像是一个笑话。。。感觉你是在提前优化😎 阔怕
如果确实发百来个请求就占用了大量内存(写了什么代码😂),实在要优化,花 100 块买根 1G 的条子加上去难道不香吗,实在不行买 128G 的也行😂
量多占用太多流量这个看楼主#13 说的似乎很难优化,不过量多往往代表着普普通通很长时间不太可能变化,意思就是代表着时效性没有想象的这么高,给这些按重要性分一下级,90%不重要的也许 5 秒改成 500 秒就好了,来 1000 个改成 5000 秒,以此类推😂
爬虫是放在在非洲用 2G 上网的,流量这么金贵
“但是自己写的每隔 5 秒访问 api 有点耗流量和占内存”被你爬的公司还没说话呢… 2333
“有点耗流量和占内存”, 你是用手机跑爬虫的吗 
楼主这应该是在监听 KJ 结果


