• 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

  • 相关阅读:
    我的java学习之路--Reflect专题
    jQuery——动态给表格添加序号
    jQuery操作表格(table)的常用方法、技巧汇总
    Jquery如何删除table里面checkbox选中的多个行
    Mybatis问题:There is no getter for property named 'unitId' in 'class java.lang.String'
    jquery 遍历表格,需要表格中每个td的内容
    用jquery怎么删除<table>的一行
    xml报错 Parse Fatal Error :在实体引用中,实体名称必须紧跟在'&'后面
    mybatis做like模糊查询
    javascript eval和JSON之间的联系
  • 原文地址:https://www.cnblogs.com/lingdurebing/p/11618902.html
Copyright © 2020-2023  润新知