首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • 怎样得到百度搜索结果页面的前50个结果链接对应的网页? [已结贴,结贴人:liuquanle]
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-12 23:37:56 楼主
    如题,详细的说就是:

    我搜索“java”,然后出来以很多页的结果,我现在只要前50个结果链接所对应的网页,用java实现把它们保存到自己的硬盘上。

    希望大侠能给出个思路,当然有算法、源代码最好了。

      此致
    敬礼
    20  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-12 23:40:241楼 得分:0
    补充:

    是要用J2SE的代码来实现,不是用J2EE中的JSP等等。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • java2000_net
    • 等级:
    发表于:2008-05-14 07:03:352楼 得分:0
    HttpURLConnection 使用GET方法即可。 注意baidu是GBK的编码类型
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • java2000_net
    • 等级:
    发表于:2008-05-14 07:10:103楼 得分:10
    给你一段读取页面信息的代码吧!
    拿到信息后,用正则表达式去匹配页面链接
    然后再次调用这段代码,把链接对应的页面内容读取下来

    Java code
    /** * 读取页面信息 * @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; } }
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-14 11:14:434楼 得分:0
    做个记号以便日后学习~~~
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • lisl2003
    • 等级:
    发表于:2008-05-14 12:12:035楼 得分:0
    引用 4 楼 wsm106 的回复:
    做个记号以便日后学习~~~
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-14 16:40:376楼 得分:0
    引用 5 楼 lisl2003 的回复:
    引用 4 楼 wsm106 的回复:
    做个记号以便日后学习~~~

    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • varlj
    • 等级:
    发表于:2008-05-14 20:56:127楼 得分:8
    借用下楼上老大的代码,还不够精确,还得改下正则……
    Java code
    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; } }



    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • java2000_net
    • 等级:
    发表于:2008-05-15 06:12:448楼 得分:0
    正则还是让楼主自己练习吧,某些程序员需要的是思路,某些需要的是代码。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-15 17:08:249楼 得分:0
    引用 4 楼 wsm106 的回复:
    做个记号以便日后学习~~~
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • lisl2003
    • 等级:
    发表于:2008-05-16 11:20:1810楼 得分:0
    正则表达式很强悍
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-17 22:58:2611楼 得分:0
    该回复于2008-06-30 11:23:56被版主删除
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-17 23:22:0012楼 得分:0
    这个正则表达式不知道写。。。

    此程序只得出了第一页的结果,第二页的结果是在哪里修改才能得到呢?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • zidasine
    • 等级:
    发表于:2008-05-18 11:10:4213楼 得分:0
    引用 11 楼 JakkySky 的回复:
    引用 4 楼 wsm106 的回复:
    做个记号以便日后学习~~~
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-19 14:12:2114楼 得分:2
    第一页的程序很简单,用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()。
    修改 删除 举报 引用 回复

    网站简介广告服务网站地图帮助联系方式诚聘英才English 问题报告
    北京创新乐知广告有限公司 版权所有 京 ICP 证 070598 号
    世纪乐知(北京)网络技术有限公司 提供技术支持
    Copyright © 2000-2008, CSDN.NET, All Rights Reserved