上百度搜東西的時(shí)候,右邊總有一些推薦的東西很吸引我們的注意,因?yàn)槟鞘前俣鹊耐扑]系統(tǒng)給我推薦的我們感興趣的東西。
那這些推薦的內(nèi)容也在源代碼里面出現(xiàn)了。
所以采用類似分析網(wǎng)頁(yè)源代碼的方法我們能夠把里面的東西全都挖下來(lái)。
比如說(shuō)我在百度搜索了“一句話木馬”,百度就會(huì)跳到一個(gè)固定的鏈接:
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&rsv_t=6f62cGPSB5k0xYiyhhPSjjDXemE9KEBVk0diG3YR6PnVzpq1vmoq%2FDdFD8E&rsv_enter=1&rsv_n=2&rsv_sug3=1
好長(zhǎng)是不?
其實(shí)我們可以將這個(gè)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=一句話木馬
網(wǎng)頁(yè)的右側(cè)出現(xiàn)了三個(gè)欄:“相關(guān)病毒”,“相關(guān)人物”和“其他人還搜”,直覺告訴我第一個(gè)是聯(lián)系比較緊密的。
所以我的目的就是變成找出第一個(gè)欄(不光是這里)的所有推薦內(nèi)容。
分析網(wǎng)頁(yè)會(huì)發(fā)現(xiàn)每個(gè)欄目最前面都會(huì)有一個(gè)標(biāo)志性的字符串:"<span title="
而每個(gè)欄目里面的每個(gè)內(nèi)容前面也會(huì)有一個(gè)標(biāo)志性的字符串:"rsv_re_ename"
據(jù)此我寫了一個(gè)分析的FinderRelate類,其中的getRelate(String word)用于獲得關(guān)鍵詞word對(duì)應(yīng)的推薦的內(nèi)容。
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 == false) continue;
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]);
}
}
其輸出結(jié)果如下: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 == false) continue;
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尾巴
熊貓燒香
歡樂時(shí)光病毒
灰鴿子
大小姐木馬
盜號(hào)
機(jī)器狗
盜號(hào)木馬
冰河木馬
沖擊波病毒
莫里斯蠕蟲
asp木馬
cih病毒
火焰病毒