RT,对于每月定时更新爬虫,需要抽取的数据对应的网页结构发生变化数据就会解析出错;例如要抽取的文本一开始 是 //div/span/em/text(), 下次网页结构调整就变成 //div/span/span/text();有什么好的办法可以监控网页结构发生变化或者更健壮的解析方式吗?
1
crclz 2020-09-02 10:59:22 +08:00
写测试。
爬虫的时候,看看抓取的标题是否为空,是否达到了几个字,是否是汉字……如果不符合测试条件,就通知人工干预(检查+重新写代码) |
2
MrhuangSTR OP @crclz 思路可以,但总感觉还可以再优化...如果要抽取的字段很多,那就要对每一个字段进行判断比较
|
3
hotpot6147 2020-09-02 11:19:17 +08:00 1
解析出错时就说明"网页结构"发生了变化, 所以通过捕获异常来监控
|
4
crclz 2020-09-02 11:25:38 +08:00
或者用 selenium 获取元素在屏幕上的坐标?与标准坐标差距在某个值以内,就认为未改变。
|
5
nnnToTnnn 2020-09-02 11:33:27 +08:00
这不就是 jest 吗? 有成熟的 jest 为什么不用?
|
6
zsdroid 2020-09-02 11:39:47 +08:00
解析出错不就是监听到了"网页结构"变化吗?
|
7
flowfire 2020-09-02 12:00:15 +08:00 2
点进来之前我以为你说的是 MutationObserver 。。。。
|
8
MrhuangSTR OP |
9
MrhuangSTR OP @crclz 解析用 xpath 抽取文本,如果用 selenium 监测坐标点相差可能会更大吧
|
10
MrhuangSTR OP @flowfire 你不说,我还不知道有 MutationObserver 这个东西.......
|
11
hugedata 2020-09-02 14:29:31 +08:00
一般的处理方式不都是配置规则么。。。。爬取之前如果检测到规则出错,就跳过这项任务。然后发给人工重新编辑规则。爬虫是要人工来维护的,基本上做不到全自动。
|
12
MrhuangSTR OP @hugedata 你的意思是爬之前先按照设置的规则抓取一遍,如果不符合预期就发邮件或者其他方式通知
|
13
MrhuangSTR OP @nnnToTnnn 搜了下 jest, JavaScript 单元测试?这跟监控网页结构有啥关系
|
14
nnnToTnnn 2020-09-02 14:45:52 +08:00
@MrhuangSTR jest 原理就是利用无头浏览器,进行 dom 节点的断言。 如果是自己项目。 一般是用 jest 断言。 如果是做数据抓取,估计就是我想错了。
|
15
est 2020-09-02 14:48:29 +08:00
正文抓取?看样子又不一样。2333
|
16
hugedata 2020-09-02 14:49:13 +08:00
@MrhuangSTR 对,一般两种方式:1.质量巡检(事后),2.单页面预处理(事前)。具体要结合你的业务来,看看怎么做更适合你们,或者两个结合,或者更多的其他的我没有想到的办法。
|
17
jdkl 2020-09-02 14:56:18 +08:00 via Android
记得 chrome 有一个插件能够检测网页结构的变化并能发出提醒,但一直没用过,忘记叫什么名字了
|
18
MrhuangSTR OP @jdkl 叫 Distill Web Monitor 吧,这插件是可以监控网页变化,现在在用,但是只要是网页文本发生变化就会认定是发生变化了吧
|
19
MrhuangSTR OP @hugedata 你说的这两个词我在爬虫中咋就没有听过....可能我们的业务比较随意
|
20
lawler 2020-09-02 19:19:39 +08:00
蹲一个结果。
|
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 邮件或者钉钉 或者自建监控表入个库。 这种方法只适用于静态页面 |
22
Hades300 2020-09-03 09:28:10 +08:00
其实爬虫写得好,只要捕获特定类型的 Exception 。中间件里写 Hook 就好。
|
23
RockShake 2020-09-03 11:06:41 +08:00
目前的业务主要就靠捕获异常来获取
|
24
MrhuangSTR OP @Hades300 有比较好的中间件处理的版本观摩下吗
|
25
MrhuangSTR OP @RockShake 捕获异常然后通知还是?
|
26
ChangHaoWei 2020-09-19 16:16:23 +08:00
你这爬虫的话 很多页面都是相同的啊,,那就搞 sample 监测啊。固定监控几个页面 那几个页面出了问题肯定相关的所有页面都不行。
|