java實現有道翻譯爬蟲


我的博文地址

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代碼

先引入需要的依賴。

		<dependency>
			<groupId>net.dongliu</groupId>
			<artifactId>requests</artifactId>
			<version>5.0.7</version>
		</dependency>
		<!-- https://mvnrepository.com/artifact/commons-codec/commons-codec -->
		<dependency>
			<groupId>commons-codec</groupId>
			<artifactId>commons-codec</artifactId>
			<version>1.13</version>
		</dependency>
		<dependency>
			<groupId>com.alibaba</groupId>
			<artifactId>fastjson</artifactId>
			<version>1.2.47</version>
		</dependency>

然后是主要的實現類

import java.io.IOException;
package com.yang.easySpider;

import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;

import org.apache.commons.codec.digest.DigestUtils;
import net.dongliu.requests.Requests;

public class Fanyi {
	private String msg;
	private String url="http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule";
	private String D="n%A-rKaT5fb[Gy?;N5@Tj";
	private String bv;
	private String salt;
	private String sign;
	private String ts;
	private Map<String,Object> header;
	private Map<String,Object> params;
	public Fanyi()
	{
		params=new HashMap<String,Object>();
		header=new HashMap<String,Object>();
	}
	private Map<String,Object> getParams(String msg)
	{
		params.put("i", setMsg(msg));//設置msg同時更新ts,salt,sign;
		params.put("from","AUTO");
		params.put("to","AUTO");
		params.put("smartresult","dict");
		params.put("client","fanyideskweb");
		params.put("sign",this.sign);
		params.put("bv",this.bv);
		params.put("ts",this.ts);
		params.put("salt",this.salt);
		params.put("doctype","json");
		params.put("version", "2.1");
		params.put("keyfrom", "fanyi.web");
		params.put("action", "FY_BY_REALTlME");
		return params;
	}
	public String getResult(String msg)
	{
		return Requests.post(url).headers(getHeaders()).body(getParams(msg)).send().readToText();
		//得到json格式的文本
	}
	public  void setHeaders(Map<String,Object> header)
	{
		this.header=header;
	}
	public Map<String,Object> getHeaders()
	{
		if(this.header.get("Referer")==null)
		{
			this.header.put("Referer", "http://fanyi.youdao.com/");
		}
		return this.header;
	}
	public void setUserAgent(String UA)
	{
		this.header.put("User-Agent", UA);
		//設置UserAgent
		String cookie=Requests.get("http://fanyi.youdao.com").headers(this.header).send().getHeader("Set-Cookie").split(";")[0]+";";
		//得到Cookie
		
		//設置Cookie
		this.header.put("Cookie", cookie);
		this.bv=getBv(UA);//設置UA的同時要更新bv,因為bv是通過加密UA得到的。
	}
	private String getSalt()
	{
		this.salt=String.valueOf(this.ts)+String.valueOf(((int)Math.random()*10));
		return this.salt;
		
	}
	private String getSign()
	{
		return getMd5("fanyideskweb"+this.msg+this.salt+this.D);
	}
	private String getTs()
	{
		return String.valueOf(System.currentTimeMillis());
	}
	private String getBv(String UserAgent)
	{
		return getMd5(UserAgent);
	}
	private String getMd5(String val)
	{
		return DigestUtils.md5Hex(val);
	}
	public String setMsg(String msg)
	{
		
		this.msg=msg;
		//設置需要翻譯的內容
		this.ts=getTs();//更新ts
		this.salt=getSalt();//更新salt
		//設置翻譯內容的同時更新ts,salt
		this.sign=getSign();
		//有了翻譯內容,salt才能得到sign,網易主要靠此判斷
		return this.msg;
	}
}

  測試一下

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

 

 

 

Ok, 沒有問題,完成。

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM