import java.util.Scanner;
import java.util.ArrayList;
//util是utility的縮寫,代表是工具類
public class WebCrawler{
public static void main(String[] args){
Scanner in = new Scanner(System.in);
System.out.print("Enter a URL: ");
String url =in.nextLine();
crawler(url);
in.close();
}
public static void crawler(String statrtingURL){
//一個存放將要遍歷的
ArrayList<String> listOfPendingURLs = new ArrayList<String>();
//一個存放已經被遍歷過的
ArrayList<String> listOfTraversedURLs = new ArrayList<String>();
listOfPendingURLs.add(statrtingURL);//開始的URL
while (!listOfPendingURLs.isEmpty() && listOfTraversedURLs.size()<=100){
//ArrayList類型的remove(0)方法可以去除索引值爲0的元素,並返回該元素<--String類型
String urlString = listOfPendingURLs.remove(0);
//如果沒有在這個列表裏面添加進去;如果有的話,不執行if進入到下一次循環
if(!listOfTraversedURLs.contains(urlString)){
listOfTraversedURLs.add(urlString);
//添加並打印
System.out.println("Crawl "+ urlString);
//foreach循環,遍歷list,這裏的String s完全就是個代指吧
for(String s : getSubURLs(urlString)){
if(!listOfTraversedURLs.contains(s)){
//加入到這個列表之後,打印在前面
listOfPendingURLs.add(s);
}
}
}
}
}
//字符串操作,數組操作,列表操作
//返回什麼位置,按照什麼去重-->java本身提供的API
public static ArrayList<String> getSubURLs(String urlString){
ArrayList<String> list = new ArrayList<String>();
try {
//字符串類型的參數傳入構造java.net.URL這個對象
//就像把本地文件的路徑 這個字符串 構造成一個 File對象,File對象是對本地文件描述符的抽象
java.net.URL url = new java.net.URL(urlString);
//仍然是提供一個輸入流,openStream()調用操作系統中的socket套接字,讓socket連遠程的服務器這個位置,讀取內容後返回讓Scanner調用讀取的這個流
Scanner in = new Scanner(url.openStream());
//下面就是字符串操作的問題
int current = 0;
while(in.hasNext()){//當下一個還能讀的時候
String line = in.nextLine();//讀入這一行,命名爲line,這一行裏面有多個http,多個url
//這個是不是其實不算爬蟲?它只是不停地讀一行然後另一行而並不涉及順着這個url到另一個url的頁面然後遍歷全網?
//保存第一次出現http的位置,把第一個url開始的位置變成http的後面;indexOf(,)返回在此字符串中第一次出現指定字符處的索引,從指定的索引開始搜索。
current = line.indexOf("http:",current);
while(current>0){
//注意引號裏面的不能變啊!
int endIndex = line.indexOf( "\"",current);//轉義結束符,但是如果結束符在下一行,就會忽略一個鏈接了
if(endIndex>0){//Ensure that a correct URL is found
//如果還有url,加入到list裏面
list.add(line.substring(current,endIndex));
//注意引號裏面的不能變啊!
current = line.indexOf("http:",endIndex);
}else{
current = -1;
}
}
}
in.close();
}
catch(Exception ex){
System.out.println("Error: " + ex.getMessage());
}
return list;
}
}
WebCralwer_java
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.