怎样得到百度搜索结果页面的前50个结果链接对应的网页? 如题,详细的说就是:我搜索“java”,然后出来以很多页的结果,我现在只要前50个结果链接所对应的网页,用java实现把它们保存到自己的硬盘上。希望大侠能给出个思路,当然有算法、源代码最好了。 此致敬礼 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 补充:是要用J2SE的代码来实现,不是用J2EE中的JSP等等。 HttpURLConnection 使用GET方法即可。 注意baidu是GBK的编码类型 给你一段读取页面信息的代码吧!拿到信息后,用正则表达式去匹配页面链接然后再次调用这段代码,把链接对应的页面内容读取下来 /** * 读取页面信息 * @param page 页面的URL * @param charset 页面的编码类型 * @return 页面的字符串,注意换行已经被默认去掉了,如果需要,请看代码的注释部分 */ public static String getPage(String page, String charset) { try { URL url = new URL(page); HttpURLConnection con = (HttpURLConnection) url.openConnection(); BufferedReader reader = new BufferedReader(new InputStreamReader(con.getInputStream(), charset)); StringBuilder b = new StringBuilder(); String line; while ((line = reader.readLine()) != null) { b.append(line); // b.append("\r\n"); // 默认这里没有保存换行,而是让所有的字符出现在一行里面。如果需要,请去掉前面的注释 } return b.toString(); } catch (FileNotFoundException ex) { System.out.println("NOT FOUND:" + page); return null; } catch (ConnectException ex) { System.out.println("Timeout:" + page); return null; } catch (Exception ex) { ex.printStackTrace(); return null; } } 借用下楼上老大的代码,还不够精确,还得改下正则……public static void main(String[] args) { String url = "http://www.baidu.com/s?wd=java"; String str = getPage(url,"gbk"); String reg = "<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\">.*?" + "<a.*? href=\"(.*?)\".*?>(.*?)</a>.*?</table>"; Pattern p = Pattern.compile(reg,Pattern.CASE_INSENSITIVE | Pattern.DOTALL); Matcher m = p.matcher(str); int i = 0; while(m.find()) { System.out.println("第"+i+"个标题:"+m.group(2).replaceAll("<.*?>", "")); System.out.println("第"+i+"个连接:"+m.group(1)); i++; System.out.println(); } } /** * 读取页面信息 * @param page 页面的URL * @param charset 页面的编码类型 * @return 页面的字符串,注意换行已经被默认去掉了,如果需要,请看代码的注释部分 */ public static String getPage(String page, String charset) { try { URL url = new URL(page); HttpURLConnection con = (HttpURLConnection) url.openConnection(); BufferedReader reader = new BufferedReader(new InputStreamReader( con.getInputStream(), charset)); StringBuilder b = new StringBuilder(); String line; while ((line = reader.readLine()) != null) { b.append(line); b.append("\r\n"); } return b.toString(); } catch (FileNotFoundException ex) { System.out.println("NOT FOUND:" + page); return null; } catch (ConnectException ex) { System.out.println("Timeout:" + page); return null; } catch (Exception ex) { ex.printStackTrace(); return null; } } 第一页的程序很简单,用httpclient就可以得到相应页面的东西,用split就可以得到结果。难在第二页啊,百度的规则是复杂的。http://www.baidu.com/s?lm=0&si=&rn=10&ie=gb2312&ct=0&wd=java+%B6%E0%CF%DF%B3%CC&pn=10&ver=0&cl=3 http://www.baidu.com/s?lm=0&si=&rn=10&ie=gb2312&ct=0&wd=java+%B6%E0%CF%DF%B3%CC&pn=20&ver=0&cl=3 http://www.baidu.com/s?ie=gb2312&bs=java+%B6%E0%CF%DF%B3%CC&sr=&z=&cl=3&f=8&wd=java+&ct=0 http://www.baidu.com/s?lm=0&si=&rn=10&ie=gb2312&ct=0&wd=java&pn=10&ver=0&cl=3 http://www.baidu.com/s?lm=0&si=&rn=10&ie=gb2312&ct=0&wd=java&pn=20&ver=0&cl=3百度是php?反正这个规则你得研究啊!然后response。sendredrict()。 关于STRING的问题 下面是个退出语句,如何添加到类中执行起来,举个例子谢谢 java将对象写入文件 请大家来看看这个代码 为什么会出现错误呢 java基础 写个function弹出提示框 Java用线程做动态时间问题(如果自己调用自己的方法。就无法显示JFrame) 也是一个初学者的问题,100分求教! 在Java中如何对Oracle数据库的BFILE字段进行存与取?能否给个例子? 关于Dialog hibernate中如何使用ms sql server 和mysql 怎么确定一个string里是不是有中文
拿到信息后,用正则表达式去匹配页面链接
然后再次调用这段代码,把链接对应的页面内容读取下来
/**
* 读取页面信息
* @param page 页面的URL
* @param charset 页面的编码类型
* @return 页面的字符串,注意换行已经被默认去掉了,如果需要,请看代码的注释部分
*/
public static String getPage(String page, String charset) {
try {
URL url = new URL(page);
HttpURLConnection con = (HttpURLConnection) url.openConnection();
BufferedReader reader = new BufferedReader(new InputStreamReader(con.getInputStream(), charset));
StringBuilder b = new StringBuilder();
String line;
while ((line = reader.readLine()) != null) {
b.append(line);
// b.append("\r\n"); // 默认这里没有保存换行,而是让所有的字符出现在一行里面。如果需要,请去掉前面的注释
}
return b.toString();
} catch (FileNotFoundException ex) {
System.out.println("NOT FOUND:" + page);
return null;
} catch (ConnectException ex) {
System.out.println("Timeout:" + page);
return null;
} catch (Exception ex) {
ex.printStackTrace();
return null;
}
}
String url = "http://www.baidu.com/s?wd=java";
String str = getPage(url,"gbk");
String reg = "<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\">.*?" +
"<a.*? href=\"(.*?)\".*?>(.*?)</a>.*?</table>";
Pattern p = Pattern.compile(reg,Pattern.CASE_INSENSITIVE | Pattern.DOTALL);
Matcher m = p.matcher(str);
int i = 0;
while(m.find())
{
System.out.println("第"+i+"个标题:"+m.group(2).replaceAll("<.*?>", ""));
System.out.println("第"+i+"个连接:"+m.group(1));
i++;
System.out.println();
}
} /**
* 读取页面信息
* @param page 页面的URL
* @param charset 页面的编码类型
* @return 页面的字符串,注意换行已经被默认去掉了,如果需要,请看代码的注释部分
*/
public static String getPage(String page, String charset) {
try {
URL url = new URL(page);
HttpURLConnection con = (HttpURLConnection) url.openConnection();
BufferedReader reader = new BufferedReader(new InputStreamReader(
con.getInputStream(), charset));
StringBuilder b = new StringBuilder();
String line;
while ((line = reader.readLine()) != null) {
b.append(line);
b.append("\r\n");
}
return b.toString();
} catch (FileNotFoundException ex) {
System.out.println("NOT FOUND:" + page);
return null;
} catch (ConnectException ex) {
System.out.println("Timeout:" + page);
return null;
} catch (Exception ex) {
ex.printStackTrace();
return null;
}
}
难在第二页啊,百度的规则是复杂的。http://www.baidu.com/s?lm=0&si=&rn=10&ie=gb2312&ct=0&wd=java+%B6%E0%CF%DF%B3%CC&pn=10&ver=0&cl=3
http://www.baidu.com/s?lm=0&si=&rn=10&ie=gb2312&ct=0&wd=java+%B6%E0%CF%DF%B3%CC&pn=20&ver=0&cl=3
http://www.baidu.com/s?ie=gb2312&bs=java+%B6%E0%CF%DF%B3%CC&sr=&z=&cl=3&f=8&wd=java+&ct=0
http://www.baidu.com/s?lm=0&si=&rn=10&ie=gb2312&ct=0&wd=java&pn=10&ver=0&cl=3
http://www.baidu.com/s?lm=0&si=&rn=10&ie=gb2312&ct=0&wd=java&pn=20&ver=0&cl=3百度是php?反正这个规则你得研究啊!
然后response。sendredrict()。