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,可能返回以下字段:
字段 | 是否必选 | 参数类型 | 说明 |
---|---|---|---|
success | 是 | int | 成功推送的url条数 |
remain | 是 | int | 当天剩余的可推送url条数 |
not_same_site | 否 | array | 由于不是本站url而未处理的url列表 |
not_valid | 否 | array | 不合法的url列表 |
成功返回示例:
{ "remain":4999998, "success":2, "not_same_site":[], "not_valid":[] }
推送失败
状态码为4xx,返回字段有:
字段 | 是否必传 | 类型 | 说明 |
---|---|---|---|
error | 是 | int | 错误码,与状态码相同 |
message | 是 | string | 错误描述 |
失败返回示例:
{ "error":401, "message":"token is not valid" }