突然想到一种简单的反爬虫方法,大家觉得可行性如何? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
alwayshere
V2EX    程序员

突然想到一种简单的反爬虫方法,大家觉得可行性如何?

  alwayshere 2017-03-21 08:59:53 +08:00 12187 次点击
这是一个创建于 3193 天前的主题,其中的信息可能已经有所发展或是发生改变。

完全做到反爬虫肯定是个伪命题,反爬虫只能最大限度地去遏制,而不是杀绝,这几天一直在构思怎样将我辛辛苦苦的原创内容加以保护别被爬了,但杀爬虫杀得太猛把可爱的搜索引擎蜘蛛们也赶尽杀绝了,所以想了一种简单的方法:

  1. 把 header 包含有 bot 和 spider 的 ip 后台暂时放行,加入队列,后台 daemon 进程逐一验证其 host 地址是否为搜索引擎
  2. 验证客户端的 cookie ,我使用的是 Google analytics ,没有诸如“_ga ”或者“_gat ”之类的 cookie 把它 ban 了
  3. 在页面角落处插入一个隐形的动态图片: src="checkScraper.php" width="0" height="0",没加载这个图片的 ip 也给 ban 了

上面这个 ban 了不是指给他抛出一个 400 错误,而是逐渐延迟加载时间,让采集者不能发现, php: sleep($i),$i 表示请求次数

大家觉得是否可行,或者我在这抛砖引玉一下,除了通常的蜜罐法(烂大街了,我采集网站都是先看对方 robots.txt 有没有蜜罐),或者限制 ip 频率法(误伤蜘蛛),大家有没有更好的方法?

58 条回复    2020-03-10 00:14:45 +08:00
RE
    1
RE  
   2017-03-21 09:02:42 +08:00 via iPhone
你说的这三点,只要是针对你网站去爬的,不都可以伪造么……
alwayshere
    2
alwayshere  
OP
   2017-03-21 09:05:15 +08:00
@RE 同时满足这三点的,估计一大部分都过滤掉了吧
friskfly
    3
friskfly  
   2017-03-21 09:05:39 +08:00 via Android
现在爬虫图省事直接用真实的浏览器去爬了。还是高级验证码什么的靠谱点。
jininij
    4
jininij  
   2017-03-21 09:06:47 +08:00 via Android   1
我都是屏蔽所以 analytics js 的。
alwayshere
    5
alwayshere  
OP
   2017-03-21 09:07:20 +08:00
@friskfly 我写爬虫很少用浏览器去爬,要不对方一下流量突然暴涨,肯定要追查 ip 的
notgod
    6
notgod  
   2017-03-21 09:07:40 +08:00
我忘记了域名是什么了
就是显示很多域名注册商 域名注册量 还有 isp 的 IP isp 的 ip 绑定了多少网站
使用的 webserver 等等 一个统计网站

最早的时候 我是拿来抓淘宝新绑定的网店域名 二级域名 然后干些不可描述的事

后来抓不到那边加了个 Cookies 有效期验证 这个我尝试 N 多方法 爬不到数据
无论如何 都爬不到 但是人工访问没问题

好像的算法是这个逻辑
A 访问页面 生成一个 cookies 这个信息是加密的 包括有效期
A 在访问其他页面 解密 验证 cookies 算有效时 有效放行 无效 显示 spam 验证
alwayshere
    7
alwayshere  
OP
   2017-03-21 09:09:44 +08:00
@notgod 搜索引擎支持 cookie 么?不会吧可爱的小蜘蛛也给误杀了?
nicevar
    8
nicevar  
   2017-03-21 09:11:33 +08:00 via iPhone
只要你的网站能正常访问,就没法屏蔽爬虫,这个事情好无聊
notgod
    9
notgod  
   2017-03-21 09:12:07 +08:00   2
@alwayshere 封 IP 什么的都是浮云,
我也遇到封 IP 但是使用变态方式解决了
直接拿 AKAMAI 的 CDN 去绑源站 , 然后利用 AKAMAI 的 N 多 IP 轮番上阵
左一遍又一遍的把别人网站轮的不要不要的.......
notgod
    10
notgod  
   2017-03-21 09:13:29 +08:00
@alwayshere 新一代的爬虫都支持 cookie , 而且可以解析 js 内容了 差不多和人访问的区别不大
不要认为还是以前 爬网页 只是提取文本和图片内容
practicer
    11
practicer  
   2017-03-21 09:18:51 +08:00
这两天发现一个没碰到过的防爬例子,
用 css display: inline-block;width: auto 穿插着自动显示文本,蜘蛛和爬虫互不影响
网址: http://club.autohome.com.cn/bbs/thread-c-3170-60727592-1.html
darluc
    12
darluc  
   2017-03-21 09:22:15 +08:00
说一下,以前公司遇到爬虫都是吐脏数据的
alwayshere
    13
alwayshere  
OP
   2017-03-21 09:22:52 +08:00
@darluc 这个有点贱,不怕对方报复么
alwayshere
    14
alwayshere  
OP
   2017-03-21 09:24:49 +08:00
