用 python 实现百度图片 URL 解密

5 篇文章 0 订阅
1 篇文章 0 订阅

最近在学习用python实现爬虫,想批量爬取百度图片,但是查看百度图片的网页源码的时候发现图片的 objURL 都像下面这样并不是一个可访问的url:

"objURL":"ippr_z2C$qAzdH3FAzdH3Fwppwvi4jgpf_z&e3B2uwg_z&e3Bv54AzdH3Fu5674AzdH3Fwppwvi4jgpfdAzdH3Fda8na9AzdH3FnaAzdH3F8baad9mohbbs9ks7bm1o0s_z&e3B3r2"

而且点击单张图片时观察浏览器后台,发现并没有与后台进行解码相关的交互,于是猜想,对于 url 编码肯定是在 js 里面实现的。在网上查找了一下,发现有博主已经实现了C、php以及js版本的解码方法,具体可以参考这篇博客: 百度图片url解码

由于我需要 python 版本的实现,所以自己用python实现了这个解码的过程,具体代码如下:

def decode_url(url):
    """
    对百度加密后的地址进行解码\n
    :param url:百度加密的url\n
    :return:解码后的url
    """
    table = {'w': "a", 'k': "b", 'v': "c", '1': "d", 'j': "e", 'u': "f", '2': "g", 'i': "h",
             't': "i", '3': "j", 'h': "k", 's': "l", '4': "m", 'g': "n", '5': "o", 'r': "p",
             'q': "q", '6': "r", 'f': "s", 'p': "t", '7': "u", 'e': "v", 'o': "w", '8': "1",
             'd': "2", 'n': "3", '9': "4", 'c': "5", 'm': "6", '0': "7",
             'b': "8", 'l': "9", 'a': "0", '_z2C$q': ":", "_z&e3B": ".", 'AzdH3F': "/"}
    url = re.sub(r'(?P<value>_z2C\$q|_z\&e3B|AzdH3F+)', lambda matched: table.get(matched.group('value')), url)
    return re.sub(r'(?P<value>[0-9a-w])', lambda matched: table.get(matched.group('value')), url)

需要注意的是,编码表 table 的键是从0-9,a-w(没有x、y、z)的,所以正则表达式不需要匹配这三个字符。可以用 sorted 方法输出看一下

# 对编码表 table 排序输出
print(sorted(table.keys(),key=lambda item:item[0]))

输出结果如下:

[('0', '7'), ('1', 'd'), ('2', 'g'), ('3', 'j'), ('4', 'm'), ('5', 'o'), ('6', 'r'), ('7', 'u'), ('8', '1'), ('9', '4'), ('AzdH3F', '/'), ('_z&e3B', '.'), ('_z2C$q', ':'), ('a', '0'), ('b', '8'), ('c', '5'), ('d', '2'), ('e', 'v'), ('f', 's'), ('g', 'n'), ('h', 'k'), ('i', 'h'), ('j', 'e'), ('k', 'b'), ('l', '9'), ('m', '6'), ('n', '3'), ('o', 'w'), ('p', 't'), ('q', 'q'), ('r', 'p'), ('s', 'l'), ('t', 'i'), ('u', 'f'), ('v', 'c'), ('w', 'a')]

 

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值