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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.