用Java实现网络爬虫
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实现网络爬虫的更多相关文章
- Java之网络爬虫WebCollector2.1.2+selenium2.44+phantomjs2.1.1
Java之网络爬虫WebCollector2.1.2+selenium2.44+phantomjs2.1.1 一.简介 版本匹配: WebCollector2.12 + selenium2.44.0 ...
- java之网络爬虫介绍
文章大纲 一.网络爬虫基本介绍二.java常见爬虫框架介绍三.WebCollector实战四.项目源码下载五.参考文章 一.网络爬虫基本介绍 1. 什么是网络爬虫 网络爬虫(又被称为网页蜘蛛, ...
- 使用Java实现网络爬虫
网络爬虫 网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本. 另外一些不常使用的名字还有蚂蚁.自动索引.模 ...
- 基于java的网络爬虫框架(实现京东数据的爬取,并将插入数据库)
原文地址http://blog.csdn.net/qy20115549/article/details/52203722 本文为原创博客,仅供技术学习使用.未经允许,禁止将其复制下来上传到百度文库等平 ...
- Jsoup-基于Java实现网络爬虫-爬取笔趣阁小说
注意!仅供学习交流使用,请勿用在歪门邪道的地方!技术只是工具!关键在于用途! 今天接触了一款有意思的框架,作用是网络爬虫,他可以像操作JS一样对网页内容进行提取 初体验Jsoup <!-- Ma ...
- Java版网络爬虫基础(转)
网络爬虫不仅仅可以爬取网站的网页,图片,甚至可以实现抢票功能,网上抢购,机票查询等.这几天看了点基础,记录下来. 网页的关系可以看做是一张很大的图,图的遍历可以分为深度优先和广度优先.网络爬虫采取的广 ...
- Java版网络爬虫基础
网络爬虫不仅仅可以爬取网站的网页,图片,甚至可以实现抢票功能,网上抢购,机票查询等.这几天看了点基础,记录下来. 网页的关系可以看做是一张很大的图,图的遍历可以分为深度优先和广度优先.网络爬虫采取的广 ...
- java实现网络爬虫
import java.io.IOException; import java.util.HashSet; import java.util.Set; import java.util.r ...
- JAVA平台上的网络爬虫脚本语言 CrawlScript
JAVA平台上的网络爬虫脚本语言 CrawlScript 网络爬虫即自动获取网页信息的一种程序,有很多JAVA.C++的网络爬虫类库,但是在这些类库的基础上开发十分繁琐,需要大量的代码才可以完成一 个 ...
随机推荐
- partial class的使用范围
Partial Class,部分类 或者分布类.顾名思义,就是将一个类分成多个部分.比如说:一个类中有3个方法,在VS 2005将该类中3个方法分别存放在3个不同的.cs文件中. 这样做的好处: 1. ...
- x64内核内存空间结构
0x00 前言 本文主要是讨论Windows 7 x64下的内核虚拟地址空间的结构,可以利用WiinDBG调试的扩展命令"!CMKD.kvas"来显示x64下的内核虚拟地址空间的整 ...
- 【转】c# Image获得图片路径的三种方法 winform
代码如下:c# pictureBox1.Image的获得图片路径的三种方法 winform 1.绝对路径:this.pictureBox2.Image=Image.FromFile("D:\ ...
- 【Spring】获取资源文件+从File+从InputStream对象获取正文数据
1.获取资源文件或者获取文本文件等,可以通过Spring的Resource的方式获取 2.仅有File对象即可获取正文数据 3.仅有InputStream即可获取正文数据 package com.sx ...
- jQuery插件(cookie存值)
使用cookie插件后,可以很方便地通过cookie对象保存.读取.删除用户的信息,还能通过cookie插件保存用户的浏览记录,它的调用格式为: 保存:$.cookie(key,value):读取:$ ...
- 【BZOJ】3751: [NOIP2014]解方程
题意 求\(\sum_{i=0}^{n} a_i x^i = 0\)在\([1, m]\)内的整数解.(\(0 < n \le 100, |a_i| \le 10^{10000}, a_n \n ...
- maven 项目打包 及window下部署到tomcat
1.maven项目打包 2.将war文件拷贝到tomcat目录webapps下(不要再建目录)3.将必要的jar文件拷贝到tomcat目录libx下 war包 或jar 包 会生成到项目所在路径 的t ...
- ARM大学计划全球经理到访华清远见,深入交流教育合作
来源:华清远见嵌入式学院 10月20日,ARM大学计划全球经理Khaled Benkrid,高级内容主编洪川博士在ARM大学计划亚太经理陈炜博士的陪同下到访华清远见,就最新嵌入式技术.ARM处理器在教 ...
- 真刀真枪压测:基于TCPCopy的仿真压测方案
郑昀 基于刘勤红和石雍志的实践报告 创建于2015/8/13 最后更新于2015/8/19 关键词:压测.TCPCopy.仿真测试.实时拷贝流量 本文档适用人员:技术人员 提纲: 为什么要做仿真测试 ...
- 使用Git进行项目管理
首先在https://git.oschina.net进行注册以及登陆 登陆进去之后,如果想要创建项目,可以在 点击加号按钮,进行项目创建 3.这里以创建私有项目为例: 输入完成后,点击“创建”,进入下 ...