欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-07-09 19:48:00
Python 反爬篇之 ID 混淆 作为爬虫的一方,如果知道了某个站点的数据自增 ID,那么就能轻而易举把整个站点都爬下来。 是不是有点耸人听闻,你去看很多大站例如油管、P 站等,他们都不会轻易把业务的自增 ID 暴露出来,而是用一种可逆的 hash 字符串替代。 其中,最常用的 ID 混淆就是 H ......

python 反爬篇之 id 混淆

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

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

 

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

 

其中,最常用的 id 混淆就是 hashids。

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

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

爬虫与反爬相生相克,道高一丈魔高一尺,如何隐藏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教程。获取方式,私信小编 “ 资料 ”,即可免费获取哦!