用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++的网络爬虫类库,但是在这些类库的基础上开发十分繁琐,需要大量的代码才可以完成一 个 ...
随机推荐
- 字符串数组初始化0 与memset 0 效率的分析
转自:http://www.xuebuyuan.com/1722207.html 结合http://blog.sina.com.cn/s/blog_59d470310100gov8.html来看. 最 ...
- 用JMeter进行Performance Test
用JMeter可以对Http请求进行Performance Test,来分析哪些方法花费的时间多,哪些方法花费的时间少,有了这样的分析结果后,我们就可以集中力量来改进费时的方法. 官方文档请参考如下链 ...
- BFC的深入理解
一:BFC是什么东东 了解BFC前先一了解一下Box和Formatting Context (1)B: BOX即盒子,页面的基本构成元素.分为 inline . block 和 run-in 三种类型 ...
- 2015 ACM Syrian Collegiate Programming Contest
A. My Friend of Misery 计算出答案的上下界即可. 时间复杂度$O(n)$. #include<bits/stdc++.h> using namespace std; ...
- 【BZOJ】3993: [SDOI2015]星际战争
题意 \(m\)个人\(n\)个物品,第\(i\)个物品生命值为\(A_i\),第\(i\)个人每秒可以减少一个物品\(B_i\)的生命值,给出一个\(m \times n\)的矩阵,如果\(i\)行 ...
- 启动mysql服务 报1067 错误
启动mysql 报1067 错误 一般报1067错误,先看一下data/my.ini配置文件 中的路径 datadir ,log-bin ,log-error 报1067错误原因 多种 ...
- [IOS] 利用@IBInspectable
某些uiview中设置 这个关键字 IBInspectable 可以让其设置的属性,在右侧的属性栏目里面进行直接设置, 这是最近看了一下wwdc的一个视频学习到的,可以方便的进行 UI的测试,
- for循环
1.使用for循环输出矩形 public static void print1(int h,int w){ for(int i=0; i<h; i++){ f ...
- vs2015帮助文档
1)注释快捷键: CTRL + K - CTRL + C (注释) CTRL + K 然后 CTRL + U (取消注释) shift+"*"---------整段(取消)注释 2 ...
- C#搜索指定文件夹内的符合要求的文件
下面的列子是文件的模糊查找, 具体功能是:选定文件夹,搜索所有文件命中包含“_bui”字样的shp图层(后缀为.shp)并将信息显示在ListView中.实际应用中可随便修改. 这里采用递归方法进行深 ...