为防采集,如何将 URL 中的自增数字 id 换成无规律字符串?

2018-12-17 08:46:03 +08:00
 alwayshere

很多 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 最简单的实现?

12371 次点击
所在节点    程序员
92 条回复
VeryZero
2018-12-17 11:32:02 +08:00
如果要从程序上解决的话就用 Hashid
如果要从数据库上解决就用雪花算法
xpresslink
2018-12-17 11:35:08 +08:00
反爬是个很高深的技术,因为你很难在不影响普通用户正常使用的情况下应用反爬方案。要不然成本太高了,比如应用非常强的 AI 识别用户的行为模式。

目前也有一些相对可行的方案,比如 CSS 动态字体之类的。但是无法根本消除爬虫,通常你只能提高一些爬取难度,限制爬取量之类。
cdwyd
2018-12-17 11:53:21 +08:00
@soulmine 你没看明白我在说什么。
打个比方,v2ex 的列表页只显示最新的 100 条记录,同时 V2EX 的 id 进行了混淆处理。这个时候你就不容易获取到全部内容。
那些不显示的并不是删除了,用户也能看得到,可以从链接从搜索引擎来访问,而你却抓取不到那些有价值的内容。
soho176
2018-12-17 12:05:30 +08:00
@cdwyd 的确是这样,很多网站的列表页都是没有列出来全部内容,这个时候你仅仅靠列表页根本无法采集完内容,如果是自增的那就完了,分分钟采集完了,可以看出来楼上很多根本没有实际的采集经验。
ylsc633
2018-12-17 12:21:35 +08:00
@lockiee 我曾有个项目也是这么弄的, uid 就是 hash ID 生成的,所以必须先创建,然后再更新.. 感觉比较繁琐.. 对数据库研究不是特别深, 要是知道 创建时候 的 ID 是多少 直接一起插入就好了
@cdwyd 动态生成和验证 感觉太消耗性能了,特别是量比较大的时候,每个都得 解码... 当然了,我只是感觉.并无实际测试
largecat
2018-12-17 12:31:47 +08:00
没必要,你去看看爬虫怎么爬的,你就会放弃这个想法了。

除非你做一些孤立的页面,如果那样,搜索引擎的爬虫也爬不到了,
Sanko
2018-12-17 12:37:00 +08:00
sha1 把某几个字段+时间加密,把加密结果存入数据库
jswh
2018-12-17 12:49:33 +08:00
遇到这种一般会再加个 id,比如论坛的回复就用 user_id + 回复 id,后端参数校验的时候,两个 id 必须 match。如果要求在高一点,加上 timestamp, 再上个 hash。不过,反爬真的没太多用。
loading
2018-12-17 12:54:21 +08:00
用 guuid,但是爬虫不需要这样,你肯定有页面有列表的。
suyuyu
2018-12-17 12:56:04 +08:00
这就能反爬吗
bioexplore
2018-12-17 13:01:43 +08:00
@beiyu “和蒙多一个道理 ”, 我快要死了
Chingim
2018-12-17 13:01:57 +08:00
请教一下,你这个前端反爬是怎么工作的?
爬虫直接访问的后端接口,不访问你前端页面,而后端并没有鼠标轨迹,停留时间等这些信息
soulmine
2018-12-17 15:57:32 +08:00
@cdwyd 你也没看懂我意思 还拿 v2 这例子来说 用户是怎么看到的 通过点击下一页或者页数 你打开 f12 看一下 里面是不是有用户马上要打开的页面的链接?我既然都有了链接 那么我还不能爬么?这和混淆链接没关系啊 他只要不改这套逻辑 哪怕变成罗马数字甚至变成各种外语也和我无关啊
cdwyd
2018-12-17 16:06:35 +08:00
@soulmine
你这三年的爬虫经验算是白瞎了,这种理解能力怎么能 get 用户的真实需求
xpresslink
2018-12-17 16:30:26 +08:00
@cdwyd

那些不显示的并不是删除了,用户也能看得到,可以从链接从搜索引擎来访问,而你却抓取不到那些有价值的内容。
你这句话有低级错误。只要是用户能看到的爬虫就能爬得到。只要有链接就得有页面。
xpresslink
2018-12-17 16:36:53 +08:00
@cdwyd 另外呢是不是新的内容,爬虫是定时检测的,会把链接对应的标题做一个特征串存在数据库中,一比对就可以发现哪些是新的帖子。
我前面都说了,绝对防住是不可能的,就是最差的情况下,用 selenium 直接操作浏览器,你根本就识别不出来是爬虫,只是爬得慢点而已。
cdwyd
2018-12-17 16:40:10 +08:00
@xpresslink 你赢了
rebill
2018-12-17 16:46:27 +08:00
Base64 encode 障眼法可以试一下
ZiShuo
2018-12-17 16:47:57 +08:00
https://hashids.org/ 这个不错,可以加盐。我记得支持的语言挺全的
binux
2018-12-17 16:56:53 +08:00
@xpresslink 用户能通过搜索引擎看到,不代表爬虫也能。首先搜索引擎防爬就好,其次这样爬虫效率就低了,最后你知道用户用的什么关键词吗?
你不知道 ID 覆盖率就不全,懂了吗。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/518127

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX