• 字符串translate方式实现


    在爬取百度图片的时候,发现百度图片做了反爬虫处理,在网上找到当前还能跑通的教程实例: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'
  • 相关阅读:
    ex3多类问题和NN中的前向传播
    逻辑关系下的NN应用
    NN-Neural Network
    ex2:逻辑回归及正则条件下的练习
    Overfitting&Underfitting Problems
    操作系统内存管理之虚拟内存
    C陷阱与缺陷读书笔记(三)
    操作系统常见面试题
    计算机网络常考面试题总结
    堆及堆排序
  • 原文地址:https://www.cnblogs.com/zoe233/p/8335065.html
Copyright © 2020-2023  润新知