在爬取百度图片的时候,发现百度图片作了反爬虫处理,在网上找到当前还能跑通的教程实例:python3多线程下载百度图片搜索结果。python
在分析代码的过程当中,发现做者对爬取的objURL的解码是经过字符串的translate方式实现的。截止目前,不多用到translate方法,因此记录下相应的代码和使用方法。git
百度图片objURL解码源码:github
1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 4 """解码百度图片搜索json中传递的url 5 抓包能够获取加载更多图片时,服务器向网址传输的json。 6 其中originURL是特殊的字符串 7 解码前: 8 ippr_z2C$qAzdH3FAzdH3Ffl_z&e3Bftgwt42_z&e3BvgAzdH3F4omlaAzdH3Faa8W3ZyEpymRmx3Y1p7bb&mla 9 解码后: 10 http://s9.sinaimg.cn/mw690/001WjZyEty6R6xjYdtu88&690 11 使用下面两张映射表进行解码。 12 """ 13 14 str_table = { 15 '_z2C$q': ':', 16 '_z&e3B': '.', 17 'AzdH3F': '/' 18 } 19 20 char_table = { 21 'w': 'a', 22 'k': 'b', 23 'v': 'c', 24 '1': 'd', 25 'j': 'e', 26 'u': 'f', 27 '2': 'g', 28 'i': 'h', 29 't': 'i', 30 '3': 'j', 31 'h': 'k', 32 's': 'l', 33 '4': 'm', 34 'g': 'n', 35 '5': 'o', 36 'r': 'p', 37 'q': 'q', 38 '6': 'r', 39 'f': 's', 40 'p': 't', 41 '7': 'u', 42 'e': 'v', 43 'o': 'w', 44 '8': '1', 45 'd': '2', 46 'n': '3', 47 '9': '4', 48 'c': '5', 49 'm': '6', 50 '0': '7', 51 'b': '8', 52 'l': '9', 53 'a': '0' 54 } 55 56 # str的translate方法须要用单个字符的十进制unicode编码做为key 57 # value 中的数字会被当成十进制unicode编码转换成字符 58 # 也能够直接用字符串做为value 59 char_table = {ord(key):ord(value) for key,value in char_table.items()} 60 61 def decode(url): 62 # 先替换字符串 63 for key,value in str_table.items(): 64 url = url.replace(key,value) 65 66 # 再替换剩下的字符 67 return url.translate(char_table) 68 69 if __name__=='__main__': 70 url =r"ippr_z2C$qAzdH3FAzdH3Ffl_z&e3Bftgwt42_z&e3BvgAzdH3F4omlaAzdH3Faa8W3ZyEpymRmx3Y1p7bb&mla" 71 print(decode(url))
返回结果:json
http://s9.sinaimg.cn/mw690/001WjZyEty6R6xjYdtu88&690服务器
以上就是解码百度的objURL的结果。多线程
为了增强对上面注释的内容的理解,用最简单的方式去使用translate。编码
>>> char_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' ... } >>> uri='http://ghajgjakngadnkaklmaglg.cmmga' >>> char_table = {ord(key):ord(value) for key,value in char_table.items()} >>> char_table {119: 97, 107: 98, 118: 99, 49: 100, 106: 101, 117: 102, 50: 103, 105: 104, 116: 105, 51: 106, 104: 107, 115: 108, 52: 109, 103: 110, 53: 111, 114: 112, 113: 113, 54: 114, 102: 115, 112: 116, 55: 117, 101: 118, 111: 119, 56: 49, 100: 50, 110: 51, 57: 52, 99: 53, 109: 54, 48: 55, 98: 56, 108: 57, 97: 48} >>> uri.translate(char_table) 'kiit://nk0ene0b3n023b0b960n9n.566n0' >>> uri 'http://ghajgjakngadnkaklmaglg.cmmga'