通过JAVA的API可以顺利的抓取网络上的大部分指定的网页内容,现与大家分享一下这方法理解与心得。最简单的一种抓取方法就是:
- URL url = new URL(myurl);
- BufferedReader br = new BufferedReader(newInputStreamReader(url.openStream()));
- String s = "";
- StringBuffer sb = new StringBuffer("");
- while ((s = br.readLine()) != null) {
- i++;
- sb.append(s+"\r\n");
- }
URL url = new URL(myurl);
BufferedReader br = new BufferedReader(newInputStreamReader(url.openStream()));
String s = "";
StringBuffer sb = new StringBuffer("");
while ((s = br.readLine()) != null) {
i++;
sb.append(s+"\r\n");
}
这种方法抓取一般的网页应该没有问题,但当有些网页中存在一些嵌套的redirect连接时,它就会报Server redirected too many times这样的错误,这是因为此网页内部又有一些代码是转向其它网页的,循环过多导致程序出错。如果只想抓取本URL中的网页内容,而不愿意让它有其它 的网页跳转,可以用以下的代码。
- URL urlmy = new URL(myurl);
- HttpURLConnection con = (HttpURLConnection) urlmy.openConnection();
- con.setFollowRedirects(true);
- con.setInstanceFollowRedirects(false);
- con.connect();
- BufferedReader br = new BufferedReader(new InputStreamReader(con.getInputStream(),"UTF-8"));
- String s = "";
- StringBuffer sb = new StringBuffer("");
- while ((s = br.readLine()) != null) {
- sb.append(s+"\r\n");
- }
URL urlmy = new URL(myurl);
HttpURLConnection con = (HttpURLConnection) urlmy.openConnection();
con.setFollowRedirects(true);
con.setInstanceFollowRedirects(false);
con.connect();
BufferedReader br = new BufferedReader(new InputStreamReader(con.getInputStream(),"UTF-8"));
String s = "";
StringBuffer sb = new StringBuffer("");
while ((s = br.readLine()) != null) {
sb.append(s+"\r\n");
}
这样的话,抓取的时候程序就不会跳换其它页面去抓取其它的内容了,这就达到我们的目的了。
如果是我们是处于内部网的话,还需要专门给它加上代理, Java以特殊的系统属性为代理服务器提供支持,只要在上面的程序加上以下程序就可以了。
- System.getProperties().setProperty( "http.proxyHost", proxyName );
- System.getProperties().setProperty( "http.proxyPort", port );
System.getProperties().setProperty( "http.proxyHost", proxyName );
System.getProperties().setProperty( "http.proxyPort", port );
这样的话就可以实现处于内部网中而向互联网抓取自己想要的东西了。
上面的程序抓取回来的全部内容都存放在sb这个字符串,我们就可以通过正则表达式对它进行分析,提取出自己想要的具体的内容,为我所用!