怎样抓取Google搜索结果?

liuquanle 2008-05-28 07:34:47
为什么通过正则表达式分析google的搜索结果页面代码来抓取结果的标题和链接不成功,而百度的却能成功?

public class SaveURL{

public static String savepath_SaveURL="d:\\";//默认路径为D盘根目录
static String title=null;
static String link=null;
static String localFile=null;//保存为本地文件后的路径
static String res=null;

public static void go() {
//String url= "http://www.baidu.com/s?wd=accenture&rn=10";
String url="http://www.google.com/search?hl=en&newwindow=1&q=hello&start=0&sa=N&num=30";
String content = getPage(url);//得到url所对应的网页的内容


// 对应百度<table border="0" cellpadding="0" cellspacing="0">等的正则表达式
// 为什么快照的链接没有被下载下来?

//String reg = "<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\">.*?"+
//"<a.*? href=\"(.*?)\".*?>(.*?)</a>.*?</table>";

//Google对应的正则式
String reg = "<h2 class=r>"+"<a href=\"(.*?)\".*?>(.*?)</a></h2>";
Pattern p = Pattern.compile(reg,Pattern.CASE_INSENSITIVE | Pattern.DOTALL);
Matcher m = p.matcher(content);

int i = 1;

while(m.find())
{
title=m.group(2).replaceAll("<.*?>", "");//正则表达式
link=m.group(1);

System.out.println("----------------------------------------------");
System.out.println("第"+i+"个标题:"+title);
System.out.println("第"+i+"个链接:"+link);

i++;
}//end of while

}

public static String getPage(String page) {
try {

URL url = new URL(page);
HttpURLConnection con = (HttpURLConnection) url.openConnection();

// 以下是修正Server returned HTTP response code: 403 for URL的代码
// 通常是因为服务器的安全设置不接受Java程序作为客户端访问,解决方案是设置客户端的User Agent
con.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0;Windows NT; DigExt)");

BufferedReader reader = new BufferedReader(new InputStreamReader(
con.getInputStream()));
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){
go();
}

}



如果打开google的结果目录页,查看源代码的结构,是和百度的差别不大啊,就是google的每个结果都是放在一个<div></div>中<h2 class=r>里边,而百度里边的是放在一个<table></table>标签里,为什么Google的会得不到呢?

请高手帮忙解释下。
谢谢。
...全文
766 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
另外楼主 百度 的链接,也不是很好,会把下面相关搜索的链接也查出来,呵呵,改了一下:

String reg = "<a onclick=\"return c[^>]+href=\"(.+?)\"[^>]*>(.*?)</a>";
  • 打赏
  • 举报
回复
感觉挺奇怪的

查看源代码的是:

<div class=g><h2 class=r><a href="http://www.hello.com/" target=_blank class=l onmousedown="return clk(0,'','','res','1','')"><b>Hello</b></a></h2>

而链接读出来的是:

<div class=g><a href="http://www.hello.com/" target=_blank class=l onmousedown="return clk(0,'','','res','1','')"><b>Hello</b></a>

h2 标签竟然没有了!

把 h2 标签去掉,或者改成下面的表达式就行了。

String reg = "<div class=g[^>]*><a href=\"(.+?)\"[^>]*>(.+?)</a>";
liuquanle 2008-05-29
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 bao110908 的回复:]
另外楼主 百度 的链接,也不是很好,会把下面相关搜索的链接也查出来,呵呵,改了一下:


Java codeString reg = "<a onclick=\"return c[^>]+href=\"(.+?)\"[^>]*>(.*?)</a>";
[/Quote]

谢谢bao110908,是的,这个问题一直没有管它,因为正则式小弟真没学过。。。
liuquanle 2008-05-29
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 adminxp 的回复:]
google有开放API,可以使用
[/Quote]


这个我找到google的code,但不知道哪个才是,为什么高人说话通常都只说一半呢?
adminxp 2008-05-28
  • 打赏
  • 举报
回复
google有开放API,可以使用
zhaoyong209 2008-05-28
  • 打赏
  • 举报
回复
记号。
liuquanle 2008-05-28
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 yibunengjing 的回复:]
这个说到底还是程序问题,仔细推敲下代码吧,既然百度能抓了,google不成问题
[/Quote]

兄弟,谢谢你的回复。

但我贴出代码的本意就是自己已经没法解决这个问题或者是进入了一个怪圈了,所以才让旁人来看看到底是什么问题啊,不要搞这么不痛不痒的回答嘛,^_^。
yibunengjing 2008-05-28
  • 打赏
  • 举报
回复
这个说到底还是程序问题,仔细推敲下代码吧,既然百度能抓了,google不成问题

62,615

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