V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
MrhuangSTR
V2EX  ›  Python

有什么好的办法可以监控"网页结构"变化

  •  
  •   MrhuangSTR · 2020-09-02 09:57:21 +08:00 · 3800 次点击
    这是一个创建于 1544 天前的主题,其中的信息可能已经有所发展或是发生改变。

    RT,对于每月定时更新爬虫,需要抽取的数据对应的网页结构发生变化数据就会解析出错;例如要抽取的文本一开始 是 //div/span/em/text(), 下次网页结构调整就变成 //div/span/span/text();有什么好的办法可以监控网页结构发生变化或者更健壮的解析方式吗?

    26 条回复    2020-09-19 16:16:23 +08:00
    crclz
        1
    crclz  
       2020-09-02 10:59:22 +08:00
    写测试。
    爬虫的时候,看看抓取的标题是否为空,是否达到了几个字,是否是汉字……如果不符合测试条件,就通知人工干预(检查+重新写代码)
    MrhuangSTR
        2
    MrhuangSTR  
    OP
       2020-09-02 11:13:43 +08:00
    @crclz 思路可以,但总感觉还可以再优化...如果要抽取的字段很多,那就要对每一个字段进行判断比较
    hotpot6147
        3
    hotpot6147  
       2020-09-02 11:19:17 +08:00   ❤️ 1
    解析出错时就说明"网页结构"发生了变化, 所以通过捕获异常来监控
    crclz
        4
    crclz  
       2020-09-02 11:25:38 +08:00
    或者用 selenium 获取元素在屏幕上的坐标?与标准坐标差距在某个值以内,就认为未改变。
    nnnToTnnn
        5
    nnnToTnnn  
       2020-09-02 11:33:27 +08:00
    这不就是 jest 吗? 有成熟的 jest 为什么不用?
    zsdroid
        6
    zsdroid  
       2020-09-02 11:39:47 +08:00
    解析出错不就是监听到了"网页结构"变化吗?
    flowfire
        7
    flowfire  
       2020-09-02 12:00:15 +08:00   ❤️ 2
    点进来之前我以为你说的是 MutationObserver 。。。。
    MrhuangSTR
        8
    MrhuangSTR  
    OP
       2020-09-02 14:11:32 +08:00
    @hotpot6147
    @zsdroid 确实是一种比较取巧的方式,但是都是在爬虫运行过程中才能捕获,感觉不够健壮;能不能在爬虫运行之前先监控到网页结构发生变化,如果未发生变化则运行。
    MrhuangSTR
        9
    MrhuangSTR  
    OP
       2020-09-02 14:13:56 +08:00
    @crclz 解析用 xpath 抽取文本,如果用 selenium 监测坐标点相差可能会更大吧
    MrhuangSTR
        10
    MrhuangSTR  
    OP
       2020-09-02 14:14:20 +08:00
    @flowfire 你不说,我还不知道有 MutationObserver 这个东西.......
    hugedata
        11
    hugedata  
       2020-09-02 14:29:31 +08:00
    一般的处理方式不都是配置规则么。。。。爬取之前如果检测到规则出错,就跳过这项任务。然后发给人工重新编辑规则。爬虫是要人工来维护的,基本上做不到全自动。
    MrhuangSTR
        12
    MrhuangSTR  
    OP
       2020-09-02 14:41:47 +08:00
    @hugedata 你的意思是爬之前先按照设置的规则抓取一遍,如果不符合预期就发邮件或者其他方式通知
    MrhuangSTR
        13
    MrhuangSTR  
    OP
       2020-09-02 14:43:26 +08:00
    @nnnToTnnn 搜了下 jest, JavaScript 单元测试?这跟监控网页结构有啥关系
    nnnToTnnn
        14
    nnnToTnnn  
       2020-09-02 14:45:52 +08:00
    @MrhuangSTR jest 原理就是利用无头浏览器,进行 dom 节点的断言。 如果是自己项目。 一般是用 jest 断言。 如果是做数据抓取,估计就是我想错了。
    est
        15
    est  
       2020-09-02 14:48:29 +08:00
    正文抓取?看样子又不一样。2333
    hugedata
        16
    hugedata  
       2020-09-02 14:49:13 +08:00
    @MrhuangSTR 对,一般两种方式:1.质量巡检(事后),2.单页面预处理(事前)。具体要结合你的业务来,看看怎么做更适合你们,或者两个结合,或者更多的其他的我没有想到的办法。
    jdkl
        17
    jdkl  
       2020-09-02 14:56:18 +08:00 via Android
    记得 chrome 有一个插件能够检测网页结构的变化并能发出提醒,但一直没用过,忘记叫什么名字了
    MrhuangSTR
        18
    MrhuangSTR  
    OP
       2020-09-02 14:59:49 +08:00
    @jdkl 叫 Distill Web Monitor 吧,这插件是可以监控网页变化,现在在用,但是只要是网页文本发生变化就会认定是发生变化了吧
    MrhuangSTR
        19
    MrhuangSTR  
    OP
       2020-09-02 15:01:32 +08:00
    @hugedata 你说的这两个词我在爬虫中咋就没有听过....可能我们的业务比较随意
    lawler
        20
    lawler  
       2020-09-02 19:19:39 +08:00
    蹲一个结果。
    Hades300
        21
    Hades300  
       2020-09-03 09:25:37 +08:00
    页面的变动是只有拿到 response 才能知道呀。其实宽泛一点,但凡页面发生变化都可以被认为是“结构改变”。
    我的话,会在每次爬取时生成对 response.text 的哈希吧,然后存到 Redis (当然其他也行),key 要能映射到单次请求,考虑到 Post 不会改变 url 。。key 的生成我大概会选个 md5(method+url+data)。
    有了这样的键值对后,把这部分比较写到中间件里,equal or unset ->set hash and save item,failed -> updated & drop item & Call Hook 邮件或者钉钉 或者自建监控表入个库。

    这种方法只适用于静态页面
    Hades300
        22
    Hades300  
       2020-09-03 09:28:10 +08:00
    其实爬虫写得好,只要捕获特定类型的 Exception 。中间件里写 Hook 就好。
    RockShake
        23
    RockShake  
       2020-09-03 11:06:41 +08:00
    目前的业务主要就靠捕获异常来获取
    MrhuangSTR
        24
    MrhuangSTR  
    OP
       2020-09-03 11:35:27 +08:00
    @Hades300 有比较好的中间件处理的版本观摩下吗
    MrhuangSTR
        25
    MrhuangSTR  
    OP
       2020-09-03 11:36:02 +08:00
    @RockShake 捕获异常然后通知还是?
    ChangHaoWei
        26
    ChangHaoWei  
       2020-09-19 16:16:23 +08:00
    你这爬虫的话 很多页面都是相同的啊,,那就搞 sample 监测啊。固定监控几个页面 那几个页面出了问题肯定相关的所有页面都不行。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1122 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 23:33 · PVG 07:33 · LAX 15:33 · JFK 18:33
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.