有道翻译的提交方式是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库实现有道翻译相关推荐

  1. Emacs进阶之使用Mepla插件库及有道翻译安装

    1.下载配置Melpa插件库 # emacs ~/.emacs添加 ;;**************************************************************** ...

  2. Python3爬取有道翻译的两种方法

    一. 破解参数加密 有道翻译的请求是post,携带一系列参数,直接F12刷新进行调试,如下图所示: 这是一个 post 请求,目标网址是 'http://fanyi.youdao.com/transl ...

  3. Crawler:基于urllib库+实现爬虫有道翻译

    Crawler:基于urllib库+实现爬虫有道翻译 目录 输出结果 设计思路 实现步骤 输出结果 后期更新-- 设计思路 第一步:首先要知道,data里面的内容是都需要在代码中发送给服务器的. 第二 ...

  4. 2.03_01_Python网络爬虫urllib2库

    一:urllib2库的基本使用 所谓网页抓取,就是把URL地址中指定的网络资源从网络流中抓取出来.在Python中有很多库可以用来抓取网页,我们先学习urllib2. urllib2 是 Python ...

  5. Python 编写一个有道翻译的 workflow 教程

    最近使用有道翻译的 workflow 总是翻译不了,可能是 appKey 失效了或者超过调用上限,所以打算自己实现一个. 创建 workflow 打开 Alfred3 的 Preferences,选择 ...

  6. python有道翻译-使用python2爬取有道翻译

    爬虫的核心思想:模拟浏览器正常访问服务器,一般情况只要浏览器能访问的,都可以爬,如果被反爬,则考虑反复测试添加Request Header数据,知道可以爬取为止. 反爬思路目前知道的有:User-Ag ...

  7. python有道翻译法语-使用python2爬取有道翻译

    爬虫的核心思想:模拟浏览器正常访问服务器,一般情况只要浏览器能访问的,都可以爬,如果被反爬,则考虑反复测试添加Request Header数据,知道可以爬取为止. 反爬思路目前知道的有:User-Ag ...

  8. python语音翻译-python利用有道翻译实现“语言翻译器”的功能

    importurllib.requestimporturllib.parseimportjsonwhileTrue: content= input('请输入需要翻译的内容(退出输入Q):')if co ...

  9. python有道翻译接口-【Python】Python利用有道翻译开发API应用示例

    Python源码是关于Python利用有道翻译开发API应用示例.这是一个很有意思又简单的API应用练习题,方法中用到了有道词典开放API应用,合成的类似于命令行词典应用Python小程序.功能简单, ...

最新文章

  1. 独家 | 感悟注意力机制
  2. Java条形码生成技术-Barcode4j
  3. C语言实验——求一个3*3矩阵对角线元素之和
  4. 国家发改委:分两批在8个地区建设全国一体化算力网络国家枢纽节点
  5. linux ldap客户端工具,OpenLDAP 客户端安装部署
  6. sqlite 修改表名,合并数据库(文件)
  7. php 下拉菜单 搜索,DedeCMS实现百度搜索下拉菜单提示信息功能
  8. Javascript:原型模式类继承
  9. JavaFX官方教程(九)之转换
  10. jsoup爬虫教程技巧_Jsoup V的幕后秘密:优化的技巧和窍门
  11. 推荐一个神器 - 把你的照片随心所欲的摆成各种形状
  12. WPF 中的Width 与 ActualWidth
  13. 清晰架构的 Go 微服务: 程序容器
  14. 计算机无法进系统咋办,详解电脑无法进入系统怎么办
  15. android学习资料免费下载
  16. 横向滑动视图HorizontalScrollView精炼详解
  17. Flink_Flink ON YARN containerized.heap-cutoff-min 内存调整
  18. 阿里云获取手机验证码
  19. 我的世界服务器物品展示怎么得,我的世界物品展示框详解攻略 物品展示框怎么做...
  20. 微信开放平台 安卓Android 应用签名生成

热门文章

  1. squid 出错页面GMT时间修改(FreeBSD)
  2. rsyslod服务配置
  3. HTTP 04 web 服务器
  4. Tensorflow 相关概念
  5. oracle的redo与undio
  6. 开源 免费 java CMS - FreeCMS1.5-数据对象-job
  7. linux_scp 远程复制不需要输入密码
  8. Docker部署自己的短链接服务
  9. TypeScript 基础类型 1
  10. 容器编排技术 -- Kubernetes kubectl edit 命令详解