Python中如何实现在线检测爬虫更新

在线检测地址https://sdk.egoid.me/

本次更新的内容

  1. 增加爬虫威胁导出 CSV(邮件推送)
  2. 增加时段爬虫趋势显示

开源版本鼓励大家多多贡献下想法,建议和意见可以在群里面反馈或者提交到 github,每两周统一更新~

往期精彩帖子:


Python中如何实现在线检测爬虫更新

2 回复

我理解你的需求是想在Python中监控一个网页或数据源,当爬虫目标内容更新时能自动检测到。核心思路是定期抓取目标,通过对比内容变化来判断更新。

这里提供一个基于requestsdifflib的简单示例,它会定时抓取网页并比较内容差异:

import requests
import time
import hashlib
from difflib import SequenceMatcher

class ContentMonitor:
    def __init__(self, url, check_interval=60):
        self.url = url
        self.interval = check_interval
        self.previous_content = ""
        self.previous_hash = ""
    
    def fetch_content(self):
        """获取网页内容"""
        try:
            response = requests.get(self.url, timeout=10)
            response.raise_for_status()
            return response.text
        except requests.RequestException as e:
            print(f"抓取失败: {e}")
            return None
    
    def get_content_hash(self, content):
        """计算内容哈希值用于快速比较"""
        return hashlib.md5(content.encode()).hexdigest()
    
    def check_for_updates(self):
        """检查内容是否更新"""
        current_content = self.fetch_content()
        if current_content is None:
            return False
        
        current_hash = self.get_content_hash(current_content)
        
        # 首次运行,初始化记录
        if not self.previous_content:
            self.previous_content = current_content
            self.previous_hash = current_hash
            print("初始化监控...")
            return False
        
        # 哈希值不同说明内容有变化
        if current_hash != self.previous_hash:
            # 计算相似度或显示差异
            similarity = SequenceMatcher(None, self.previous_content, current_content).ratio()
            print(f"检测到更新!相似度: {similarity:.2%}")
            
            # 更新记录
            self.previous_content = current_content
            self.previous_hash = current_hash
            return True
        
        return False
    
    def run(self):
        """运行监控循环"""
        print(f"开始监控: {self.url}")
        while True:
            self.check_for_updates()
            time.sleep(self.interval)

# 使用示例
if __name__ == "__main__":
    # 监控目标URL,每30秒检查一次
    monitor = ContentMonitor("https://example.com", check_interval=30)
    monitor.run()

这个方案有几个关键点:

  1. 定时抓取:通过time.sleep()实现定期检查
  2. 哈希比较:用MD5哈希快速判断内容是否变化,避免全文比较的开销
  3. 差异分析:当检测到变化时,用difflib计算新旧内容的相似度
  4. 异常处理:基本的网络请求异常处理

如果你需要监控特定部分(比如某个CSS选择器下的内容),可以结合BeautifulSoup来提取目标区域。对于动态加载的内容,可能需要用selenium

建议:根据实际需求选择合适的抓取频率和比较粒度。


研究下,如何检测爬虫的

回到顶部