原理:
1.給一個URL,爬蟲爬取這個url;
2.url中提取HTML中a 標籤內容獲取新的url;
3.再通過新的url再循環以上;
實現代碼:
import java.io.*;
import java.net.*;
public class Dome1 {
public static void main(String[] args){
String s1="<a href=\"http://";
String url="http://www.dangdang.com";
String [] urlconntion=new String[50];
Crawler cr=new Crawler(url,s1,urlconntion);
int i=0;
String s2=cr.find();
//相當於DFS算法,如果爬取到最深的url,已無新的url時,則返回最開始的url開始循環;
while(urlconntion[30]==null){
if(s2==null){
cr=new Crawler(url,s1,urlconntion);
s2=cr.find();
}
System.out.println(s2);
cr=new Crawler(s2, s1,urlconntion);
urlconntion[i++]=s2;
s2=cr.find();
}
System.out.println("打印完畢");
}
}
class Crawler {
String url=null;
String prefix=null;
//爬去過的url地址集合
String[] urlconntion=null;
//爬蟲類的構造函數
Crawler(String url,String prefix,String[] urlconntion){
this.url=url;
this.prefix=prefix;
this.urlconntion=urlconntion;
}
//根據類的url開始爬取新的url實現循環爬取
public String find(){
URL u=null;
URLConnection con=null;
BufferedReader bfr=null;
String rpurl=null;
try {
u=new URL(url);
con=u.openConnection();
InputStream is=con.getInputStream();
bfr=new BufferedReader(new InputStreamReader(is));
String s;
while((s=bfr.readLine())!=null){
if(s.indexOf(prefix)>=0)
{
rpurl=getUrl(s);
if(urlrepetition(rpurl)!=-1){
return rpurl;
}
}
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
try {
bfr.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return null;
}
//判斷url是否被爬去過,如果被爬去可返回-1,如果沒有則返回1
public int urlrepetition(String rpurl){
int i=0;
while(urlconntion[i]!=null){
if(urlconntion[i++].equals(rpurl)){
return -1;
}
}
return 1;
}
//重爬去過的源碼中截取url地址;
public String getUrl(String s){
int index1=s.indexOf(prefix);
s=s.substring(index1+9);
int index2=s.indexOf("\"");
s=s.substring(0,index2);
return s;
}
}
a標籤的內容形式很多,如href=”www.baidu.com” target=”_blank”,我們只需要www.baidu.com,所以我們只需要通過String的,substring函數來截取這部分即可得到新的url並返回。
程序運行結果:
存在的問題:
1.通過java獲取的網頁無法識別中文,出現亂碼
2.獲取的url內容沒判斷是否合法或是否能使用,如果url無法使用則程序會出現異常
3.
while((s=bfr.readLine())!=null){
if(s.indexOf(prefix)>=0)
{
rpurl=getUrl(s);
if(urlrepetition(rpurl)!=-1){
return rpurl;
}
}
}
url的源碼內容是按行讀取的,如果這一行第一個url獲取被爬去過了,那麼這一行就被跳過去了,無法獲取這一行中第二個url。