关于一个简单的网络爬虫源码分析
2016-10-25 21:47
441 查看
该爬虫的算法描述如下:
将起始的URL添加到名为listOfPendingURLs的列表中;
当listOfPendingURLs不为空并且listOfTraversedURLs的长度<=100{
从listOfPendingURLs中移除一个URL;
如果该URL不在listOfTraversedURLs中;
显示该URL
读取该URL的页面,并且对该页面包含的每个URL进行如下操作{
如果不在listOfTraversedURLs中,则将其添加到listOfPendingURLs中;
}
}
源代码:import java.util.Scanner;
import java.util.ArrayList;
import java.net.URL;
public class WebCrawler
{
public static void main(String[] args)
{
Scanner input=new Scanner(System.in);
System.out.print("Enter a URL: ");
String url=input.nextLine();
crawler(url);
}
public static void crawler(String startingURL){
//listOfPendingURLs集合用于储存从网页中读取出来的URL,listOfTraversedURLs集合用于储存已经都去过数据的URL
ArrayList<String> listOfPendingURLs=new ArrayList<>();
ArrayList<String> listOfTraversedURLs=new ArrayList<>();
listOfPendingURLs.add(startingURL);
while(!listOfPendingURLs.isEmpty()&&listOfTraversedURLs.size()<=100){
//移除listOfPendingURLs集合中的第一个URL,并将其添加到listOfTraversedURLs集合中,然后读取该移除的URL中的URL
String urlString=listOfPendingURLs.remove(0);
if(!listOfTraversedURLs.contains(urlString)){
listOfTraversedURLs.add(urlString);
System.out.println("Crawl "+urlString);
for(String s:getSubURLs(urlString)){
//将list集合中所有数据添加到listOfPendingURLs集合中
if(!listOfTraversedURLs.contains(s))
listOfPendingURLs.add(s);
}
}
}
}
//该方法的作用是读取urling该URL中的所有URL,并将其储存在list集合之中
public static ArrayList<String> getSubURLs(String urlString){
ArrayList<String> list=new ArrayList<>();
try{
//假如要从一个URL中读取数据,如下两语句是必须进行的
URL url=new URL(urlString);
Scanner input=new Scanner(url.openStream());
int current=0;
while(input.hasNext()){
//line为该URL中的一行数据
String line=input.nextLine();
//URL的格式为以http开头,以(")结束,这个要求是自己定义的
current=line.indexOf("http",current);
while(current>0){
//假如这个URL存在,那么将其储存在list集合中,假如不存在,current=-1;
int endIndex=line.indexOf("\"",current);//???
if(endIndex>0){
list.add(line.substring(current,endIndex));
current=line.indexOf("http:",endIndex);
}
else
current=-1;
}
}
}
catch(Exception ex){
System.out.println("Error: "+ex.getMessage());
}
return list;
}
}
将起始的URL添加到名为listOfPendingURLs的列表中;
当listOfPendingURLs不为空并且listOfTraversedURLs的长度<=100{
从listOfPendingURLs中移除一个URL;
如果该URL不在listOfTraversedURLs中;
显示该URL
读取该URL的页面,并且对该页面包含的每个URL进行如下操作{
如果不在listOfTraversedURLs中,则将其添加到listOfPendingURLs中;
}
}
源代码:import java.util.Scanner;
import java.util.ArrayList;
import java.net.URL;
public class WebCrawler
{
public static void main(String[] args)
{
Scanner input=new Scanner(System.in);
System.out.print("Enter a URL: ");
String url=input.nextLine();
crawler(url);
}
public static void crawler(String startingURL){
//listOfPendingURLs集合用于储存从网页中读取出来的URL,listOfTraversedURLs集合用于储存已经都去过数据的URL
ArrayList<String> listOfPendingURLs=new ArrayList<>();
ArrayList<String> listOfTraversedURLs=new ArrayList<>();
listOfPendingURLs.add(startingURL);
while(!listOfPendingURLs.isEmpty()&&listOfTraversedURLs.size()<=100){
//移除listOfPendingURLs集合中的第一个URL,并将其添加到listOfTraversedURLs集合中,然后读取该移除的URL中的URL
String urlString=listOfPendingURLs.remove(0);
if(!listOfTraversedURLs.contains(urlString)){
listOfTraversedURLs.add(urlString);
System.out.println("Crawl "+urlString);
for(String s:getSubURLs(urlString)){
//将list集合中所有数据添加到listOfPendingURLs集合中
if(!listOfTraversedURLs.contains(s))
listOfPendingURLs.add(s);
}
}
}
}
//该方法的作用是读取urling该URL中的所有URL,并将其储存在list集合之中
public static ArrayList<String> getSubURLs(String urlString){
ArrayList<String> list=new ArrayList<>();
try{
//假如要从一个URL中读取数据,如下两语句是必须进行的
URL url=new URL(urlString);
Scanner input=new Scanner(url.openStream());
int current=0;
while(input.hasNext()){
//line为该URL中的一行数据
String line=input.nextLine();
//URL的格式为以http开头,以(")结束,这个要求是自己定义的
current=line.indexOf("http",current);
while(current>0){
//假如这个URL存在,那么将其储存在list集合中,假如不存在,current=-1;
int endIndex=line.indexOf("\"",current);//???
if(endIndex>0){
list.add(line.substring(current,endIndex));
current=line.indexOf("http:",endIndex);
}
else
current=-1;
}
}
}
catch(Exception ex){
System.out.println("Error: "+ex.getMessage());
}
return list;
}
}
相关文章推荐
- Larbin 搜索引擎源码赏析——(四)后台控制爬虫的接口,一个极为简单的telnet服务器
- 一个简单的java网络爬虫(spider)
- 一个最简单的网络爬虫的实现
- Python源码分析2 - 一个简单的Python程序的执行
- 关于使用Java实现的简单网络爬虫Demo
- 一个简单的python代理服务器源码分析
- 网络爬虫源码分析(java实现)
- Android网络框架-Volley(二) RequestQueue源码分析以及建立一个RequestQueue
- 一个简单的网络验证分析(菜鸟)
- 开源项目Logger源码分析-----一个好看、简单、强大的logcat信息输出项目
- 关于VC中弹出的不能为read的一个简单分析
- 一个简单的宽度优先网络爬虫
- Ext源码分析源码分析之Ext的继承模式解说——第二节、一个简单的继承
- 一个非常简单的.net网络通信框架XNetFramework(符源码与测试Demo)
- 大数据之网络爬虫-一个简单的多线程爬虫
- 关于S5PV210的启动问题和u-boot分析并自己实现一个简单的boot(一)
- 最近写的一个关于金山卫士主界面的简单分析
- 一个简单的网络爬虫 - SharkCrawler
- 一个简单的网络爬虫-从网上爬取美女图片
- 也写一个简单的网络爬虫