本文复刻此教程:制作属于自己的翻译软件-很简单【Python】_哔哩哔哩_bilibili
一、明确需求(以搜狗翻译为例)
(1)网址:https://fanyi.sogou.com/text
(2) 数据:翻译内容
二、抓包分析——通过浏览器开发者工具分析对应的数据位置
(1)在搜狗翻译的官网打开开发者工具(F12/右击选择“检查”——“network(网络)”)
原始界面:
(2)刷新网页
刷新网页:进入网页,在网页页面上已经有数据
刷新后界面:
输入/点击搜索/查询:刚开始进入网页没有数据,当我们执行某些操作之后返回
输入后界面:
下滑页面加载新的数据内容/点击翻页加载更多数据:下滑网页/点击加载更多数据
(3) 通过关键字搜索找到对应的数据位置
数据包地址:搜狗翻译 - 我的贴身智能翻译专家
二、通过代码逐步实现
1.发送请求——模拟浏览器对于url地址发送请求
模拟浏览器对于url地址发送请求
模拟浏览器方法——可以直接复制:开发者工具->网络->点击对应数据包->标头->请求标头 ->cookie/ua/referer..(复制之后在代码中字典形式)
请求网址:刚刚抓包分析找到链接地址,直接复制粘贴即可
发送请求:
1)一般使用:第三方模块requests进行数据请求
2)请求方法:开发者工具->网络->点击对应数据包->标头->常规
一般是有以下这两种:POST/GET
3)请求参数
GET请求:查询参数(显性)
直接在链接中显示,可以不用额外构建
比如:
POST请求:表单数据/请求载荷(隐性)
开发者工具->网络->点击对应数据包->载荷
2.获取数据——获取服务器返回响应数据
获取服务器返回响应数据
#获取响应的json数据
json_data =response.json()
注意:查看返回数据和在响应中是否一致,这里有三种情况: 1.正常返回数据(没有问题);2.返回了数据,但数据不是我们需要的(这种情况说明被反爬了); 3.没有返回数据(空白面板)。(这种情况说明被反爬了)。
上述第二第三种情况解决方法:1.考虑请求头添加的参数伪装不够完善,只是添加ua,继续添加cookie参数..。2.请求参数/请求头是否存在加密参数内容
3.解析数据——提取我们需要的数据内容
4.保存数据——把提取数据保存为表格/数据库/json/文本
关于S值的逆向分析
对于不同翻译内容,有两个关键点:(1)text:输入需要被翻译的内容(文本内容);(2)s:不同文本内容值不同
为了解决上述情况,经以下步骤逐步排查:1.根据s值,进行全局搜索,查看是否另外数据包返回; 2.根据s键,进行搜索,查看值是从什么地方生成:根据s键名搜索返回内容过于多、根据堆栈 跟栈调试 XHR断点调试、搜索MD5加密关键代码(MD5指的是长度32位,由0-9 a-f组合起来的值)
1.通过开发者工具搜索定位加密位置
这个关键字搜索出的数量比较少,方便进一步查找。
一个个点击查看是否包含S:
上述步骤可总结为:
2.断点调试分析
(1)分析传入了什么参数,调了什么方法进行加密处理
(2)输入翻译内容,执行翻译程序:程序会在我们断点位置暂停程序-->看到相关传入返回值
教程中的步骤:
最终代码:
#导入数据请求模块(需要安装)
import requests
# 导入哈希模块
import hashlibdef Gets(key):string = f'autoen{key}109984457'MD5 = hashlib.md5()MD5.update(string.encode('utf-8'))s = MD5.hexdigest()return s
def translation(key):"""发送请求"""# 下面的参数都在网页的上headers ={#cookie 用户信息,常用于检测是否有登陆账号(登录与否都有)'Cookie': '*****',## User-Agent 用户代理,表示浏览器基本身份信息'User-Agent':'***'}#获取s的加密参数s = Gets(key)# 请求网址url = 'https://fanyi.sogou.com/api/transpc/text/result'#请求参数data ={"from":"auto","to":"en","text":key,"client":"pc","fr":"browser_pc","needQc":1,"s":s,"uuid":"****-**********", #每台电脑的都是不一样的,这里需要修改"exchange":False}#发送请求"""获取数据"""response =requests.post(url=url, json=data, headers=headers)# 获取响应的json数据json_data =response.json()#字典取值:提取翻译结果result = json_data['data']['translate']['dit']print('翻译结果:',result)return resultwhile True:# 用户输入翻译内容key = input('请输入你要翻译的内容:')translation(key)
这里注意,不要盲目把代码复制运行,因为每台电脑的某些参数是不一样的,需要一步步安装教程来修改!!!!