首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  程序员

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

  •  
  •   alwayshere · 305 天前 · 7795 次点击
    这是一个创建于 305 天前的主题,其中的信息可能已经有所发展或是发生改变。

    很多 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 条附言  ·  305 天前
    感谢各位对于反爬的回答,目前是这样的,后端反爬虫完全就是个伪命题,效果绝对不好,我目前自己做的前端反爬措施,比如鼠标轨迹 js 验证,屏幕位置验证,停留时间验证等等,我感觉基本没人能爬的来了,确实反爬效果很好,但唯一的害处就是把搜索引擎爬虫也给搞蒙了,页面上大部分链接全都失效,搜素引擎貌似很不喜欢,所以没办法,我只能降级了,只能稍微给爬虫增加一点点门槛,搜索引擎爬虫这些大爷真得罪不起
    92 回复  |  直到 2018-12-18 17:26:21 +08:00
        1
    binux   305 天前 via Android
    找个块加密算法加密一下
        2
    maggch   305 天前 via Android
    。。。有什么用吗
        3
    curiousjude   305 天前   ♥ 3
    hashid 可以了解一下,https://hashids.org/
        4
    yidinghe   305 天前 via Android
    ID 干脆不要用数字了,需要序列的地方令起一个字段。
        5
    Vegetable   305 天前 via Android   ♥ 1
    这个自己随便写一个可还原的混淆方法就完了,但是这也挡不住采集工具啊,反而他还要多跑一层增加服务器压力。
    这也是很多网站干脆开放 API 的原因,堵不如疏嘛
        6
    humansjl   305 天前   ♥ 1
    uuid
        7
    ichubei   305 天前 via iPhone
    可以按页采啊,想采集你怎么都能采集得到……,只要用户能看到,就能采集到。
        8
    lhx2008   305 天前 via Android
    @curiousjude 这个被解密之后不是还可以找规律么。。
        9
    reself   305 天前 via Android
    用散列算法呀,和完整性校验一样的原理
        10
    annielong   305 天前   ♥ 1
    没用的,会先采集列表,再采集内容页,根本不会管理内容页 url 是什么
        11
    hanshijun   305 天前 via iPhone
    你说的应该是发号器吧?
        12
    beiyu   305 天前   ♥ 8
    没法从 ID 层面来限制不能被爬;能做的就是对 IP 和 API 接口做时效请求次数限制。不过这样也有办法能破,换个代理 IP 就行了=..=;所以理论上来说爬虫是想到哪就到哪的,和蒙多一个道理。
        13
    earthyan   305 天前 via iPhone
    Hashid
        14
    jetyang   305 天前
    3 楼说的 hashid 我们也在用,轻量、加密串短,试试呗
        15
    shench   305 天前
    除非你没有列表页,不然你用啥我都采的到,我用火车头就够了
        16
    detailyang   305 天前
    十进制转任意( 64 )进制,其中每一位的顺序可以随机打乱
        17
    PerFectTime   305 天前
    GUID?
        18
    tabris17   305 天前
    可以用 skip32 算法加密 32 位整型,不需要存放额外的字段( GUID 或者 HASH ),如果 ID 是 64 位整型,做两次 skip32 操作即可。
        19
    yim7   305 天前
    hash 呗
        20
    ylsc633   305 天前
    一般用 hashid

    那么问题来了, 这个 hashid 类似于很多大平台里设置的 uid 字段

    这个字段是 id 生成以后生成再插入进去呢 还是 随着这条数据生成时候 一起插入进去呢
        21
    xiaogui   305 天前
    hashid + 1
        22
    ju5t4fun   305 天前   ♥ 1
    数据库随机插入一些无效的 ID,只要访问这些 ID,直接封 IP
        23
    lockiee   305 天前
    @ylsc633 我之前的 hashid 是根据主键。。所以先生成记录再更新了。。
        24
    cdwyd   305 天前 via Android   ♥ 1
    @ylsc633 我都是动态的生成和验证并不入库
        25
    cdwyd   305 天前 via Android
    @lockiee 这个不做存储也没关系啊,浪费点 cpu 进行解码编码而已
        26
    soulmine   305 天前
    @ju5t4fun 现在爬虫谁手上还没个代理池?你这没用啊 而且万一真实用户误碰到了呢 直接封你是嫌用户太多?
        27
    zbn   305 天前
    用 UUID 呀,oracle 数据库差不多都用的是 uuid
        28
    soulmine   305 天前   ♥ 1
    搞过三年爬虫的来说说 你这完全没必要 你就算把 URL 搞出花出来 你总不能不让普通人看吧 我只要模仿普通人就行了 啥问题都可以解决 你能做的无非就是不要让人爬的过快而已 反爬是个很深的东西 不是改点 URL 就可以的
        29
    liuxey   305 天前
    对 id 做 hash 后并没有对爬虫增加什么压力,多一次 list 而已
    但如果你的 id 会暴露公司业务,那么可以做一次 hash
        30
    tofishes   305 天前   ♥ 2
    如果爬虫真按照你的 id 递增来抓取信息,你反而可以轻易设定反爬虫规则,试问,正常人会在特定时间段依次按 id 访问你的网站吗?若爬虫没按照 id 递增的方式,那你这问题就不是个问题。
        31
    cdwyd   305 天前 via Android
    @soulmine 并不是,混淆了 id 然后列表只显示最新的部分,你就很难抓了,就算抓了心里也会嘀咕到底抓全了没有。反爬不用想的那么多
        32
    redh   305 天前
    #16 10 进制 转多进制的形式是个很好的思路,之前在云栖社也读过一篇这样的文章,建议楼主尝试下。
        33
    tearslee   305 天前
    @beiyu 蒙多没装备之前 哪儿都去不了
        34
    soulmine   305 天前
    @cdwyd 很简单 不是最新的你提供给普通用户看么 你只要提供我就能抓到 还有犯啥嘀咕 我把我能看到的所有东西抓完就 ok 普通用户能看到多少我就抓多少
        35
    locoz   305 天前
    twitter 有个叫 SnowFlake 的自增无序唯一 ID 算法,可以了解一下。不过你做这个其实只能隐藏自己的业务量,并不能防止爬虫去爬你的数据,毕竟只要是普通用户能在列表页看到的爬虫就能爬到,而用户看不到的那些其实价值也不会太高。
        36
    cdwyd   305 天前 via Android
    @soulmine 这样你最多也就只能抓取到从你开始抓那天开始发布的新内容。
        37
    strict   305 天前
    其实重点就是找一个可逆的加密算法就可以了。
    我一般使用
    from itsdangerous import URLSafeSerializer
    s = URLSafeSerializer('secret-key')
    sig_okay, payload = s.loads_unsafe(data)
        38
    soulmine   305 天前
    @cdwyd 我不是都说了么 你之前的内容不展示了?删除了?那就不是我爬虫的问题了啊 普通人也看不到啊
        39
    chengxiao   305 天前
    只要你有 url 链接到 就能采集到......说实话 平时用自增字段采集 还真不常见
        40
    xpresslink   305 天前   ♥ 1
    通常的做法是在数据表再加一个 Unique 列,插入的时候生成一个 uuid,在页面上和 url 都用 uuid 来调用。
    但是这对于反爬来说没有什么卵用,爬虫最基本的入门技术水平就是会翻页取 url 列表。
    不用数字 id 而用 uuid 的目的主要是为了不让用户猜到数据增量仅此而已。
        41
    VeryZero   305 天前
    如果要从程序上解决的话就用 Hashid
    如果要从数据库上解决就用雪花算法
        42
    xpresslink   305 天前
    反爬是个很高深的技术,因为你很难在不影响普通用户正常使用的情况下应用反爬方案。要不然成本太高了,比如应用非常强的 AI 识别用户的行为模式。

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

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

    那些不显示的并不是删除了,用户也能看得到,可以从链接从搜索引擎来访问,而你却抓取不到那些有价值的内容。
    你这句话有低级错误。只要是用户能看到的爬虫就能爬得到。只要有链接就得有页面。
        56
    xpresslink   305 天前
    @cdwyd 另外呢是不是新的内容,爬虫是定时检测的,会把链接对应的标题做一个特征串存在数据库中,一比对就可以发现哪些是新的帖子。
    我前面都说了,绝对防住是不可能的,就是最差的情况下,用 selenium 直接操作浏览器,你根本就识别不出来是爬虫,只是爬得慢点而已。
        57
    cdwyd   305 天前
    @xpresslink 你赢了
        58
    rebill   305 天前
    Base64 encode 障眼法可以试一下
        59
    ZiShuo   305 天前
    https://hashids.org/ 这个不错,可以加盐。我记得支持的语言挺全的
        60
    binux   305 天前 via Android
    @xpresslink 用户能通过搜索引擎看到,不代表爬虫也能。首先搜索引擎防爬就好,其次这样爬虫效率就低了,最后你知道用户用的什么关键词吗?
    你不知道 ID 覆盖率就不全,懂了吗。
        61
    wysnylc   305 天前
    不需要解密:hash
    需要解密:任意对称算法即可但是要注意有被破解风险
        62
    luosuosile   305 天前
    @cdwyd 你的意思是爬虫只能爬到网页 html 里面有的,但是旧的已经不在上面了。所以他们只能爬到一部分。
    不过旧页面的痕迹百度这些搜索引擎还留着,所以可以通过百度 google 得到那个页面。手动 dog:),我说对了就快夸我:)。
    那些他们无法直接通过网页 html 或者 url 分析出来,只能通过搜索引擎,通过搜索引擎又是不科学的做法。
        63
    luosuosile   305 天前
    @cdwyd 不过有的网站能给用户看的数据不能这么做呢,比如漫画网,,只给用户看一部分做不到呢。视频网站做成一块一块增大了爬取难度,又减轻了服务器压力。上个月想把 utb 里面的一个教学视频抓下来但是一时卡住了就不做了:),我都记不得卡在哪里了。。。好像是获取那个视频块的列表有压力
        64
    cdwyd   305 天前
    @luosuosile
    通过搜索引擎只能获取到很有限的一部分链接,所以基本上抓取到的也就很有限。

    楼上好几个人在那不断强调“只要人看到的,就能抓到”,“只要有链接就能抓到”,却不明白混淆 ID 就是为了不让你获取全部链接。抓取内容的第一步就是先获取到链接,链接都没拿到还爬个毛线啊。

    如果还有人要杠,那再举两个例子:
    1. 淘宝的绝大多数商品人都能看到,你能把淘宝的绝大多数商品都抓到吗?
    2. 搜索引擎那里有海量的链接,你能抓到总量的 0.000000001 吗?
        65
    cdwyd   305 天前
    @luosuosile
    单篇的漫画肯定给用户看全,但是没有必要把全部的内容到从列表页显示出来。
        66
    zbinlin   305 天前
    应该学习下淘宝,它的反爬可是把正常用户都挡在门外了。
        67
    LichMscy   305 天前
    反爬最牛逼的还是,能正常请求但返回错误信息

    ip 花钱可以租,弄个代理池还是很麻烦,可以对可疑 ip 进行标记,然后返回错误信息
        68
    xpresslink   305 天前
    @binux 你说的完全是外行话,搜索引擎本身就是一个大爬虫,去网站上通过页面上的链接来递归爬取信息,并把网页快照等,分类存储在数据库中。
        69
    cdwyd   305 天前 via Android
    @xpresslink
    这个真的是班门弄斧了
        70
    xpresslink   305 天前
    通过搜索引擎只能获取到很有限的一部分链接,所以基本上抓取到的也就很有限。

    楼上好几个人在那不断强调“只要人看到的,就能抓到”,“只要有链接就能抓到”,却不明白混淆 ID 就是为了不让你获取全部链接。抓取内容的第一步就是先获取到链接,链接都没拿到还爬个毛线啊。

    混淆 ID 就是为了不让你获取全部链接,你让用户也不看不到全部链接么?这么说吧我弄个高级爬虫模拟用户行为,你能防住爬虫就要把用户给防了。你让用户都看不到你网站也没有意义了。


    如果还有人要杠,那再举两个例子:
    1. 淘宝的绝大多数商品人都能看到,你能把淘宝的绝大多数商品都抓到吗?
    这个真要和你杠一下,你举的这个栗子不太合适。理论上是可以的,这个做不到主要原因是淘宝的内容是天量,除了 BAT 之外的公司你说谁有那个小公司有钱能买这么多存储空间。

    2. 搜索引擎那里有海量的链接,你能抓到总量的 0.000000001 吗?
    技术是可以的,搜索引擎都是大爬虫而已,而且都是采集公开信息,只要我有足够资金弄个建个千度难道不抓到 google 的 0.000000001 吗?
        71
    cdwyd   305 天前 via Android
    @xpresslink
    这种毫无逻辑的讨论就没意思了,我说东你扯西。
        72
    xpresslink   304 天前
    @cdwyd 你才是先把问题带偏了好吧。
    说爬虫你扯搜索引擎,要么拿极端情况例子来反驳理论普遍适用性问题。
        73
    373209457   304 天前
    把你网页的内容全部渲染成图片再返回到前端就好了
        74
    singer   304 天前 via Android
    新增一个字段存对外的唯一 id,md5(自增 id+时间随机)
        75
    realpg   304 天前
    自己随便定一个简单的一对一映射关系即可

    在前台显示端 以及参数传递进后端时候进行一次变换
        76
    hundan   304 天前 via Android
    搜索引擎这块可以搞,百度之类的爬虫,有公布 ip 地址的,针对非爬虫的 ip 做反爬就行了
        77
    ck65   304 天前
    「发号机」了解一下
        78
    crab   304 天前
    识别出是采集者,别屏蔽,直接给脏数据。
        79
    binux   304 天前 via Android
    @xpresslink 搜索引擎是从网站上线第一天起就开始爬了,而你不是。
    存储是爬取过程中最不值钱的东西。

    爬虫,包括搜索引擎和定向爬虫,我不敢说全球 top,在国内我是专家级的。
        80
    likai   304 天前 via Android
    只要用户正常操作能看到的页面,爬虫都能爬到,这话没毛病,
    v2 也一样,只要在这个网站正常浏览能访问到的页面(非搜索跳转),爬虫照样可以爬得到,

    本身 200 条数据,你只取一百条数据出来提供浏览,正常用户不通过搜索引擎都浏览不到的当然爬不到

    实在不服的,下载个火车头或者自在工坊的去看看人家提取页面连接有哪几种方法,然后重新想想不规则 id 有没有用
        81
    xpresslink   304 天前
    @binux 我们不要放题了。
    我们现在要讨论提混淆 id 能不能达到反爬的目的。
    我讨论是有个默认前提的,就是普通中小型网站用户可以匿名访问的公开内容,爬虫这方也就是个小公司。
    淘宝那种网站和百度那个爬虫不在讨论之列。
        82
    showecho   304 天前
        83
    jinyu121   304 天前
    讲个笑话:
    我们项目的文章 URL 参数里面有一个 uuid。然而,我们只用到了中间的某几位。也就是说,如果实际 ID 是 81d7 的话,那么
    1a2af2f0-ff03-4f47-81d7-cd5e134055dd 和 8aa0292a-4b36-4e51-81d7-84110b830520
    对应的是同一篇文章。
    只防枚举,不反爬虫。
        84
    binux   304 天前 via Android
    @xpresslink 混淆 ID 可以防止遍历,用户不能遍历,爬虫也不能
        85
    xpresslink   304 天前
    @binux
    我前面都说了, 爬虫就是伪装成一个用户在那里浏览,反爬虫很难的原因就是你不能为了反爬虫把用户也反了吧。
    爬虫遍历是通过列表页,或者页和页之间的链接递归访问实现遍历的。
    你所说的用户也不能遍历是什么梗,难道那些页面没有在其它任何页面有链接而孤立存在,你也不让用户看?
    没错爬虫需要列表页和链接页面,然而用户也是必然需要的。
        86
    pkoukk   304 天前
    @binux 混淆只是加大了遍历难度和复杂度,还没有到不能这个程度
        87
    binux   304 天前
    @xpresslink 不,用户不需要遍历,例如历史订单,部分页面只在特定用户的历史订单中存在链接。
        88
    xpresslink   304 天前
    @binux 我都说了你跑题了,这个情况不在讨论范围内,你根本就没有理解题意,信息和特定账号绑定的情况这个需要的不是爬虫而是黑客了,你这个资源要是用户用才能专线访问,别说爬虫了就是黑客也没办法。

    我讨论是有个默认前提的,就是普通中小型网站用户可以匿名访问的公开内容
        89
    binux   304 天前
    @xpresslink #88 并不是,你知道下架产品的 URL,你依旧能够匿名访问到产品以前的快照信息。
    搜索引擎以前索引过,你也能搜索到,但是你就是不能从当前的网站中遍历出来。
        90
    xpresslink   304 天前
    @binux 你说这个有什么意思呢?都下架了的信息根本我爬虫就不需要爬啊,你别总是跑题扯搜索引擎。
    你非这么扯,那我爬虫就不能在你一开站就开始爬么,我的库里也存了旧链接啊。

    我们讨论的前提说的很清楚了,用户到你的网站来浏览可以匿名访问的公开信息你怎么反爬。

    我不想和你讨论了,太累心。就此打住。
        91
    binux   304 天前
    @xpresslink #90 需不需要不是你说的算的,你自己说的算的那种都是小打小闹的玩具项目,谁关心你这个?
        92
    likai   304 天前 via Android
    @xpresslink 心疼兄弟三秒钟。从 url 防爬虫那就是个笑话,除非,普通匿名用户也无法常规操作正常访问。
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2565 人在线   最高记录 5043   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 28ms · UTC 11:27 · PVG 19:27 · LAX 04:27 · JFK 07:27
    ♥ Do have faith in what you're doing.