在爬取百度图片的时候,发现百度图片做了反爬虫处理,在网上找到当前还能跑通的教程实例:python3多线程下载百度图片搜索结果

在分析代码的过程中,发现作者对爬取的objURL的解码是通过字符串的translate方式实现的。截止目前,很少用到translate方法,所以记录下相应的代码和使用方法。

百度图片objURL解码源码:

 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))

返回结果:

  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'

 

posted on 2018-01-23 12:02  Zoe233  阅读(429)  评论(0编辑  收藏  举报