原创

Java 以 Post 方式实现百度 Sitemap 实时推送

Sitemap 可方便网站管理员通知搜索引擎他们网站上有哪些可供抓取的网页。最简单的 Sitemap 形式,就是XML 文件,在其中列出网站中的网址以及关于每个网址的其他元数据(上次更新的时间、更改的频率以及相对于网站上其他网址的重要程度为何等),以便搜索引擎可以更加智能地抓取网站。

百度提供了多种链接提交方式如下:

1、主动推送:最为快速的提交方式,推荐您将站点当天新产出链接立即通过此方式推送给百度,以保证新链接可以及时被百度收录。

2、sitemap:您可以定期将网站链接放到sitemap中,然后将sitemap提交给百度。百度会周期性的抓取检查您提交的sitemap,对其中的链接进行处理,但收录速度慢于主动推送。

3、手工提交:一次性提交链接给百度,可以使用此种方式。

post 推送示例:

POST /urls?site=www.yoodb.com&token=wkkpNynvtltDW347 HTTP/1.1
User-Agent: curl/7.12.1 
Host: data.zz.baidu.com 
Content-Type: text/plain 
Content-Length: 83 
http://www.example.com/1.html
http://www.example.com/2.html

下面为大家讲述一下 Java 以 Post 方式实现百度 Sitemap 实时推送,具体代码如下:

package com.yoodb.util;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.URL;
import java.net.URLConnection;
import java.util.Arrays;
import java.util.List;
import java.util.Map;

import com.google.gson.Gson;

public class PushSiteMapUtil {

	/**
	 * 推送 Stiemap 到百度
	 * @param url
	 * @return
	 */
	@SuppressWarnings("rawtypes")
	public static boolean push(String url){
		String urlPath = "http://data.zz.baidu.com/urls?site=www.yoodb.com&token=xreflkjfasD";
		try {
			String re = postHttp(urlPath, Arrays.asList(url));
			System.out.println(re);
			Map map = new Gson().fromJson(re, Map.class);
	    	if(map.get("success") !=null && !map.get("success").equals("")){
	    		return true;
	    	}
		} catch (Exception e) {
			return false;
		}
		return false;
	}
	
	/** 
     * 百度链接实时推送 
     * @param postUrl 
     * @param params 
     * @return 
     */  
    private static String postHttp(String url,List<String> params){  
if(null == url || null == params || params.isEmpty()){  
    return null;  
}  
String result = "";  
PrintWriter out = null;  
BufferedReader in = null;  
try {  
    URLConnection conn=new URL(url).openConnection();// 建立URL之间的连接  
    conn.setRequestProperty("Host","data.zz.baidu.com");// 设置通用的请求属性  
    conn.setRequestProperty("User-Agent", "curl/7.12.1");  
    conn.setRequestProperty("Content-Length", "83");  
    conn.setRequestProperty("Content-Type", "text/plain");  
    conn.setDoInput(true);// 发送POST请求必须设置如下两行
    conn.setDoOutput(true);  
    out = new PrintWriter(conn.getOutputStream());// 获取conn对应的输出流  
    String param = "";// 发送请求参数 
    for(String s : params){  
param += s + "\n";
    }  
    out.print(param.trim());  
    out.flush();  
    in = new BufferedReader(new InputStreamReader(conn.getInputStream()));  
    String line;  
    while((line=in.readLine())!= null){  
result += line;  
    }  
} catch (Exception e) {  
    e.printStackTrace();  
} finally{  
    try{  
if(out != null) 
    out.close();  
if(in!= null) 
    in.close();    
    }catch(IOException ex){  
ex.printStackTrace();  
    }  
}  
return result;  
    }  
    
}

测试代码如下:

public static void main(String[] args) {
    	boolean re = PushSiteMapUtil.push("http://blog.yoodb.com/yoodb/article/detail/1074");
    	System.out.println(re);
}

输出结果如下:

{"remain":493,"success":1}
true

推送成功

状态码为200,可能返回以下字段:

字段是否必选参数类型说明
successint成功推送的url条数
remainint当天剩余的可推送url条数
not_same_sitearray由于不是本站url而未处理的url列表
not_validarray不合法的url列表

成功返回示例:

{
    "remain":4999998,
    "success":2,
    "not_same_site":[],
    "not_valid":[]
}

推送失败

状态码为4xx,返回字段有:

字段是否必传类型说明
errorint错误码,与状态码相同
messagestring错误描述

失败返回示例:

{
    "error":401,
    "message":"token is not valid"
}
~阅读全文-人机检测~

微信公众号“Java精选”(w_z90110),专注Java技术干货分享!让你从此路人变大神!回复关键词领取资料:如Mysql、Hadoop、Dubbo、Spring Boot等,免费领取视频教程、资料文档和项目源码。微信搜索小程序“Java精选面试题”,内涵3000+道Java面试题!

涵盖:互联网那些事、算法与数据结构、SpringMVC、Spring boot、Spring Cloud、ElasticSearch、Linux、Mysql、Oracle等

评论

分享:

支付宝

微信