js逆向实战 -- python实现百度翻译案例

文章目录

    • 一、需求
    • 二、思路分析
    • 三、遇到的问题及解决方法
    • 四、代码分享

一、需求

通过抓取百度翻译的翻译接口,实现中译英

二、思路分析

1.明确目标url

url = "https://fanyi.baidu.com/v2transapi?from=zh&to=en"

js逆向实战 -- python实现百度翻译案例_第1张图片
js逆向实战 -- python实现百度翻译案例_第2张图片

2.向目标url发送请求、获取对应的响应

response = requests.post(url, headers=headers, data=form_data)

js逆向实战 -- python实现百度翻译案例_第3张图片
js逆向实战 -- python实现百度翻译案例_第4张图片
3.提取翻译的结果

print(response.content.decode())

三、遇到的问题及解决方法

1. bug:“error”:997

js逆向实战 -- python实现百度翻译案例_第5张图片
js逆向实战 -- python实现百度翻译案例_第6张图片

solution:可能是百度翻译的反爬措施,需要在headers请求头带上cookie进一步伪装

js逆向实战 -- python实现百度翻译案例_第7张图片

2. bug:改变翻译内容后(“什么” -> “好的” ),出现"error":998

js逆向实战 -- python实现百度翻译案例_第8张图片

solution:观察发现,不同翻译内容的sign值不同,且sign无法在element中找到,可能需要通过js逆向解析

js逆向实战 -- python实现百度翻译案例_第9张图片
js逆向实战 -- python实现百度翻译案例_第10张图片
js逆向实战 -- python实现百度翻译案例_第11张图片
js逆向实战 -- python实现百度翻译案例_第12张图片
js逆向实战 -- python实现百度翻译案例_第13张图片
js逆向实战 -- python实现百度翻译案例_第14张图片
js逆向实战 -- python实现百度翻译案例_第15张图片

3. bug:使用python运行js代码后出现报错
execjs._exceptions.ProgramError: ReferenceError: i is not defined

js逆向实战 -- python实现百度翻译案例_第16张图片

solution: 找到i,定义i

js逆向实战 -- python实现百度翻译案例_第17张图片
js逆向实战 -- python实现百度翻译案例_第18张图片
js逆向实战 -- python实现百度翻译案例_第19张图片
js逆向实战 -- python实现百度翻译案例_第20张图片

4. bug:再次运行js代码后出现新的报错
execjs._exceptions.ProgramError: ReferenceError: n is not defined

js逆向实战 -- python实现百度翻译案例_第21张图片

solution:找到n,定义n

js逆向实战 -- python实现百度翻译案例_第22张图片
js逆向实战 -- python实现百度翻译案例_第23张图片
js逆向实战 -- python实现百度翻译案例_第24张图片

四、代码分享

import re
import requests
import execjs   # 注意这里需要下载第三方库
# pip install PyExecJS -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com

data = input("请输入你要翻译的内容:")

with open("baidu_trans.js", "r", encoding="utf-8") as f:
    # 读取js代码
    js_data = f.read()
    # 编译
    js_obj = execjs.compile(js_data)
    # 执行js代码 -- 以字符串的形式传入函数;传参
    sign = js_obj.call("e", data)
    # print(sign)

url = "https://fanyi.baidu.com/v2transapi?from=zh&to=en"

headers = {
    "Referer": "https://fanyi.baidu.com/?aldtype=16047",
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36",
    "Cookie": ""    # 带上你的cookie
}

form_data = {
    "from": "zh",   # 中文
    "to": "en",		# 英文
    "query": data,     # 翻译的内容
    "transtype": "translang",
    "simple_means_flag": "3",
    "sign": sign,	
    "token": "a6063d67d2ad5029a79978ae39b7e8b6",
    "domain": "common"
}
response = requests.post(url, headers=headers, data=form_data)

# 提取数据 -- 使用正则匹配
res = re.findall(r'"dst":"(.*?)"', response.content.decode())[0]   
print("翻译结果:", res)

js逆向实战 -- python实现百度翻译案例_第25张图片

  • 写在最后:有任何代码问题,欢迎交流~

你可能感兴趣的:(Python爬虫,javascript,爬虫,python)