【爬虫与反爬】记一次网址编码研究

相爱相杀的爬虫与反爬工程师啊……愿你们和谐相处。

前些日子写爬虫时遇到一个比较奇怪的编码,是构造目标网址的一个组成部分,我更倾向于说是编码而不是加密,虽然的确有点加密的意思。当时算是一个绕不开的需求,所以费了很大功夫研究了出来。有些时候网站的前端、后端工程师会用尽办法反爬,而写爬虫的人又要想尽办法反反爬,真可谓是相爱相杀了。尤其是在编码(加密)这件事上,我随口胡诌一个编码过程,就很难逆向推导出来,这次有点运气成分,也有点规律可寻,所以记录下来给大家。

为了让大家专注于编码本身,我就不把真实网址放出来了。大家只需要知道网址构成大概是这个样子

https://www.wtf.com/N3V5bw==.html

这是最终的一个目标页,后面的N3V5bw==在这里的含义是36672。由于数据量比较大,从列表页没办法抓取到所有的href,所以需要自己构造网址,而网址又不可能是没有规律的,想办法观察到了36672(可以理解成一个资源的ID)和N3V5bw==的对应关系。

N3V5bw==这样的形式,很容易判断出是base64编码,于是base64解码,得到7uyo,没有什么明显思路,显然还做了其他操作(后来知道是自己经验不足,离答案挺近的)。

然后手动获取到了一些一一对应关系。

id

base64

base64解码

1

YQ

a

2

aw

k

3

dQ

u

4

MTQ=

14

5

MWU=

1e

6

MW8=

1o

7

MXk=

1y

8

Mjg=

28

9

Mmk=

2i

10

MnM=

2s

11

MzI=

32

12

M2M=

3c

13

M20=

3m

到这一步还是没什么思路,只能又想办法多获取了一些对应关系(前面提到了没有统一的入口,这一步也费了一些周折)

id

base64

base64解码

1

YQ==

a

2

aw==

k

3

dQ==

u

4

MTQ=

14

5

MWU=

1e

6

MW8=

1o

7

MXk=

1y

8

Mjg=

28

9

Mmk=

2i

10

MnM=

2s

11

MzI=

32

12

M2M=

3c

13

M20=

3m

14

M3c=

3w

15

NDY=

46

16

NGc=

4g

17

NHE=

4q

18

NTA=

50

19

NWE=

5a

20

NWs=

5k

21

NXU=

5u

22

NjQ=

64

23

NmU=

6e

24

Nm8=

6o

25

Nnk=

6y

26

Nzg=

78

27

N2k=

7i

28

N3M=

7s

29

ODI=

82

30

OGM=

8c

现在的主要考虑是如何从第一列到第三列。

刚开始我观察第三列的时候看到最后一位是18循环的,第一位有点类似4循环,还以为有什么mod18的套路在里面,后面看到组成是0~9和a~z(一共36),突然猜测会不会是36进制…

于是把ID转36进制。

ID

ID转36进制

解码结果

解码结果36进制转10进制

1

1

a

10

2

2

k

20

3

3

u

30

4

4

14

40

5

5

1e

50

6

6

1o

60

7

7

1y

70

8

8

28

80

9

9

2i

90

10

a

2s

100

11

b

32

110

12

c

3c

120

13

d

3m

130

14

e

3w

140

15

f

46

150

16

g

4g

160

17

h

4q

170

18

i

50

180

19

j

5a

190

20

k

5k

200

21

l

5u

210

22

m

64

220

23

n

6e

230

24

o

6o

240

25

p

6y

250

26

q

78

260

27

r

7i

270

28

s

7s

280

29

t

82

290

30

u

8c

300

于是结果就比较明显了。

所用到的规则为:ID*10转36进制后进行base64编码。

事后反思了一下,主要是极少见到36进制,所以从一开始就没往那边动心思,直到看到了很多数据以后觉得18循环,跟常见的4,8,16没关系,才猜测到36进制上面。

这也算是一点小记录和小经验。 还真是设计规则的人随便胡诌一个规则,破解规则的人就要费很大力气了…… 最后的代码是这么写的:

import base64

def baseN(num, b):
    return ((num == 0) and "0") or (baseN(num // b, b).lstrip("0") + "0123456789abcdefghijklmnopqrstuvwxyz"[num % b])

def wtf(num):
    return base64.b64encode(baseN(num * 10, 36).encode()).decode()

原文发布于微信公众号 - 不二小段(rose-fun)

原文发表时间:2017-11-28

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏青玉伏案

设计模式(一):“穿越火线”中的“策略模式”(Strategy Pattern)

在前段时间呢陆陆续续的更新了一系列关于重构的文章。在重构我们既有的代码时,往往会用到设计模式。在之前重构系列的博客中,我们在重构时用到了“工厂模式”、“策略模式...

23260
来自专栏数据小魔方

左手用R右手Python系列17——CSS表达式与网页解析

上一篇着重讲解了网页解析中的XPath表达式,今天这一篇主要讲解另一套网页解析语法——CSS路径表达式。 R语言与Python中都有支持CSS表达式的解析库,R...

34950
来自专栏Java架构师学习

2017年终巨献阿里、腾讯最新Java程序员面试题,准备好进BAT了吗

Java基础 进程和线程的区别; Java的并发、多线程、线程模型; 什么是线程池,如何使用? 数据一致性如何保证;Synchronized关键字,类锁,方法锁...

38850
来自专栏嵌入式程序猿

宏函数使用的陷阱

在嵌入式软件设计中,有工程师经常会定义一些宏函数,宏函数的使用虽然可以减少开销,但是宏函数的使用一定要小心,例如我们定义一个求取两个数中的较大者的宏函数来做试验...

37090
来自专栏FreeBuf

扒一扒基于词法分析和语法分析的SQL注入攻击检测

周末了,又到了一星期中的美好时刻,因为期待,因为渲染在时光中的慵散。本周,Black Hat大会,应该是安全界中的大事件。 这不,经过一番紧锣密鼓的搜罗,发现了...

65180
来自专栏Java架构

每个 JavaScript 工程师都应当知道的 10 个面试题以人为本1. 能说出来两种对于 JavaScript 工程师很重要的编程范式么?2. 什么是函数式编程?3. 类继承和原型继承有什么区别?

31360
来自专栏C语言及其他语言

[每日一题]恺撒密码(1214)

这是一个关于凯撒的悲伤的故事。。。。。。 题目描述 恺撒生活在充满危险和阴谋的时代. 恺撒面对的最困难的问题是生存. 为了生存, 他决定创造一种密码. 这种...

33650
来自专栏数据结构与算法

BZOJ 1022: [SHOI2008]小约翰的游戏John (Anti-nim)

Description   小约翰经常和他的哥哥玩一个非常有趣的游戏:桌子上有n堆石子,小约翰和他的哥哥轮流取石子,每个人取 的时候,可以随意选择一堆石子,在...

28060
来自专栏葡萄城控件技术团队

Visual Studio 2015速递(1)——C#6.0新特性怎么用

系列文章 Visual Studio 2015速递(1)——C#6.0新特性怎么用 Visual Studio 2015速递(2)——提升效率和质量(VS20...

20280
来自专栏韩伟的专栏

面向对象的代码风格(上)

大家过年好呀!公众号从今天开始恢复更新,感谢大家不离不弃的关注。 今天的文末有投票,以助于我在新的一年里将公众号做得更好,踊跃参加一下吧! 本篇文章分两章发送,...

40880

扫码关注云+社区

领取腾讯云代金券