我的博文地址

https://www.cnblogs.com/lingdurebing/p/11618902.html

使用的库

1.commons-codec

主要是为了加密,可以直接用java原生的,这里偷懒了,有点大才小用的感觉。

2.requests-5.0.7

大佬写的java 类似python的requests库

github地址:https://github.com/zhangjingpu/requests

和python的requests用法差不多。

3.fastjson

主要为了解析json字符串,没有要求。

4.实现

  实现在上面博文里说的很详细,有道翻译的加密基本没改,唯一修改的就是字符串D: n%A-rKaT5fb[Gy?;N5@Tj

这里主要贴java代码

先引入需要的依赖。

  1. <dependency>
  2. <groupId>net.dongliu</groupId>
  3. <artifactId>requests</artifactId>
  4. <version>5.0.7</version>
  5. </dependency>
  6. <!-- https://mvnrepository.com/artifact/commons-codec/commons-codec -->
  7. <dependency>
  8. <groupId>commons-codec</groupId>
  9. <artifactId>commons-codec</artifactId>
  10. <version>1.13</version>
  11. </dependency>
  12. <dependency>
  13. <groupId>com.alibaba</groupId>
  14. <artifactId>fastjson</artifactId>
  15. <version>1.2.47</version>
  16. </dependency>

然后是主要的实现类

  1. import java.io.IOException;
  2. package com.yang.easySpider;
  3.  
  4. import java.io.IOException;
  5. import java.io.InputStream;
  6. import java.util.HashMap;
  7. import java.util.Map;
  8. import java.util.Properties;
  9.  
  10. import org.apache.commons.codec.digest.DigestUtils;
  11. import net.dongliu.requests.Requests;
  12.  
  13. public class Fanyi {
  14. private String msg;
  15. private String url="http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule";
  16. private String D="n%A-rKaT5fb[Gy?;N5@Tj";
  17. private String bv;
  18. private String salt;
  19. private String sign;
  20. private String ts;
  21. private Map<String,Object> header;
  22. private Map<String,Object> params;
  23. public Fanyi()
  24. {
  25. params=new HashMap<String,Object>();
  26. header=new HashMap<String,Object>();
  27. }
  28. private Map<String,Object> getParams(String msg)
  29. {
  30. params.put("i", setMsg(msg));//设置msg同时更新ts,salt,sign;
  31. params.put("from","AUTO");
  32. params.put("to","AUTO");
  33. params.put("smartresult","dict");
  34. params.put("client","fanyideskweb");
  35. params.put("sign",this.sign);
  36. params.put("bv",this.bv);
  37. params.put("ts",this.ts);
  38. params.put("salt",this.salt);
  39. params.put("doctype","json");
  40. params.put("version", "2.1");
  41. params.put("keyfrom", "fanyi.web");
  42. params.put("action", "FY_BY_REALTlME");
  43. return params;
  44. }
  45. public String getResult(String msg)
  46. {
  47. return Requests.post(url).headers(getHeaders()).body(getParams(msg)).send().readToText();
  48. //得到json格式的文本
  49. }
  50. public void setHeaders(Map<String,Object> header)
  51. {
  52. this.header=header;
  53. }
  54. public Map<String,Object> getHeaders()
  55. {
  56. if(this.header.get("Referer")==null)
  57. {
  58. this.header.put("Referer", "http://fanyi.youdao.com/");
  59. }
  60. return this.header;
  61. }
  62. public void setUserAgent(String UA)
  63. {
  64. this.header.put("User-Agent", UA);
  65. //设置UserAgent
  66. String cookie=Requests.get("http://fanyi.youdao.com").headers(this.header).send().getHeader("Set-Cookie").split(";")[0]+";";
  67. //得到Cookie
  68.  
  69. //设置Cookie
  70. this.header.put("Cookie", cookie);
  71. this.bv=getBv(UA);//设置UA的同时要更新bv,因为bv是通过加密UA得到的。
  72. }
  73. private String getSalt()
  74. {
  75. this.salt=String.valueOf(this.ts)+String.valueOf(((int)Math.random()*10));
  76. return this.salt;
  77.  
  78. }
  79. private String getSign()
  80. {
  81. return getMd5("fanyideskweb"+this.msg+this.salt+this.D);
  82. }
  83. private String getTs()
  84. {
  85. return String.valueOf(System.currentTimeMillis());
  86. }
  87. private String getBv(String UserAgent)
  88. {
  89. return getMd5(UserAgent);
  90. }
  91. private String getMd5(String val)
  92. {
  93. return DigestUtils.md5Hex(val);
  94. }
  95. public String setMsg(String msg)
  96. {
  97.  
  98. this.msg=msg;
  99. //设置需要翻译的内容
  100. this.ts=getTs();//更新ts
  101. this.salt=getSalt();//更新salt
  102. //设置翻译内容的同时更新ts,salt
  103. this.sign=getSign();
  104. //有了翻译内容,salt才能得到sign,网易主要靠此判断
  105. return this.msg;
  106. }
  107. }

  测试一下

  1. public static void main( String[] args )
  2. {
  3. Fanyi fanyi=new Fanyi();
  4. fanyi.setUserAgent("Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36");
  5. String st=fanyi.getResult("hello");
  6. System.out.print(st);
  7. JSONObject json=JSONObject.parseObject(st);
  8. JSONArray ja=(JSONArray) ((JSONArray) json.get("translateResult")).get(0);
  9. JSONObject js=(JSONObject) ja.get(0);
  10. System.out.print(js.get("tgt"));
  11.  
  12. }

 

Ok, 没有问题,完成。

参考博文连接地址:https://blog.csdn.net/suixinlun/article/details/93976400

java实现有道翻译爬虫的更多相关文章

  1. Selenium+PhantomJS实现简易有道翻译爬虫

    Selenium一款自动化测试工具,当然用来写爬虫也是没有问题的.它支持Chrome.Safari.Firefox等主流界面式浏览器,另外它也支持多种语言开发,比如 Java,C,Ruby,Pytho ...

  2. python学习笔记(6)--有道翻译爬虫

    说明: 1. 导入三个模块,urllib.request.urlopen用来打开url链接,urllib.parse的urlencode方法将浏览器network里的data对象转为urlopen的第 ...

  3. Python 有道翻译 爬虫 有道翻译API 突破有道翻译反爬虫机制

    py2.7 #coding: utf-8 import time import random import hashlib import requests while(1): url = 'http: ...

  4. 爬虫新手学习2-爬虫进阶(urllib和urllib2 的区别、url转码、爬虫GET提交实例、批量爬取贴吧数据、fidder软件安装、有道翻译POST实例、豆瓣ajax数据获取)

    1.urllib和urllib2区别实例 urllib和urllib2都是接受URL请求相关模块,但是提供了不同的功能,两个最显著的不同如下: urllib可以接受URL,不能创建设置headers的 ...

  5. Java接口测试之使用有道翻译API

    写接口测试框架,找了有道翻译API来当测试数据 package com.httpGetTest; import java.beans.Encoder; import java.net.URLEncod ...

  6. python3爬虫:利用urllib与有道翻译获得翻译结果

    在实现这一功能时遇到了一些困难,由于按照<零基础入门python>中的代码无法实现翻译,会爆出“您的请求来源非法,商业用途使用请关注有道翻译API官方网站“有道智云”: http://ai ...

  7. 爬虫实战2_有道翻译sign破解

    目标url 有道翻译 打开网站输入要翻译的内容,一一查找network发现数据返回json格式,红框就是我们的翻译结果 查看headers,发现返回结果的请求是post请求,且携带一大堆form_da ...

  8. (未完成...)Python3网络爬虫(2):利用urllib.urlopen向有道翻译发送数据并获得翻译结果

    环境: 火狐浏览器 pycharm2017.3.3 python3.5 1.url不仅可以是一个字符串,例如:http://www.baidu.com.url也可以是一个Request对象,这就需要我 ...

  9. python爬虫-有道翻译-js加密破解

    有道翻译-js加密破解 这是本地爬取的网址:http://fanyi.youdao.com/ 一.分析请求 我们在页面中输入:水果,翻译后的英文就是:fruit.请求携带的参数有很多,先将参数数据保存 ...

随机推荐

  1. 前端架构师亲述:前端工程师成长之路的 N 问 及 回答

    问题回答者:黄轶,目前就职于 Zoom 公司担任前端架构师,曾就职于滴滴和百度. 1. 前端开发 问题 大佬,能分享下学习路径么,感觉天天忙着开发业务,但是能力好像没有太大提升,不知道该怎么充实自己 ...

  2. NLP(十二)指代消解

    代词是用来代替重复出现的名词 例句: 1.Ravi is a boy. He often donates money to the poor. 先出现主语,后出现代词,所以流动的方向从左到右,这类句子 ...

  3. CF 538 D. Flood Fill 递归 区间DP

    link:https://codeforces.com/contest/1114/problem/D 题意: 给定一个数组,有不同的颜色,你可以从任意一个位置开始,改变颜色,相邻的是同一种颜色的位子的 ...

  4. PAT L3-017. 森森快递

    L3-017. 森森快递 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 俞勇(上海交通大学) 森森开了一家快递公司,叫森森快递.因为 ...

  5. Ubuntu18.04双系统下安装CUDA10+cuDNN7.5

    前言 本篇写于2019-4-25 这两天装Ubuntu18.04双系统简直装到崩溃.一是非常著名的开机卡死在Logo界面的问题,另一个是在装Nvidia驱动和CUDA的时候,更是费心.而网上的资料又良 ...

  6. Spring@Autowired java.lang.NullPointerException 空指针

    在使用@Autowired注解注入出现的空指针  java.lang.NullPointerException  可能存在的错误原因: 1.注解的扫描有问题 在xml配置了这个标签后,spring可以 ...

  7. CentOS7.6中mysql实践

    cat /etc/redhat-release CentOS Linux release 7.6.1810 (Core) 使用:yum -y install mysql mysql-server 安装 ...

  8. 策略模式+注解 干掉业务代码中冗余的if else...

    前言: 之前写过一个工作中常见升级模式-策略模式 的文章,里面讲了具体是怎样使用策略模式去抽象现实中的业务代码,今天来拿出实际代码来写个demo,这里做个整理来加深自己对策略模式的理解.   一.业务 ...

  9. Winform中对ZedGraph的RadioGroup进行数据源绑定,即通过代码添加选项

    场景 在寻找设置RadioGroup的选项时没有找到相关博客,在DevExpress的官网找到 怎样给其添加选项. DevExpress官网教程: https://documentation.deve ...

  10. 以商品超卖为例讲解Redis分布式锁

    本案例主要讲解Redis实现分布式锁的两种实现方式:Jedis实现.Redisson实现.网上关于这方面讲解太多了,Van自认为文笔没他们好,还是用示例代码说明. 一.jedis 实现 该方案只考虑R ...