@practicer 这个。。。蜘蛛没法识别了吧,全是 css 显示文本。。。
kindjeff
    15
kindjeff  
   2017-03-21 09:26:51 +08:00 via iPhone
百度知道在你大量访问的时候,返回的是字的图片,就是几个字中间出现一个图片的字,用户看起来没有区别,爬虫就爬不到所有的字。
gamecreating
    16
gamecreating  
   2017-03-21 09:27:59 +08:00
你还是研究下机器学习...能自住修改反爬规则
jininij
    17
jininij  
   2017-03-21 09:28:15 +08:00 via Android
我是每个 session 都随机新建一个密码。然后在输出页面里用这个密码对称加密。在页面 head 里放一个外部 js ,在这个 js 是用 php 生成的,将替换的字替解密换回去。因为 head 里的 js 会阻塞显示,所以用户根本看不出文字错误。但查看源码是一堆乱码。
为了防止复制,这些解密后的字符是通过 canvas 绘制到页面中的。再加点与用户对应的水印最好。
有本事就去逐行调试 js 。
RE
    18
RE  
   2017-03-21 09:35:02 +08:00 via iPhone   2
@alwayshere 你想多了,要满足这三点太简单了, V2 的 API 调用限制了每 IP 每小时 120 次,照样都把三十万帖爬下来了,关键就看要不要爬而已
xuan_lengyue
    19
xuan_lengyue  
   2017-03-21 09:36:06 +08:00
发现爬虫直接返回假数据怎么破。
tabris17
    20
tabris17  
   2017-03-21 09:48:21 +08:00
太简单了,根本防不住。

要防爬虫,最彻底的就是让程序抓取到内容也无法解读,而人类却能一眼看懂。

我想到的一个办法是字体替换,类似于“ Font Awesome ”,动态生成字体映射文件,人类看到文字是有意义的文字,而程序抓取出来却是“ asdf ”这样无意义的文本。
clino
    21
clino  
   2017-03-21 09:52:13 +08:00
@tabris17 但是这样对搜索引擎是不是就不友好了?
tabris17
    22
tabris17  
   2017-03-21 09:53:57 +08:00
@clino 可搜索引擎不就是一种爬虫么
firefox12
    23
firefox12  
   2017-03-21 09:54:06 +08:00 via iPhone
你用 css 这么复杂,你自己更新就很容易?其次你觉得你的网站有这么值钱的信息让爬虫这么感兴趣?如果真感兴趣,你这个手段也行?
nthhdy
    24
nthhdy  
   2017-03-21 09:58:38 +08:00
@practicer 这个我也遇到了
我觉得去掉一些字和标点用处不大吧?
只是,自然语言处理它的时候,分句分词可能都出问题.
这个手段直接调最终的 DOM 接口就能把它还原出来.
clino
    25
clino  
   2017-03-21 09:59:53 +08:00
@tabris17 所以又防爬虫又对搜索引擎友好的就是不可能的
只有那种数据都不想被搜索到的网站可以用这种方式
qqpkat2
    26
qqpkat2  
   2017-03-21 10:01:22 +08:00
我有程序可以跟浏览器一样的访问网页,你这策略,跟没有一样
mudone
    27
mudone  
   2017-03-21 10:02:37 +08:00
用 headless browser 采集 这些方法都不太管用。
phrack
    28
phrack  
   2017-03-21 10:37:03 +08:00 via Android
攻防就是一个成本与收益的问题。

这些做法会增加爬虫成本,就看爬你网站的收益够不够覆盖成本了~

但是你这是一个个人站,原创内容,那肯定内容不多,就得看你这内容是不是真有料了。
uqf0663
    29
uqf0663  
   2017-03-21 11:03:29 +08:00
那个...你知道 火车头浏览器 吗?
linescape
    30
linescape  
   2017-03-21 11:13:48 +08:00
其实只要用户能看到的东西,就能采集起来,大不了你做成图片我来 OCR 识别嘛,至于什么封 IP ,验证 cookie 什么的,那就用真实浏览器+代理+脚本咯
zuotech
    31
zuotech  
   2017-03-21 11:36:04 +08:00
可以的, 把所有内容弄成动态加载...
dongoo
    32
dongoo  
   2017-03-21 12:02:10 +08:00 via Android
google analytics ,会被 adb 拦截
alwayshere
    33
alwayshere  
OP
   2017-03-21 12:05:32 +08:00
@dongoo 额。。。我的广告同样也被拦截了,我凭啥还让这个人访问我的网页??
byfar
    34
byfar  
   2017-03-21 12:46:56 +08:00
朋友,留下你的原创内容地址 /奸笑
dsg001
    35
dsg001  
   2017-03-21 12:48:07 +08:00
@tabris17 猫眼的一些数据就是这种显示 https://jizhi.im/blog/post/maoyan-anti-crawler
byfar
    36
byfar  
   2017-03-21 13:02:32 +08:00
@dsg001 图像识别什么的是很好玩啊,不过我还是觉得用他说的第一种方法比较快
jiangzhuo
    37
