myCrawler.java

package WebCrawler;

import java.io.File;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Queue; public class MyCrawler { private static final String SAVEPATH = "C:"+File.separator+"downloadURL"; public void crawl(ArrayList<URL> urls, int depth) { //初始化队列
Queue<URL> q = new LinkedList<URL>();
ArrayList<URL> visited = new ArrayList<URL>();
q.addAll(urls); while (!q.isEmpty()) { URL head = q.poll(); //出列
if(head.getDepth() > depth){
break;
}
visited.add(head);
String page = HtmlParserTool.getPage(head.toString());
String charset = HtmlParserTool.getCharset(page);
String urlFullPath = SAVEPATH+File.separator+head.toString().replaceAll("[?:<>*|////]","_")+".html";
HtmlParserTool.writeToDisk(urlFullPath, page, charset); //保存到磁盘
ArrayList<String> toVisit = HtmlParserTool.extractLinks(page); for (String s : toVisit) {
if (!visited.contains(s)) {
//visited.add(s);
q.add(new URL(s, head.getDepth()+1));
}
} }
} public static void main(String[] args) throws Exception { ArrayList<URL> urls = new ArrayList<URL>();
urls.add(new URL("http://www.baidu.com"));
new MyCrawler().crawl(urls,1);
}
}

HtmlParserTool.java

