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);//开始的URLwhile (!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本身提供的APIpublic 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;}
}

最新文章

  1. go语言的defer语句
  2. _matroska_decode_buffer in
  3. javascript搜索框联想搜索_js实现输入框联想搜索
  4. python 类-如何理解python的类与对象?
  5. html5跨域 postmessage,html5跨域通讯之postMessage的用法总结
  6. 软件定义存储的定制化怎么走?
  7. mysql登录错误1045修改工具_mysql登录1045错误时 修改登录密码
  8. python怎么读数据库的数据_python从数据库读取出来的字典怎么更加方便的插入数据库...
  9. 从折叠屏到AR 三星Galaxy新品预热宣传片大招频现
  10. 网络常用协议 SSH、SSL
  11. Ubuntu 更改文件夹权限
  12. 基于java人脸识别考勤签到系统设计与实现毕业设计毕设作品
  13. jQuery篮球计分器
  14. 调用ISBN接口查询图书的信息
  15. 两年数据对比柱形图_呕心整理4大类12个图表类型,轻松搞定数据可视化
  16. Axure的灯箱效果说明
  17. 同济大学C++mooc第12讲:文件
  18. 博士申请 | 美国密歇根州立大学ACTION Lab招收CV/ML方向全奖博士生
  19. 原生JS 实现网易云音乐
  20. 微信小程序模拟车位选择功能(简陋版本)

热门文章

  1. Excel图表1——双坐标图(双柱图)
  2. 微信公众服务号申请、认证(开通支付)-微信开发图文教程
  3. ISTQB认证考试攻略大全(2018版)
  4. 一款好用、易扩展的文件解析引擎,是怎么演变而来的
  5. [Groovy]Groovy with Ant Task
  6. uwb定位管理系统的介绍
  7. java 定义二维数组_java定义二维数组的几种写法(小结)
  8. 根据CTP接口计算现手、增仓、开平、对手盘 (2)
  9. 英语学术论文写作概述
  10. 生物学和计算机学哪个好,生物学和计算机