Python 反爬篇之 ID 混淆

作为爬虫的一方,如果知道了某个站点的数据自增 ID,那么就能轻而易举把整个站点都爬下来。

是不是有点耸人听闻,你去看很多大站例如油管、P 站等,他们都不会轻易把业务的自增 ID 暴露出来,而是用一种可逆的 hash 字符串替代。

其中,最常用的 ID 混淆就是 Hashids。

Hashids 是一个小型的开放源代码库,可以将数字生成很短的、唯一的、非顺序的字符 ID。

例如可以数字 347 转换为 “yr8” 字符串,你还可以将字符串 ID 进行解码恢复成数字。

下面就来看看咋使用的

安装

pip install hashids

怎么使用

首选初始化一个 hashids 实例

from hashids import Hashids
hashids = Hashids()
 

编码(加密)

>>> id = hashids.encode(1)
>>> id
'jR'
>>> hashids.encode(123)
'Mj3'
>>> hashids.encode(1234)
'1lj'
>>> hashids.encode(12345)
'j0gW'
>>> hashids.encode(123454)
'v27AV'
 

生成的字符 ID 长度与和数值大小有关。

解码(解密)

>>> num = hashids.decode('jR')
>>> num
(1,)
>>> hashids.decode("Mj3")
(123,)
>>> hashids.decode("1lj")
(1234,)
>>> hashids.decode("j0gW")
(12345,)
>>> hashids.decode("v27AV")
(123454,)
 

解码后返回是一个元组。

如果你解码一个随机的字符串 ID,不一定能恢复成数字,此时会返回空元组。

>>> hashids.decode("werwer")
()

因为 hashid 可逆,所以别人拿到字符串后也能根据字符串 ID 反推出数字,因此,为了避免别人猜出原始数字 ID,我们在编码的时候可以指定盐值。

理论上,只要盐值不被泄露,被破解的难度就加大了很多。

指定盐值

初始化 hashids 时候,可以指定盐值

>>> hashids = Hashids(salt="XXXX")
>>> hashids.encode(123)
'1LY'
>>> hashids.decode("1LY")
(123,)

同样的数字使用不同的盐值编码得到的字符串是不同的,别人就无法猜出原始 ID 是多少了。

限制 hash 长度

默认情况下,数字越小,编码生成的字符串也比较短,为了将不同大小的数值转换为统一长度的字符串,在初始化 hashids 的时候,可以指定 hash 的最小长度

>>> hashids = Hashids(salt="XXXX", min_length=10)
>>> hashids.encode(123)
'PyNd1LYK3G'

限制 hash 的字符种类

如果你不希望 hash 中有大写字母,那么可以在初始化的时候,指定 hash 字符串的范围。

例如我们可以指定为所有的小写字母

>>> hashids = Hashids(alphabet="abcdefghigklmopkrst")
>>> hashids.encode(123)
'ggdo'

需要注意,alphabet 至少要指定 16 个以上的不同字符。

hashids 简单却实用,是避免业务 ID 外露办法之一

如果你处于想学Python或者正在学习Python,Python的教程不少了吧,但是是最新的吗?说不定你学了可能是两年前人家就学过的内容,在这小编分享一波2020最新的Python教程。获取方式,私信小编 “ 资料 ”,即可免费获取哦!

