很多 URL,比如 SO,都是这种形式: https://stackoverflow.com/questions/53798427/type-mismatch-dependent-mealy-machine ,其中的 53798427 也许就是数据库中的自增 id 主键(不管 SO 是不是,至少我目前是这么干的),直接查询 URL 中的 id,对应数据库中的自增主键 id,查询效率最高。但这样的话,采集者都不用爬列表页了,直接自增 id,一个 while 循环就可以把所有内容也爬完了,所以可不可以生成一个无规律字符串,该字符串 int 或者 char 类型都可以,可以逆向生成数据库主键 id,再在数据库中查询该 id,如何用 php 最简单的实现?
1
binux 2018-12-17 08:50:07 +08:00 via Android
找个块加密算法加密一下
|
2
maggch 2018-12-17 08:53:41 +08:00 via Android
。。。有什么用吗
|
3
curiousjude 2018-12-17 08:54:31 +08:00 3
hashid 可以了解一下,https://hashids.org/
|
4
yidinghe 2018-12-17 09:01:23 +08:00 via Android
ID 干脆不要用数字了,需要序列的地方令起一个字段。
|
5
Vegetable 2018-12-17 09:02:40 +08:00 via Android 1
这个自己随便写一个可还原的混淆方法就完了,但是这也挡不住采集工具啊,反而他还要多跑一层增加服务器压力。
这也是很多网站干脆开放 API 的原因,堵不如疏嘛 |
6
humansjl 2018-12-17 09:03:18 +08:00 1
uuid
|
7
ichubei 2018-12-17 09:04:02 +08:00 via iPhone
可以按页采啊,想采集你怎么都能采集得到……,只要用户能看到,就能采集到。
|
8
lhx2008 2018-12-17 09:05:03 +08:00 via Android
@curiousjude 这个被解密之后不是还可以找规律么。。
|
9
reself 2018-12-17 09:07:00 +08:00 via Android
用散列算法呀,和完整性校验一样的原理
|
10
annielong 2018-12-17 09:13:30 +08:00 1
没用的,会先采集列表,再采集内容页,根本不会管理内容页 url 是什么
|
11
hanshijun 2018-12-17 09:21:17 +08:00 via iPhone
你说的应该是发号器吧?
|
12
beiyu 2018-12-17 09:21:30 +08:00 8
没法从 ID 层面来限制不能被爬;能做的就是对 IP 和 API 接口做时效请求次数限制。不过这样也有办法能破,换个代理 IP 就行了=..=;所以理论上来说爬虫是想到哪就到哪的,和蒙多一个道理。
|
13
earthyan 2018-12-17 09:25:49 +08:00 via iPhone
Hashid
|
14
jetyang 2018-12-17 09:35:46 +08:00
3 楼说的 hashid 我们也在用,轻量、加密串短,试试呗
|
15
shench 2018-12-17 09:39:36 +08:00
除非你没有列表页,不然你用啥我都采的到,我用火车头就够了
|
16
detailyang 2018-12-17 09:43:00 +08:00
十进制转任意( 64 )进制,其中每一位的顺序可以随机打乱
|
17
PerFectTime 2018-12-17 09:49:22 +08:00
GUID?
|
18
tabris17 2018-12-17 09:53:47 +08:00
可以用 skip32 算法加密 32 位整型,不需要存放额外的字段( GUID 或者 HASH ),如果 ID 是 64 位整型,做两次 skip32 操作即可。
|
19
yim7 2018-12-17 09:56:23 +08:00
hash 呗
|
20
ylsc633 2018-12-17 09:58:40 +08:00
一般用 hashid
那么问题来了, 这个 hashid 类似于很多大平台里设置的 uid 字段 这个字段是 id 生成以后生成再插入进去呢 还是 随着这条数据生成时候 一起插入进去呢 |
21
xiaogui 2018-12-17 10:21:38 +08:00
hashid + 1
|
22
ju5t4fun 2018-12-17 10:25:28 +08:00 1
数据库随机插入一些无效的 ID,只要访问这些 ID,直接封 IP
|
27
zbn 2018-12-17 10:33:20 +08:00
用 UUID 呀,oracle 数据库差不多都用的是 uuid
|
28
soulmine 2018-12-17 10:33:58 +08:00 1
搞过三年爬虫的来说说 你这完全没必要 你就算把 URL 搞出花出来 你总不能不让普通人看吧 我只要模仿普通人就行了 啥问题都可以解决 你能做的无非就是不要让人爬的过快而已 反爬是个很深的东西 不是改点 URL 就可以的
|
29
liuxey 2018-12-17 10:38:44 +08:00
对 id 做 hash 后并没有对爬虫增加什么压力,多一次 list 而已
但如果你的 id 会暴露公司业务,那么可以做一次 hash |
30
tofishes 2018-12-17 10:40:17 +08:00 2
如果爬虫真按照你的 id 递增来抓取信息,你反而可以轻易设定反爬虫规则,试问,正常人会在特定时间段依次按 id 访问你的网站吗?若爬虫没按照 id 递增的方式,那你这问题就不是个问题。
|
31
cdwyd 2018-12-17 10:44:44 +08:00 via Android
@soulmine 并不是,混淆了 id 然后列表只显示最新的部分,你就很难抓了,就算抓了心里也会嘀咕到底抓全了没有。反爬不用想的那么多
|
32
redh 2018-12-17 10:45:27 +08:00
#16 10 进制 转多进制的形式是个很好的思路,之前在云栖社也读过一篇这样的文章,建议楼主尝试下。
|
34
soulmine 2018-12-17 10:48:35 +08:00
@cdwyd 很简单 不是最新的你提供给普通用户看么 你只要提供我就能抓到 还有犯啥嘀咕 我把我能看到的所有东西抓完就 ok 普通用户能看到多少我就抓多少
|
35
locoz 2018-12-17 10:53:18 +08:00
twitter 有个叫 SnowFlake 的自增无序唯一 ID 算法,可以了解一下。不过你做这个其实只能隐藏自己的业务量,并不能防止爬虫去爬你的数据,毕竟只要是普通用户能在列表页看到的爬虫就能爬到,而用户看不到的那些其实价值也不会太高。
|
37
strict 2018-12-17 10:57:10 +08:00
其实重点就是找一个可逆的加密算法就可以了。
我一般使用 from itsdangerous import URLSafeSerializer s = URLSafeSerializer('secret-key') sig_okay, payload = s.loads_unsafe(data) |
39
chengxiao 2018-12-17 11:07:15 +08:00
只要你有 url 链接到 就能采集到......说实话 平时用自增字段采集 还真不常见
|
40
xpresslink 2018-12-17 11:24:38 +08:00 1
通常的做法是在数据表再加一个 Unique 列,插入的时候生成一个 uuid,在页面上和 url 都用 uuid 来调用。
但是这对于反爬来说没有什么卵用,爬虫最基本的入门技术水平就是会翻页取 url 列表。 不用数字 id 而用 uuid 的目的主要是为了不让用户猜到数据增量仅此而已。 |
41
VeryZero 2018-12-17 11:32:02 +08:00
如果要从程序上解决的话就用 Hashid
如果要从数据库上解决就用雪花算法 |
42
xpresslink 2018-12-17 11:35:08 +08:00
反爬是个很高深的技术,因为你很难在不影响普通用户正常使用的情况下应用反爬方案。要不然成本太高了,比如应用非常强的 AI 识别用户的行为模式。
目前也有一些相对可行的方案,比如 CSS 动态字体之类的。但是无法根本消除爬虫,通常你只能提高一些爬取难度,限制爬取量之类。 |
43
cdwyd 2018-12-17 11:53:21 +08:00 2
@soulmine 你没看明白我在说什么。
打个比方,v2ex 的列表页只显示最新的 100 条记录,同时 V2EX 的 id 进行了混淆处理。这个时候你就不容易获取到全部内容。 那些不显示的并不是删除了,用户也能看得到,可以从链接从搜索引擎来访问,而你却抓取不到那些有价值的内容。 |
44
soho176 2018-12-17 12:05:30 +08:00
@cdwyd 的确是这样,很多网站的列表页都是没有列出来全部内容,这个时候你仅仅靠列表页根本无法采集完内容,如果是自增的那就完了,分分钟采集完了,可以看出来楼上很多根本没有实际的采集经验。
|
45
ylsc633 2018-12-17 12:21:35 +08:00
|
46
largecat 2018-12-17 12:31:47 +08:00 via Android
没必要,你去看看爬虫怎么爬的,你就会放弃这个想法了。
除非你做一些孤立的页面,如果那样,搜索引擎的爬虫也爬不到了, |
47
Sanko 2018-12-17 12:37:00 +08:00 via Android
sha1 把某几个字段+时间加密,把加密结果存入数据库
|
48
jswh 2018-12-17 12:49:33 +08:00
遇到这种一般会再加个 id,比如论坛的回复就用 user_id + 回复 id,后端参数校验的时候,两个 id 必须 match。如果要求在高一点,加上 timestamp, 再上个 hash。不过,反爬真的没太多用。
|
49
loading 2018-12-17 12:54:21 +08:00 via Android
用 guuid,但是爬虫不需要这样,你肯定有页面有列表的。
|
50
suyuyu 2018-12-17 12:56:04 +08:00
这就能反爬吗
|
51
bioexplore 2018-12-17 13:01:43 +08:00
@beiyu “和蒙多一个道理 ”, 我快要死了
|
52
Chingim 2018-12-17 13:01:57 +08:00 via Android
请教一下,你这个前端反爬是怎么工作的?
爬虫直接访问的后端接口,不访问你前端页面,而后端并没有鼠标轨迹,停留时间等这些信息 |
53
soulmine 2018-12-17 15:57:32 +08:00
@cdwyd 你也没看懂我意思 还拿 v2 这例子来说 用户是怎么看到的 通过点击下一页或者页数 你打开 f12 看一下 里面是不是有用户马上要打开的页面的链接?我既然都有了链接 那么我还不能爬么?这和混淆链接没关系啊 他只要不改这套逻辑 哪怕变成罗马数字甚至变成各种外语也和我无关啊
|
55
xpresslink 2018-12-17 16:30:26 +08:00
|
56
xpresslink 2018-12-17 16:36:53 +08:00
@cdwyd 另外呢是不是新的内容,爬虫是定时检测的,会把链接对应的标题做一个特征串存在数据库中,一比对就可以发现哪些是新的帖子。
我前面都说了,绝对防住是不可能的,就是最差的情况下,用 selenium 直接操作浏览器,你根本就识别不出来是爬虫,只是爬得慢点而已。 |
57
cdwyd 2018-12-17 16:40:10 +08:00
@xpresslink 你赢了
|
58
rebill 2018-12-17 16:46:27 +08:00
Base64 encode 障眼法可以试一下
|
59
ZiShuo 2018-12-17 16:47:57 +08:00
https://hashids.org/ 这个不错,可以加盐。我记得支持的语言挺全的
|
60
binux 2018-12-17 16:56:53 +08:00 via Android
@xpresslink 用户能通过搜索引擎看到,不代表爬虫也能。首先搜索引擎防爬就好,其次这样爬虫效率就低了,最后你知道用户用的什么关键词吗?
你不知道 ID 覆盖率就不全,懂了吗。 |
61
wysnylc 2018-12-17 16:57:55 +08:00
不需要解密:hash
需要解密:任意对称算法即可但是要注意有被破解风险 |
62
luosuosile 2018-12-17 17:13:59 +08:00
@cdwyd 你的意思是爬虫只能爬到网页 html 里面有的,但是旧的已经不在上面了。所以他们只能爬到一部分。
不过旧页面的痕迹百度这些搜索引擎还留着,所以可以通过百度 google 得到那个页面。手动 dog:),我说对了就快夸我:)。 那些他们无法直接通过网页 html 或者 url 分析出来,只能通过搜索引擎,通过搜索引擎又是不科学的做法。 |
63
luosuosile 2018-12-17 17:17:11 +08:00
@cdwyd 不过有的网站能给用户看的数据不能这么做呢,比如漫画网,,只给用户看一部分做不到呢。视频网站做成一块一块增大了爬取难度,又减轻了服务器压力。上个月想把 utb 里面的一个教学视频抓下来但是一时卡住了就不做了:),我都记不得卡在哪里了。。。好像是获取那个视频块的列表有压力
|
64
cdwyd 2018-12-17 17:21:07 +08:00
@luosuosile
通过搜索引擎只能获取到很有限的一部分链接,所以基本上抓取到的也就很有限。 楼上好几个人在那不断强调“只要人看到的,就能抓到”,“只要有链接就能抓到”,却不明白混淆 ID 就是为了不让你获取全部链接。抓取内容的第一步就是先获取到链接,链接都没拿到还爬个毛线啊。 如果还有人要杠,那再举两个例子: 1. 淘宝的绝大多数商品人都能看到,你能把淘宝的绝大多数商品都抓到吗? 2. 搜索引擎那里有海量的链接,你能抓到总量的 0.000000001 吗? |
65
cdwyd 2018-12-17 17:23:02 +08:00
@luosuosile
单篇的漫画肯定给用户看全,但是没有必要把全部的内容到从列表页显示出来。 |
66
zbinlin 2018-12-17 17:56:13 +08:00
应该学习下淘宝,它的反爬可是把正常用户都挡在门外了。
|
67
LichMscy 2018-12-17 18:00:46 +08:00
反爬最牛逼的还是,能正常请求但返回错误信息
ip 花钱可以租,弄个代理池还是很麻烦,可以对可疑 ip 进行标记,然后返回错误信息 |
68
xpresslink 2018-12-17 18:03:36 +08:00
@binux 你说的完全是外行话,搜索引擎本身就是一个大爬虫,去网站上通过页面上的链接来递归爬取信息,并把网页快照等,分类存储在数据库中。
|
69
cdwyd 2018-12-17 18:05:50 +08:00 via Android
@xpresslink
这个真的是班门弄斧了 |
70
xpresslink 2018-12-17 18:32:28 +08:00
通过搜索引擎只能获取到很有限的一部分链接,所以基本上抓取到的也就很有限。
楼上好几个人在那不断强调“只要人看到的,就能抓到”,“只要有链接就能抓到”,却不明白混淆 ID 就是为了不让你获取全部链接。抓取内容的第一步就是先获取到链接,链接都没拿到还爬个毛线啊。 混淆 ID 就是为了不让你获取全部链接,你让用户也不看不到全部链接么?这么说吧我弄个高级爬虫模拟用户行为,你能防住爬虫就要把用户给防了。你让用户都看不到你网站也没有意义了。 如果还有人要杠,那再举两个例子: 1. 淘宝的绝大多数商品人都能看到,你能把淘宝的绝大多数商品都抓到吗? 这个真要和你杠一下,你举的这个栗子不太合适。理论上是可以的,这个做不到主要原因是淘宝的内容是天量,除了 BAT 之外的公司你说谁有那个小公司有钱能买这么多存储空间。 2. 搜索引擎那里有海量的链接,你能抓到总量的 0.000000001 吗? 技术是可以的,搜索引擎都是大爬虫而已,而且都是采集公开信息,只要我有足够资金弄个建个千度难道不抓到 google 的 0.000000001 吗? |
71
cdwyd 2018-12-17 19:21:44 +08:00 via Android
@xpresslink
这种毫无逻辑的讨论就没意思了,我说东你扯西。 |
72
xpresslink 2018-12-17 19:39:12 +08:00
@cdwyd 你才是先把问题带偏了好吧。
说爬虫你扯搜索引擎,要么拿极端情况例子来反驳理论普遍适用性问题。 |
73
373209457 2018-12-17 21:56:04 +08:00
把你网页的内容全部渲染成图片再返回到前端就好了
|
74
singer 2018-12-17 23:46:47 +08:00 via Android
新增一个字段存对外的唯一 id,md5(自增 id+时间随机)
|
75
realpg 2018-12-18 00:47:11 +08:00
自己随便定一个简单的一对一映射关系即可
在前台显示端 以及参数传递进后端时候进行一次变换 |
76
hundan 2018-12-18 00:52:42 +08:00 via Android
搜索引擎这块可以搞,百度之类的爬虫,有公布 ip 地址的,针对非爬虫的 ip 做反爬就行了
|
77
ck65 2018-12-18 00:58:21 +08:00
「发号机」了解一下
|
78
crab 2018-12-18 01:34:31 +08:00
识别出是采集者,别屏蔽,直接给脏数据。
|
79
binux 2018-12-18 04:08:43 +08:00 via Android
|
80
likai 2018-12-18 05:51:50 +08:00 via Android
只要用户正常操作能看到的页面,爬虫都能爬到,这话没毛病,
v2 也一样,只要在这个网站正常浏览能访问到的页面(非搜索跳转),爬虫照样可以爬得到, 本身 200 条数据,你只取一百条数据出来提供浏览,正常用户不通过搜索引擎都浏览不到的当然爬不到 实在不服的,下载个火车头或者自在工坊的去看看人家提取页面连接有哪几种方法,然后重新想想不规则 id 有没有用 |
81
xpresslink 2018-12-18 09:11:59 +08:00
@binux 我们不要放题了。
我们现在要讨论提混淆 id 能不能达到反爬的目的。 我讨论是有个默认前提的,就是普通中小型网站用户可以匿名访问的公开内容,爬虫这方也就是个小公司。 淘宝那种网站和百度那个爬虫不在讨论之列。 |
82
showecho 2018-12-18 09:13:38 +08:00
表示用的 https://hashids.org/
|
83
jinyu121 2018-12-18 09:14:09 +08:00
讲个笑话:
我们项目的文章 URL 参数里面有一个 uuid。然而,我们只用到了中间的某几位。也就是说,如果实际 ID 是 81d7 的话,那么 1a2af2f0-ff03-4f47-81d7-cd5e134055dd 和 8aa0292a-4b36-4e51-81d7-84110b830520 对应的是同一篇文章。 只防枚举,不反爬虫。 |
84
binux 2018-12-18 09:23:52 +08:00 via Android
@xpresslink 混淆 ID 可以防止遍历,用户不能遍历,爬虫也不能
|
85
xpresslink 2018-12-18 09:42:51 +08:00
@binux
我前面都说了, 爬虫就是伪装成一个用户在那里浏览,反爬虫很难的原因就是你不能为了反爬虫把用户也反了吧。 爬虫遍历是通过列表页,或者页和页之间的链接递归访问实现遍历的。 你所说的用户也不能遍历是什么梗,难道那些页面没有在其它任何页面有链接而孤立存在,你也不让用户看? 没错爬虫需要列表页和链接页面,然而用户也是必然需要的。 |
87
binux 2018-12-18 10:52:07 +08:00
@xpresslink 不,用户不需要遍历,例如历史订单,部分页面只在特定用户的历史订单中存在链接。
|
88
xpresslink 2018-12-18 11:06:36 +08:00
@binux 我都说了你跑题了,这个情况不在讨论范围内,你根本就没有理解题意,信息和特定账号绑定的情况这个需要的不是爬虫而是黑客了,你这个资源要是用户用才能专线访问,别说爬虫了就是黑客也没办法。
我讨论是有个默认前提的,就是普通中小型网站用户可以匿名访问的公开内容 |
89
binux 2018-12-18 11:44:47 +08:00
@xpresslink #88 并不是,你知道下架产品的 URL,你依旧能够匿名访问到产品以前的快照信息。
搜索引擎以前索引过,你也能搜索到,但是你就是不能从当前的网站中遍历出来。 |
90
xpresslink 2018-12-18 12:42:27 +08:00
@binux 你说这个有什么意思呢?都下架了的信息根本我爬虫就不需要爬啊,你别总是跑题扯搜索引擎。
你非这么扯,那我爬虫就不能在你一开站就开始爬么,我的库里也存了旧链接啊。 我们讨论的前提说的很清楚了,用户到你的网站来浏览可以匿名访问的公开信息你怎么反爬。 我不想和你讨论了,太累心。就此打住。 |
91
binux 2018-12-18 12:47:20 +08:00
@xpresslink #90 需不需要不是你说的算的,你自己说的算的那种都是小打小闹的玩具项目,谁关心你这个?
|
92
likai 2018-12-18 17:26:21 +08:00 via Android
@xpresslink 心疼兄弟三秒钟。从 url 防爬虫那就是个笑话,除非,普通匿名用户也无法常规操作正常访问。
|