使用urllib2库实现有道翻译
有道翻译的提交方式是POST,请求内容在form表单里,基本思路就是针对POST请求的普通爬虫,模拟表单的发送,然后问题出现了,{“errorCode”:50}。我记得一年前是可以用这样的思路解决的,结果现在不行了,看来是有道翻译的爬虫机制加了点什么,使用抓包工具抓取多次form表单,对比发现有两个值是变化的
- salt
- sign
这两个是什么东西,一般这种能在页面直接变化的东西都是用JS做的,我去看了看JS代码,在网页源代码最下边
</script><script type="text/javascript" src="http://shared.ydstatic.com/api/fanyi-web/assets/index.min.js" charset="utf-8"></script><script type="text/javascript" src="http://shared.ydstatic.com/fanyi/newweb/v1.0.17/scripts/newweb/fanyi.min.js"></script>
</html>
打开发现很乱,找了个JS代码在线格式化的网站,格式化了一下,然后放到sublime编辑器搜索salt,最终找到了这个
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")}};
很显然这段代码用时间戳+随机数生成了salt,又用要翻译的词(e)和salt(i)加上两端固定的字符串拼接成了一个新的字符串,然后再对这个字符串进行MD5加密,最终得到了sign。
知道这个剩下的就简单了,模拟这个加密过程然后加入到form表单里。
以下是源代码;(提醒以下,如果自己写的话在确定salt和sign都模拟成功了但还是报错的话,可以关注一下你写的headers,看里面缺不缺什么,我在这卡了好几个小时,坑啊)
# -*- coding:utf-8 -*-import urllib
import urllib2from tieba import createUAdef get_salt():"""作用:获取json中的salt值"""import random,timereturn str(int(time.time()*1000) + random.randint(0,10))
#print(get_salt())def get_sign(keyword,salt):"""作用:获取json中的sign值"""import hashlib# 先拼接signsign = "fanyideskweb" + keyword + str(salt) + "@6f#X3=cCuncYssPsuRUE"md5 = hashlib.md5()md5.update(sign)sign = md5.hexdigest()return signdef get_fanyi():"""作用:得到翻译结果"""url = "http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule"keyword = raw_input("请输入需要翻译的文字:")header = {"Accept": "application/json,text/javascript,*/*;q=0.01","Accept-Language": "zh-CN,zh;q=0.9",#"Connection": "keep-alive",#"Content-Type": "application/x-www-form-urlencoded;charset=UTF-8","Cookie":"OUTFOX_SEARCH_USER_ID=1076696971@10.168.8.63;JSESSIONID=aaaZ6s5m9DVmYf8g3QoDw;OUTFOX_SEARCH_USER_ID_NCOO=473292646.5080033;___rl__test__cookies=1543228484656",#"Host": "fanyi.youdao.com",#"Origin":"http://fanyi.youdao.com","Referer":"http://fanyi.youdao.com/","User-Agent": "Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/69.0.3497.100Safari/537.36OPR/56.0.3051.104X-Requested-With:XMLHttpRequest"}salt = get_salt()sign = get_sign(keyword,salt)#print(salt)#print(sign)formdata = {"i": keyword,"from": "AUTO","to": "AUTO","smartresult": "dict","client": "fanyideskweb","salt": str(salt),"sign": sign,"doctype": "json","version": "2.1","keyfrom": "fanyi.web","action": "FY_BY_CLICKBUTTION","typoResult": "false",}data = urllib.urlencode(formdata)#print(data)#print("*"*20)#print(header)request = urllib2.Request(url, data=data,headers=header)#print(request)print(urllib2.urlopen(request).read())if __name__ == '__main__':get_fanyi()
使用urllib2库实现有道翻译相关推荐
- Emacs进阶之使用Mepla插件库及有道翻译安装
1.下载配置Melpa插件库 # emacs ~/.emacs添加 ;;**************************************************************** ...
- Python3爬取有道翻译的两种方法
一. 破解参数加密 有道翻译的请求是post,携带一系列参数,直接F12刷新进行调试,如下图所示: 这是一个 post 请求,目标网址是 'http://fanyi.youdao.com/transl ...
- Crawler:基于urllib库+实现爬虫有道翻译
Crawler:基于urllib库+实现爬虫有道翻译 目录 输出结果 设计思路 实现步骤 输出结果 后期更新-- 设计思路 第一步:首先要知道,data里面的内容是都需要在代码中发送给服务器的. 第二 ...
- 2.03_01_Python网络爬虫urllib2库
一:urllib2库的基本使用 所谓网页抓取,就是把URL地址中指定的网络资源从网络流中抓取出来.在Python中有很多库可以用来抓取网页,我们先学习urllib2. urllib2 是 Python ...
- Python 编写一个有道翻译的 workflow 教程
最近使用有道翻译的 workflow 总是翻译不了,可能是 appKey 失效了或者超过调用上限,所以打算自己实现一个. 创建 workflow 打开 Alfred3 的 Preferences,选择 ...
- python有道翻译-使用python2爬取有道翻译
爬虫的核心思想:模拟浏览器正常访问服务器,一般情况只要浏览器能访问的,都可以爬,如果被反爬,则考虑反复测试添加Request Header数据,知道可以爬取为止. 反爬思路目前知道的有:User-Ag ...
- python有道翻译法语-使用python2爬取有道翻译
爬虫的核心思想:模拟浏览器正常访问服务器,一般情况只要浏览器能访问的,都可以爬,如果被反爬,则考虑反复测试添加Request Header数据,知道可以爬取为止. 反爬思路目前知道的有:User-Ag ...
- python语音翻译-python利用有道翻译实现“语言翻译器”的功能
importurllib.requestimporturllib.parseimportjsonwhileTrue: content= input('请输入需要翻译的内容(退出输入Q):')if co ...
- python有道翻译接口-【Python】Python利用有道翻译开发API应用示例
Python源码是关于Python利用有道翻译开发API应用示例.这是一个很有意思又简单的API应用练习题,方法中用到了有道词典开放API应用,合成的类似于命令行词典应用Python小程序.功能简单, ...
最新文章
- 独家 | 感悟注意力机制
- Java条形码生成技术-Barcode4j
- C语言实验——求一个3*3矩阵对角线元素之和
- 国家发改委:分两批在8个地区建设全国一体化算力网络国家枢纽节点
- linux ldap客户端工具,OpenLDAP 客户端安装部署
- sqlite 修改表名,合并数据库(文件)
- php 下拉菜单 搜索,DedeCMS实现百度搜索下拉菜单提示信息功能
- Javascript:原型模式类继承
- JavaFX官方教程(九)之转换
- jsoup爬虫教程技巧_Jsoup V的幕后秘密:优化的技巧和窍门
- 推荐一个神器 - 把你的照片随心所欲的摆成各种形状
- WPF 中的Width 与 ActualWidth
- 清晰架构的 Go 微服务: 程序容器
- 计算机无法进系统咋办,详解电脑无法进入系统怎么办
- android学习资料免费下载
- 横向滑动视图HorizontalScrollView精炼详解
- Flink_Flink ON YARN containerized.heap-cutoff-min 内存调整
- 阿里云获取手机验证码
- 我的世界服务器物品展示怎么得,我的世界物品展示框详解攻略 物品展示框怎么做...
- 微信开放平台 安卓Android 应用签名生成