爬虫与反爬相生相克,道高一丈魔高一尺,如何隐藏ID(附代码)的更多相关文章

  1. 抖音爬虫教程,python爬虫采集反爬策略

    一.爬虫与反爬简介 爬虫就是我们利用某种程序代替人工批量读取.获取网站上的资料信息.而反爬则是跟爬虫的对立面,是竭尽全力阻止非人为的采集网站信息,二者相生相克,水火不容,到目前为止大部分的网站都还是可 ...

  2. 第三百四十五节,Python分布式爬虫打造搜索引擎Scrapy精讲—爬虫和反爬的对抗过程以及策略—scrapy架构源码分析图

    第三百四十五节,Python分布式爬虫打造搜索引擎Scrapy精讲—爬虫和反爬的对抗过程以及策略—scrapy架构源码分析图 1.基本概念 2.反爬虫的目的 3.爬虫和反爬的对抗过程以及策略 scra ...

  3. 二十四 Python分布式爬虫打造搜索引擎Scrapy精讲—爬虫和反爬的对抗过程以及策略—scrapy架构源码分析图

    1.基本概念 2.反爬虫的目的 3.爬虫和反爬的对抗过程以及策略 scrapy架构源码分析图

  4. python爬虫--爬虫与反爬

    爬虫与反爬 爬虫:自动获取网站数据的程序,关键是批量的获取. 反爬虫:使用技术手段防止爬虫程序的方法 误伤:反爬技术将普通用户识别为爬虫,从而限制其访问,如果误伤过高,反爬效果再好也不能使用(例如封i ...

  5. Python爬虫入门教程 61-100 写个爬虫碰到反爬了,动手破坏它!

    python3爬虫遇到了反爬 当你兴冲冲的打开一个网页,发现里面的资源好棒,能批量下载就好了,然后感谢写个爬虫down一下,结果,一顿操作之后,发现网站竟然有反爬措施,尴尬了. 接下来的几篇文章,我们 ...

  6. python高级—— 从趟过的坑中聊聊爬虫、反爬以及、反反爬,附送一套高级爬虫试题

    前言: 时隔数月,我终于又更新博客了,然而,在这期间的粉丝数也就跟着我停更博客而涨停了,唉 是的,我改了博客名,不知道为什么要改,就感觉现在这个名字看起来要洋气一点. 那么最近到底咋不更新博客了呢?说 ...

  7. Python爬虫实战——反爬策略之模拟登录【CSDN】

    在<Python爬虫实战-- Request对象之header伪装策略>中,我们就已经讲到:=="在header当中,我们经常会添加两个参数--cookie 和 User-Age ...

  8. python爬虫--cookie反爬处理

    Cookies的处理 作用 保存客户端的相关状态 在爬虫中如果遇到了cookie的反爬如何处理? 手动处理 在抓包工具中捕获cookie,将其封装在headers中 应用场景:cookie没有有效时长 ...

  9. Python爬虫-字体反爬-猫眼国内票房榜

    偶然间知道到了字体反爬这个东西, 所以决定了解一下. 目标:  https://maoyan.com/board/1 问题: 类似下图中的票房数字无法获取, 直接复制粘贴的话会显示 □ 等无法识别的字 ...

随机推荐

  1. nim博弈 LightOJ - 1253

    主要是写一下nim博弈的理解,这个题有点奇怪,不知道为什么判断奇偶性,如果有大佬知道还请讲解一下. //nim博弈 //a[0]~a[i] 异或结果为k 若k=0 则为平衡态 否则为非平衡态 //平衡 ...

  2. JSP学习笔记(二)

    JSP内置对象 request对象 response对象 session对象 application对象 out对象 有些对象不用声明就可以在JSP页面的Java程序片和表达式部分使用,这就是JSP的 ...

  3. python—异常处理try

    写代码的时候会遇到各种各样的异常,那么代码就不会继续往下走了.比如说10除以0是错误的,因为除数不能为零学会捕捉异常,在异常出现的时候我们要做什么操作. 捕捉异常 d={} #例如定义字典 try: ...

  4. elasticsearch报Fielddata is disabled on text fields by default

    我刚玩elk没几天,今天启动kibana之后执行查询看见elasticsearch报了一个错误 Caused by: java.lang.IllegalArgumentException: Field ...

  5. springBoot集成zuul路由forward,设置setSendZuulResponse无效

    正确书写方式如下: RequestContext ctx = RequestContext.getCurrentContext(); ctx.setSendZuulResponse(false); c ...

  6. memcached-tool 工具

    perl memcached-tool server_ip:port stats 输出说明: pid memcache服务器的进程ID uptime 服务器已经运行的秒数 time 服务器当前的uni ...

  7. Python 1基础语法三(变量和标识符的区别)

    一.字面量: 就是一个一个的值,如1.2.3.‘world’,就是它自己本身表达的字面值.字面意思,在程序中可以直接使用. 二.变量(variable): 可以用来保存字面量,变量本身没有任何意思:如 ...

  8. String 对象-->判断是否相等

    1.定义和用法 == 值相等 === 绝对相等(值和类型都相等) 举例: var str = '8' var str1 = 8 console.log(str == str1) console.log ...

  9. .NET Core 3 WPF MVVM框架 Prism系列之导航系统

    本文将介绍如何在.NET Core3环境下使用MVVM框架Prism基于区域Region的导航系统 在讲解Prism导航系统之前,我们先来看看一个例子,我在之前的demo项目创建一个登录界面: 我们看 ...

  10. Python操作rabbitmq系列(一)

    从本文开始,接下来的内容,我们将讨论rabbitmq的相关功能.我的这些文章,最终是要实现一个项目(具体是什么暂不透露).前面每一篇,都是在为这个系统做准备.rabbitmq,是我们这个项目的关键部分 ...