在爬取百度圖片的時候,發現百度圖片作了反爬蟲處理,在網上找到當前還能跑通的教程實例: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'