无忧无虑

Java获得某个关键词在百度搜索中的推荐内容

上百度搜东西的时候,右边总有一些推荐的东西很吸引我们的注意,因为那是百度的推荐系统给我推荐的我们感兴趣的东西。

那这些推荐的内容也在源代码里面出现了。

所以采用类似分析网页源代码的方法我们能够把里面的东西全都挖下来。

比如说我在百度搜索了“一句话木马”,百度就会跳到一个固定的链接:

https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&rsv_idx=1&tn=baidu&

wd=%E4%B8%80%E5%8F%A5%E8%AF%9D%E6%9C%A8%E9%A9%AC&rsv_pq=fcb3de5b00004128&

6f62cGPSB5k0xYiyhhPSjjDXemE9KEBVk0diG3YR6PnVzpq1vmoq%2FDdFD8E&rsv_enter=1&rsv_n=2&rsv_sug3=1

好长是不?

其实我们可以将这个url缩短一下,变成:

http://www.baidu.com/s?wd=%E4%B8%80%E5%8F%A5%E8%AF%9D%E6%9C%A8%E9%A9%AC

等同于

http://www.baidu.com/s?wd=一句话木马

网页的右侧出现了三个栏:“相关病毒”,“相关人物”和“其他人还搜”,直觉告诉我第一个是联系比较紧密的。

所以我的目的就是变成找出第一个栏(不光是这里)的所有推荐内容。

分析网页会发现每个栏目最前面都会有一个标志性的字符串:"<span title="

而每个栏目里面的每个内容前面也会有一个标志性的字符串:"rsv_re_ename"

据此我写了一个分析的FinderRelate类,其中的getRelate(String word)用于获得关键词word对应的推荐的内容。

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.StringTokenizer;


public class FindRelate {
    
    public static String[] getRelate(String word) throws Exception {
        String urlString = "http://www.baidu.com/s?wd=" + word;
        String ans = "";
        String s_span = "<span title=";
        int len_span = s_span.length();
        String s_rsv = "rsv_re_ename";
        int len_rsv = s_rsv.length();
        
        URL url = new URL(urlString);
        HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
        BufferedReader reader = new BufferedReader(new InputStreamReader(urlConnection.getInputStream(), "utf-8"));
        String line;
        boolean ok = false;
        while ((line = reader.readLine()) != null){
            int len = line.length();
             for(int i=0;i+len_span<=len;i++) {
                 if(line.substring(i, i+len_span).equals(s_span)) {
                     if(ok == false) ok = true;
                     else {
                         StringTokenizer st = new StringTokenizer(ans);
                         int n = st.countTokens();
                         String[] res = new String[n];
                         for(int j=0;j<n;j++) {
                             res[j] = st.nextToken();
                         }
                         return res;
                     }
                 }
             }
             if(ok == falsecontinue;
             for(int i=0;i+len_rsv<=len;i++) {
                 if(line.substring(i, i+len_rsv).equals(s_rsv)) {
                     for(int j=i+len_rsv+3;j<len && line.charAt(j)!='\'';j++) {
                         ans += line.charAt(j);
                     }
                     ans += " ";
                 }
             }
        }
        String[] null_res = new String[1];
        null_res[0] = null;
        return null_res;
    }
    public static void main(String[] args) throws Exception {
        String[] res = getRelate("一句话木马");
        int len = res.length;
        for(int i=0;i<len;i++)
            System.out.println(res[i]);
    }
}

其输出结果如下:

广外女生木马

qq尾巴

熊猫烧香

欢乐时光病毒

灰鸽子

大小姐木马

盗号

机器狗

盗号木马

冰河木马

冲击波病毒

莫里斯蠕虫

asp木马

cih病毒

火焰病毒