jiangzhuo  
   2017-03-21 13:13:01 +08:00
@gamecreating 但是现在爬虫也用机器学习(主要是内容识别提取方面),将来机器学习人类浏览网站的习惯,模拟人类。最后演变成 AI 大战了。[doge]
practicer
    38
practicer  
   2017-03-21 13:37:33 +08:00
@nthhdy 请教一下怎么还原?我采集就是用来分词的。谢谢哈。
JoyNeop
    39
JoyNeop  
   2017-03-21 13:47:51 +08:00 via iPhone
直接去搜索引擎拿快照,手动斜眼
stormpeach
    40
stormpeach  
   2017-03-21 15:43:08 +08:00
又要支持搜索引擎,又要反爬虫,不是自相矛盾吗
fiht
    41
fiht  
   2017-03-21 16:35:44 +08:00
爬虫反不了的。
我觉得 @jiangzhuo 说得对,爬虫搞到后面就是 AI 的斗争。
现在爬虫界最难搞的算是 Google 的那种点击的验证码和滑动验证码。
以极验为例,就很难搞。后台机器学习出模型,前台的滑动数据给后台验证。验证不过就不让访问( AI 反爬虫)
作为爬虫方要做的就是怎么让机器滑出来的轨迹能被对方接受,也需要用到数据搞机器学习( AI 爬虫)
we3613040
    42
we3613040  
   2017-03-21 16:50:01 +08:00
@fiht 极验证也可以破解。我之前公司就用那个 就被破解了
zaishanfeng
    43
zaishanfeng  
   2017-03-21 16:53:05 +08:00 via Android
没访问 10 个页面弹一个 recaptra
zaishanfeng
    44
zaishanfeng  
   2017-03-21 16:56:14 +08:00 via Android
分析 nginx 日志 对于 pv 过多的 isp ,属于机房的相似 ip 将其加入黑名单,首次访问即弹 recaptra
Technetiumer
    45
Technetiumer  
   2017-03-21 18:56:07 +08:00
对搜索引擎的 IP 段都显示正常纯文本内容,其他 IP 包括用户用楼上的各种牛逼反爬方式,但是需要收集搜索引擎 IP
cdwyd
    46
cdwyd  
   2017-03-21 19:10:46 +08:00 via Android
@practicer
这么巧,刚好有人让采集这个。前后用了好几个小时才找到了通用的方法。
cdwyd
    47
cdwyd  
   2017-03-21 19:19:14 +08:00 via Android
@jininij
其实,真的是一行一行调试的,我就干过。和你的思路差不多,变量名随机,函数名随机,逻辑结构都是随机的。
kaneg
    48
kaneg  
   2017-03-21 19:38:33 +08:00 via iPhone
道高一尺,魔高一丈。除非你一直更新策略,否则没有一劳永逸的对策。最近很火的人工智能自我学习倒是个有可能持续起作用
neurocomputing
    49
neurocomputing  
   2017-03-21 22:42:11 +08:00
这思路并不新 而且也不难实施 但是没有什么实际的用
只要人家想抓 怎么都能抓

内容防盗更多的是需要技术之外的东西
victor
    51
victor  
   2017-03-21 23:05:48 +08:00
不如每次看你的网站,都要发手机验证码好不好
GG668v26Fd55CP5W
    52
GG668v26Fd55CP5W  
   2017-03-21 23:23:40 +08:00 via iPhone
@notgod 很好奇 cdn 这个,具体是怎么做?
mingyun
    53
mingyun  
   2017-03-21 23:42:32 +08:00
@dsg001 猫眼这个厉害了
nazhenhuiyi294
    54
nazhenhuiyi294  
   2017-03-22 09:03:25 +08:00
@friskfly 请教一下,怎么用浏览器爬的
practicer
    55
practicer  
   2017-03-22 11:42:51 +08:00
@crab 谢谢啊
nthhdy
    56
nthhdy  
   2017-03-22 11:49:42 +08:00
@practicer
每个标点或者常用字都是一个 span 标签,用她的 class 来表示是逗号还是句号等.
但 class 名称对应哪个汉字,这个每次都在变.
每一楼有一段 Javascript,uglify 后的.class 名称到汉字的对应关系,就在这里.执行 js 代码的过程中,js 调用了 DOM 接口,把相应的 css rule 插入到该 class 的节点中(设置了 content 属性),汉字就显示出来了.

根据上面的原理,我们不必管它 js 里面做了什么,只要看懂它最终调了哪个接口(我记得好像是 style node 的 insertRule 函数),用自己的函数将它替换,就能得到 class 到真实汉字的对应关系.
大体的思路就是这样.

比较罗嗦,希望我说明白了 :)
dearmymy
    57
dearmymy  
   2017-03-22 12:42:43 +08:00
只要针对你的爬虫都没用
pyengwoei
    58
pyengwoei  
   2020-03-10 00:14:45 +08:00
@darluc 有联系方式吗
关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     3012 人在线   最高记录 6679       Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 27ms UTC 13:14 PVG 21:14 LAX 05:14 JFK 08:14
Do have faith in what you're doing.
ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86