今天做爬虫,百度图片的json中url是加密的,就在网上查怎么解密,查到了一个大佬的方法这里献上链接
python版本的https://blog.csdn.net/mengyanyuan8023/article/details/90269579
还有另一位大佬分别使用c语言,JavaScript,php写的
https://blog.csdn.net/hbuxiaoshe/article/details/44780653
我用的是python做爬虫所以我主要看了python版本的但是我自己太渣,大佬的代码有的地方我看不太懂,通过一些资料还有自己的一些尝试算是解决了自己的困惑
主要是这一行代码:
url = re.sub(r'(?P<value>_z2C\$q|_z\&e3B|AzdH3F+)', lambda matched: table.get(matched.group('value')), url)
直接给我看蒙了,但是我运行了一下成功解码。
这里我说一下我自己通过查资料得到的自己的理解
首先re.sub的用法:
re.sub(pattern, repl, string, count=0, flags=0)
- pattern : 正则中的模式字符串。
- repl : 替换的字符串,也可为一个函数。
- string : 要被查找替换的原始字符串。
- count : 模式匹配后替换的最大次数,默认 0 表示替换所有的匹配。
?P\<value\>
的意思就是命名一个名字为value的组,后面的内容才是匹配规则,所以后面那个lambda表达式中的group(‘value’)也就不难理解了,但是这个matched我依旧想不通为啥,这只是一个相当于形参的东西,没有实参为啥可以输出结果。然后我就想看看matched是什么东西
import re
def fun(x):
print(x)
a = "123asd213"
re.sub(r'\d',lambda matched:fun(matched),a)
<re.Match object; span=(0, 1), match=‘1’>
<re.Match object; span=(1, 2), match=‘2’>
<re.Match object; span=(2, 3), match=‘3’>
<re.Match object; span=(6, 7), match=‘2’>
<re.Match object; span=(7, 8), match=‘1’>
<re.Match object; span=(8, 9), match=‘3’>
可以看出这个matched就是每一次匹配到的结果
我理解的就是,sub这个函数会使用正则进行匹配,匹配到结果之后就调用lambda并且把匹配到的结果当做参数传递,我打开sub源码稍微看了一下(因为看不懂太多…………)。
这句话的意思就是:如果它是可调用的,则传递匹配对象并必须返回要使用的替换字符串。
就是这个表达式必须要返回用来替换他的值。