package WebCrawler;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.util.ArrayList;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.htmlparser.Parser;
import org.htmlparser.Tag;
import org.htmlparser.tags.LinkTag;
import org.htmlparser.visitors.NodeVisitor; public class HtmlParserTool { //判断字符串是否是一个网址
private static boolean isValidUrl(String url) {
if (url.startsWith("http") | url.startsWith("https")) {
return true;
} else {
return false;
}
} //获取网页包含的超链接
public static ArrayList<String> extractLinks(String content){ ArrayList<String> links = new ArrayList<String>();
Parser parser = null;
NodeVisitor visitor = null;
try {
parser = new Parser(content);
visitor = new NodeVisitor() { @Override
public void visitTag(Tag tag) {
if(tag instanceof LinkTag) {
LinkTag link = (LinkTag)tag;
String linkString = link.getLink();
if(isValidUrl(linkString) && !links.contains(linkString)) {
links.add(linkString);
}
}
}
};
parser.visitAllNodesWith(visitor); } catch (Exception e) {
e.printStackTrace();
} return links;
} //获取字符集
public static String getCharset(String content) {
int startIdx = content.indexOf("charset");
int endIdx = content.indexOf("\"", startIdx+9);
String charset = content.substring(startIdx+9, endIdx);
return charset;
} //获取网页内容
public static String getPage(String url) { CloseableHttpClient client = HttpClients.createDefault();
HttpGet request = new HttpGet(url);
String content="";
try {
CloseableHttpResponse response = client.execute(request);
//System.out.println("Response Code: " + response.getStatusLine().getStatusCode()); BufferedReader rd = new BufferedReader(new InputStreamReader(response.getEntity().getContent())); String line = "";
while ((line = rd.readLine()) != null) {
content = content + line + "\n";
} response.close();
client.close();
String charset = getCharset(content);
if(charset != null) {
content = new String(content.getBytes(),charset);
} } catch (Exception e) {
e.printStackTrace();
} return content;
} //将网页内容写至磁盘
public static void writeToDisk(String path, String content, String charset){ try {
File file = new File(path);
OutputStream o = new FileOutputStream(file);
o.write(content.getBytes(charset));
o.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}

URL.java

package WebCrawler;

public class URL {

    private String url;
private int depth; public URL(String url) {
this.url = url;
this.depth = 1;
} public URL(String url, int depth) {
this.url = url;
this.depth = depth;
} public String toString() {
return this.url;
} public String getUrl() {
return url;
} public void setUrl(String url) {
this.url = url;
} public int getDepth() {
return depth;
} public void setDepth(int depth) {
this.depth = depth;
}
}

用Java实现网络爬虫的更多相关文章

  1. Java之网络爬虫WebCollector2.1.2+selenium2.44+phantomjs2.1.1

    Java之网络爬虫WebCollector2.1.2+selenium2.44+phantomjs2.1.1 一.简介 版本匹配: WebCollector2.12 + selenium2.44.0 ...

  2. java之网络爬虫介绍

    文章大纲 一.网络爬虫基本介绍二.java常见爬虫框架介绍三.WebCollector实战四.项目源码下载五.参考文章   一.网络爬虫基本介绍 1. 什么是网络爬虫   网络爬虫(又被称为网页蜘蛛, ...

  3. 使用Java实现网络爬虫

    网络爬虫 网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本. 另外一些不常使用的名字还有蚂蚁.自动索引.模 ...

  4. 基于java的网络爬虫框架(实现京东数据的爬取,并将插入数据库)

    原文地址http://blog.csdn.net/qy20115549/article/details/52203722 本文为原创博客,仅供技术学习使用.未经允许,禁止将其复制下来上传到百度文库等平 ...

  5. Jsoup-基于Java实现网络爬虫-爬取笔趣阁小说

    注意!仅供学习交流使用,请勿用在歪门邪道的地方!技术只是工具!关键在于用途! 今天接触了一款有意思的框架,作用是网络爬虫,他可以像操作JS一样对网页内容进行提取 初体验Jsoup <!-- Ma ...

  6. Java版网络爬虫基础(转)

    网络爬虫不仅仅可以爬取网站的网页,图片,甚至可以实现抢票功能,网上抢购,机票查询等.这几天看了点基础,记录下来. 网页的关系可以看做是一张很大的图,图的遍历可以分为深度优先和广度优先.网络爬虫采取的广 ...

  7. Java版网络爬虫基础

    网络爬虫不仅仅可以爬取网站的网页,图片,甚至可以实现抢票功能,网上抢购,机票查询等.这几天看了点基础,记录下来. 网页的关系可以看做是一张很大的图,图的遍历可以分为深度优先和广度优先.网络爬虫采取的广 ...

  8. java实现网络爬虫

    import java.io.IOException;   import java.util.HashSet;   import java.util.Set;   import java.util.r ...

  9. JAVA平台上的网络爬虫脚本语言 CrawlScript

    JAVA平台上的网络爬虫脚本语言 CrawlScript 网络爬虫即自动获取网页信息的一种程序,有很多JAVA.C++的网络爬虫类库,但是在这些类库的基础上开发十分繁琐,需要大量的代码才可以完成一 个 ...

随机推荐

  1. Android版:验证手机号码的正则表达式 (转)

    /**  * 验证手机格式  */  public static boolean isMobileNO(String mobiles) {      /*     移动:134.135.136.137 ...

  2. Github上安卓榜排名第2的程序员教你如何学习【转载,侵删】

    来自:峰瑞资本(微信号:freesvc)文章作者:代码家(微信 ID:daimajia_share) 软件早已吞噬整个世界,程序员是关键角色.过去 40 年中,许多伟大的公司都由程序员缔造,比如比尔· ...

  3. Angular过滤器

    angular中的过滤器有: currency 过滤货币 number  过滤数字, date  过滤日期 json 把js对象过滤为json字符串 limitTo  截取字符串,参数是正数则从左往右 ...

  4. 2012 Multi-University #7

    最短路+拆点 A As long as Binbin loves Sangsang 题意:从1走到n,每次都是LOVE,问到n时路径是连续多个"LOVE"的最短距离.秀恩爱不想吐槽. 分析:在普通的最 ...

  5. Linux 查杀病毒的常见命令

    1. 查看异常连接的网络端口及其对应的相应的进程 netstat -anlp | grep EST 2.看下相关的进程ID对应的可执行文件的位置 ps 2393 可以看到进程的可执行文件在哪? 3.临 ...

  6. easyui datalist按组多选

    结果如下: 数据样式如下: [ {"text":"Epson WorkForce 845","group":"Printer&qu ...

  7. [BZOJ3139][HNOI2013] 比赛

    Description 沫沫非常喜欢看足球赛,但因为沉迷于射箭游戏,错过了最近的一次足球联赛.此次联 赛共N支球队参加,比赛规则如下:  (1) 每两支球队之间踢一场比赛. (2) 若平局,两支球队各 ...

  8. python字典

    1.字典解释 映射:通过名字来引用值得数据结构,字典是python中唯一内建的映射类型,字典中的值并没有特殊的顺序,都存储在一个特定的键下,键可以使数字.字符串.元组,通过查找某个特定键,就可以找到对 ...

  9. Multiple annotations found at this line

    Multiple annotations found at this line 在使用MyEclipse的时候,通过MVN导入项目时候,webapp下面的JSP页面报了如下的错误: 这种情况通常的原因 ...

  10. MongoDB使用小结:一些常用操作分享

    本文整理了一年多以来我常用的MongoDB操作,涉及mongo-shell.pymongo,既有运维层面也有应用层面,内容有浅有深,这也就是我从零到熟练的历程. MongoDB的使用之前也分享过一篇, ...