【Python项目实战】爬虫核心技术-有道翻译js逆向解析,不再做一个基础的爬虫代码书写者!

爬取目标

网址:有道翻译

【Python项目实战】爬虫核心技术-有道翻译js逆向解析,不再做一个基础的爬虫代码书写者!_第1张图片

工具使用

开发工具:pycharm

开发环境:python3.7, Windows10

使用工具包:requests,random,hashlib

重点学习内容

  • 网络请求的发送

  • js代码调试

  • js代码解析逆向

 

项目思路解析

先区分数据的加载方式 请求数据时网址是没有变化的 通过抓包获取到动态数据

找到对应的数据接口 获取到网页的请求接口 请求方法是post请求

【Python项目实战】爬虫核心技术-有道翻译js逆向解析,不再做一个基础的爬虫代码书写者!_第2张图片

post需要提交的数据

【Python项目实战】爬虫核心技术-有道翻译js逆向解析,不再做一个基础的爬虫代码书写者!_第3张图片

可以明显看出salt是时间戳 多个请求的数据进行比较 只有sign值是在不断变化的加密数据 找到数据的加密规则 找到加密文件

【Python项目实战】爬虫核心技术-有道翻译js逆向解析,不再做一个基础的爬虫代码书写者!_第4张图片

打上断点找到对应加密数据的位置 调试代码进入断点

【Python项目实战】爬虫核心技术-有道翻译js逆向解析,不再做一个基础的爬虫代码书写者!_第5张图片

 

sign值是由r.sign得来的 找到r的生成方式

【Python项目实战】爬虫核心技术-有道翻译js逆向解析,不再做一个基础的爬虫代码书写者!_第6张图片

找到最终的加密数据的位置

【Python项目实战】爬虫核心技术-有道翻译js逆向解析,不再做一个基础的爬虫代码书写者!_第7张图片

ts为时间戳 salt为时间戳加一个随机数 sign为MD5的加密方法生成的数据 sign是由时间戳的改变而改变的

明确加密的方式剩下的就是书写代码了

简易源码分析

import requests
import time
import random
import hashlib



def main():
    """主程序"""
    url = "http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule"
    headers = {
        'X-Requested-With': 'XMLHttpRequest',
        'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.75 Safari/537.36',
        'Origin': 'http://fanyi.youdao.com',
        'Referer': 'http://fanyi.youdao.com/',
        'Cookie': '[email protected]; JSESSIONID=aaaRyVJv8oEwg7dPaWrux; OUTFOX_SEARCH_USER_ID_NCOO=704285648.1294403; ___rl__test__cookies=1602406917270'
    }
    i = input("请输入你要的数据:")
    """获取参数"""
    lts = str(int(time.time()*100))
    salt = lts + str(random.randint(0, 9))

    content = "fanyideskweb" + i + salt + "]BjuETDhU)zqSxf-=B#7m"
    sign = hashlib.md5(content.encode("utf-8")).hexdigest()
    data = {
        'action': 'FY_BY_CLICKBUTTION',
        'bv': '9caf244986fe6d1de38207408302e500',
        'client': 'fanyideskweb',
        'doctype': 'json',
        'from': 'AUTO',
        'i': i,
        'keyfrom': 'fanyi.web',
        'lts': lts,
        'salt': salt,
        'sign': sign,
        'smartresult': 'dict',
        'to': 'AUTO',
        'version': '2.1'
    }
    response = requests.post(url=url,headers=headers,data=data)
    print(response.json()["translateResult"][0][0]["tgt"])



if __name__ == '__main__':
    main()

【Python项目实战】爬虫核心技术-有道翻译js逆向解析,不再做一个基础的爬虫代码书写者!_第8张图片

 

你可能感兴趣的:(万能爬虫,python,js,爬虫,后端)