有道翻译-python
有道翻译-爬虫练习
案例分析
1.抓取url请求接口
如图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OMdUQcX2-1638268219047)(https://www.ensio.top/img/01.png “抓取url请求接口”)]
顺便输入请求内容,向服务端发送请求后,F12查看url请求接口,预览了一下发现只有:
translate_o?smartresult=dict&smartresult=rule
响应有内容。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9lrzJ79B-1638268219065)(https://www.ensio.top/img/02.png “响应内容”)]
看一下headers信息为:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PufRBrRi-1638268219068)(https://www.ensio.top/img/03.png “headers信息”)]
2.观察请求头与请求表单数据的规律
为了以防万一,我特意多试了几个参数
发现了以下为重点
常规:请求 URL: http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule #urls请求方法: POST #使用的post请求状态代码: 200 OK #状态码200 表示OK远程地址: 220.181.76.84:80 #远程地址
响应头:略 #一些请求时的状态,服务器系统等等信息,用不上
请求头:Content-Length: 241 #请求参数的长度 除了这个下面基本不动Host: fanyi.youdao.com #远程主机Origin: http://fanyi.youdao.com Referer: http://fanyi.youdao.com/User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0. 4044.92 Safari/537.36 Edg/81.0.416.50 #游览器一些标识 我的是edg,微软X-Requested-With: XMLHttpRequest #xml的请求
表单数据:#传递的参数字典内容i: hellofrom: AUTOto: AUTOsmartresult: dictclient: fanyideskwebsalt: 15866130639860sign: 5eaba662ba667122522d389452dcb2aets: 1586613063986bv: 2083a8ac12524fb8e1481a1cf8589e63doctype: jsonversion: 2.1keyfrom: fanyi.webaction: FY_BY_REALTlME
整理一下,其实就下面信息有用
多试了几回发现只有下面这些参数发生了改变:
分析一下
- Content-Length: 241
- 这个应该是请求参数的大小
- i: hello
- 发送的参数
- salt: 15866130639860
- 盐,也就是时间戳
- sign: 5eaba662ba667122522d389452dcb2ae
- 这个,嗯…不太清楚,但是想了一下,看这个有可能是js加密,毕竟是post请求
- 于是F12查了一下js文件
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fzvqwkyh-1638268219071)(https://www.ensio.top/img/04.png "js文件 ")] - Ctrl+F 经过一个个找了之后发现了这个应该就是我想要的:
define("newweb/common/service", ["./utils", "./md5", "./jquery-1.7"],
function(e, t) {var n = e("./jquery-1.7");e("./utils");e("./md5");var r = function(e) {var t = n.md5(navigator.appVersion),r = "" + (new Date).getTime(),i = r + parseInt(10 * Math.random(), 10);return {ts: r,bv: t,salt: i,sign: n.md5("fanyideskweb" + e + i + "@6f#X3=cCuncYssPsuRUE")}};
- sign: n.md5("fanyideskweb" + e + i + "Nw(nmmbP%A-r6U3EUn]Aj")- 看样子,sign的值应该就是"fanyideskweb" + e + i + "Nw(nmmbP%A-r6U3EUn]Aj"经过md5加密后的值- "fanyideskweb"与"Nw(nmmbP%A-r6U3EUn]Aj"应该就是个字符串,但是e与i不知道是什么- 在文件中找了一下,嗯.原来就是sign的上面三行- var t = n.md5(navigator.appVersion)- r = "" + (new Date).getTime()- i = r + parseInt(10 * Math.random(), 10);- 分析了一下:第一行没用,r应该是时间戳,后面加的应该是0-9随机数
请求 URL: http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule #urlsContent-Length: 241 #请求参数的长度 除了这个下面基本不动User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0. 4044.92 Safari/537.36 Edg/81.0.416.50 #游览器一些标识 我的是edg,微软i: hellosalt: 15866130639860sign: 5eaba662ba667122522d389452dcb2ae
3.整理可用信息
- URL: http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule
- url
- Content-Length: 241
- 长度应该是表单内容的长度
- User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0. 4044.92 Safari/537.36 Edg/81.0.416.50 #游览器一些标识 我的是edg,微软
- 防止被反爬虫,加个伪装身份
- i: hello
- 参数
- salt: 15866130639860
- 时间戳
import time
import random
# 15866130639860
"""
salts = time.time()
print(salts)
"""
# 15866130639860
# 1586616469.5321376
# 原本分析的是时间戳,后来发现和时间戳有点差别
# 想了一下比时间戳多了四位,可能是时间戳 * 10000后取整
"""
salts = int(time.time() *10000)
print(salts)
"""
# 15866130639860
# 15866166617283
# 咳咳咳,后来发现怎么都不对,突然想到计算sign时间,用到一个
# i = r + parseInt(10 * Math.random(), 10);
# 所以可能是时间戳*1000后取整 ,在加上一位0-9随机数salts = int(time.time() *10000) + random.randint(0,10)
print(salts)
# 15866130639860
# 15866168373469
# 应该是对的,先用着
- sign: 5eaba662ba667122522d389452dcb2ae
- md5加密后的数据
- sign: n.md5(“fanyideskweb” + e + i + “Nw(nmmbP%A-r6U3EUn]Aj”)
- r = “” + (new Date).getTime()
- i = r + parseInt(10 * Math.random(), 10);
- md5加密后的数据
# 看了hashlib库里面正好有个例子For example, to obtain the digest of the byte string 'Nobody inspects the
spammish repetition':>>> import hashlib>>> m = hashlib.md5()>>> m.update(b"Nobody inspects")>>> m.update(b" the spammish repetition")>>> m.digest()b'\\xbbd\\x9c\\x83\\xdd\\x1e\\xa5\\xc9\\xd9\\xde\\xc9\\xa1\\x8d\\xf0\\xff\\xe9'More condensed:>>> hashlib.sha224(b"Nobody inspects the spammish repetition").hexdigest()'a4337bc45a8fc544c03f52dc550cd6e1e87021bc896588bd79e901e2'
代码
"""
- URL: http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule- url- 由于有反爬,一直显示{"errorCode":50},网上有人提示去掉参数_o,爬虫成功- URL: http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule
- Content-Length: 241- 长度应该是表单内容的长度
- User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0. 4044.92 Safari/537.36 Edg/81.0.416.50 #游览器一些标识 我的是edg,微软- 防止被反爬虫,加个伪装身份
- i: hello - 参数
- salt: 15866130639860- 时间戳
- sign: 5eaba662ba667122522d389452dcb2ae- md5加密后的数据- sign: n.md5("fanyideskweb" + e + i + "Nw(nmmbP%A-r6U3EUn]Aj")- r = "" + (new Date).getTime()- i = r + parseInt(10 * Math.random(), 10);
"""
from urllib import request,parse #
import random
import time
import json
import hashlibdef salt():salts = int(time.time() * 1000) + random.randint(0, 10)return saltsdef sign(value):md5 = hashlib.md5()md5.update(bytes(value,encoding='utf-8'))sign = md5.hexdigest()return signdef yd_spider(data):url = 'http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule'signs = "fanyideskweb" + str(data) + str(salt()) + "sr_3(QOHT)L2dx#uuGR@r" #未经md5加密的datas = { #不管三七二十一,全部装入'i': data, #要翻译的内容'from': 'AUTO','to': 'AUTO','smartresult': 'dict','client': 'fanyideskweb','salt': str(salt()), #时间戳,写个函数装一下'sign': sign(signs), #用hashleib写个函数装一下 'ts': '1586613063986','bv': '2083a8ac12524fb8e1481a1cf8589e63','doctype': 'json','version': '2.1','keyfrom': 'fanyi.web','action': 'FY_BY_REALTlME'}data = parse.urlencode(datas) #用parse将datas表单数据格式化一下headers = { #为了防止出现各种异常,都装入吧,删除一些不必要的,但是要注意参数长度会变化'content-length': len(data),'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.92 Safari/537.36 Edg/81.0.416.50'}rsq = request.Request(url, data=bytes(data, encoding='utf-8'), headers=headers)res = request.urlopen(rsq)html = res.read().decode()translate_results = json.loads(html)# 找到翻译结果if 'translateResult' in translate_results:translate_results = translate_results['translateResult'][0][0]['tgt']#取到json数据中的"tgt"的value就是我们想要的print("\n翻译的结果是:%s" % translate_results)else:print(translate_results)if __name__ == "__main__":word = input("输入翻译的内容:")yd_spider(word)
成功
如图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Snc5qDyd-1638268219078)(https://www.ensio.top/img/07.png “成功”)]
总结
虽然只是最简单的词典爬取,但是还是遇到了很多困难,一一列出,反省一下:
- url请求地址没有找到关键参数,导致一直返回{“errorCode”:50},百度了一下才知道反爬了
- [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wXsvUUIq-1638268219082)(https://www.ensio.top/img/05.png "{errorCode:50} ")]
- post请求处理不当
- 在找参数表单时候,没有意识到时间戳异样,以致于直接使用时间戳,没有经过处理
- 再遇到js加密的时候,懵逼了许久,才意识到自己要干嘛
- 在找到md5加密的时候,第一印象是:啊,md5呀,再见
- 处理md5加密时候,没有看hashlib库,后来才发现人家底下就有示例…
- data没有使用bytes类型
- json数据提取不熟练,还得借助转换器
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fEOdYI8k-1638268219087)(https://www.ensio.top/img/08.png “json转换”)]
影修
我是影修,一只蹉跎年华的路人甲~
有道翻译-python相关推荐
- php 获取有道翻译,python爬虫 身边的翻译专家——获取有道翻译结果
[导读]有道翻译可以直接翻译内容,观察它的网页内容以及URL可以发现,它的基本url 和将要翻译的内容... 本文目的:使用python 实现翻译效果 思路:有道翻译可以直接翻译内容,观察它的网页内容 ...
- 有道翻译 python 翻译
有道翻译 中英互译 方便自己查询,不必打开网页和软件 直接上源码 import requests def Youdao(): url = 'http://fanyi.youdao.com/transl ...
- python有道翻译-Python调用有道词典翻译
Python调用有道词典翻译 分析 翻译按钮 点击翻译按钮,查看网络请求,如图 共有四个网络请求,通过分析,查看返回的信息,显然第一个是真正的翻译请求,具体信息如下: 如图所示,我们真正关注的是请求参 ...
- python有道翻译-Python版有道翻译
做过爬虫的朋友应该很通俗易懂,话不多说 亮代码吧. 需要用到的模块: Urllib time hashlib random json Code: #encoding:utf-8 #__Author__ ...
- python有道翻译-Python爬去有道翻译
注:传入的类型为POST类型,所以需要使用urllib.parse.urlencode(),将字典转换成URL可用参数: 使用json.loads(),将输出的json格式,转换为字典类型 impor ...
- Python爬虫破解有道翻译
有道翻译是以异步方式实现数据加载的,要实现对此类网站的数据抓取,其过程相对繁琐,本节我以有道翻译为例进行详细讲解. 通过控制台抓包,我们得知了 POST 请求的参数以及相应的参数值,如下所示: 图1: ...
- Python 编写一个有道翻译的 workflow 教程
最近使用有道翻译的 workflow 总是翻译不了,可能是 appKey 失效了或者超过调用上限,所以打算自己实现一个. 创建 workflow 打开 Alfred3 的 Preferences,选择 ...
- python有道自动翻译_Python 调用有道翻译接口实现翻译
最近为了熟悉一下 js 用有道翻译练了一下手,写一篇博客记录一下,也希望能对大家有所启迪,不过这些网站更新太快,可能大家尝试的时候会有所不同. 首先来看一下网页 post 过去的数据 大家不难发现,我 ...
- 有道python网课怎么样-如何用python“优雅的”调用有道翻译?
前言 其实在以前就盯上有道翻译了的,但是由于时间问题一直没有研究(我的骚操作还在后面,记得关注),本文主要讲解如何用python调用有道翻译,讲解这个爬虫与有道翻译的js"斗争"的 ...
最新文章
- Mapbox gl tile瓦片渲染点以及图片Icon
- 一个标准的PID算法
- RMSE均方根误差学习笔记
- xay loves or 异或
- python中的ans是什么意思_python ans
- unity 全息交互ui_UI向3D投影全息界面的连续发展
- 前端学习(1126):递归求数学题
- 苹果再遭诉讼!因两步验证太过耗时...
- UISegmentedControl UISlider
- 关于用C#编写ActiveX控件4(转)
- mds算法 java_对OAF开发中的MDS的初步研究(转)
- vue 配置跨域访问
- linux img镜像安装到硬盘,ESXi虚拟机使用IMG镜像安装系统(LEDE安装教程)
- Android筑基——深入理解 LayoutInflater.inflate() 方法
- 手机里的PDF文件太大如何变小?免费方法了解一下
- 多个excel工作簿合并_你还在使用复制粘贴合并表格?一个公式搞定Excel多工作簿合并...
- c语言大写字母A变小写a流程图,大小写字母转换
- 国外雅虎邮箱的服务器地址,yahoo
- Mysql的基本操作
- mac改变ipv4地址无法上网