一个简单的java网络爬虫,由于时间原因,没有进一步解释.

需要的htmlparser.jar包到官方网上去下.

---------------Spider.java---------------------------

import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.URL; import java.net.URLConnection; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import org.htmlparser.RemarkNode; import org.htmlparser.StringNode; import org.htmlparser.Node; import org.htmlparser.tags.*; import org.htmlparser.Parser; import org.htmlparser.filters.StringFilter; import org.htmlparser.util.NodeIterator; import org.htmlparser.util.NodeList; import org.htmlparser.util.ParserException; import java.util.Queue; import java.util.LinkedList;

public class Spider implements Runnable {

boolean search_key_words = false;

int count = 0;

int limitsite = 10;

int countsite = 1;

String keyword = "中国";//搜索关键字

Parser parser = new Parser();

// List linklist = new ArrayList();

String startsite = "";//搜索的其实站点

SearchResultBean srb;//保存搜索结果

List resultlist = new ArrayList();//搜索到关键字链接列表

List searchedsite = new ArrayList();//已经被搜索站点列表

Queue linklist = new LinkedList();//需解析的链接列表

HashMap> disallowListCache = new HashMap>();

public Spider(String keyword, String startsite) { this.keyword = keyword; this.startsite = startsite; linklist.add(startsite);

srb = new SearchResultBean();

}

public void run() {

// TODO Auto-generated method stub

search(linklist);

}

public void search(Queue queue) {

String url = "";

while(!queue.isEmpty()){ url = queue.peek().toString();//查找列队

try {

if (!isSearched(searchedsite, url)) {

if (isRobotAllowed(new URL(url)))//检查该链接是否被允许搜索

processHtml(url);

else

System.out.println("this page is disallowed to search");

}

} catch (Exception ex) {

}

queue.remove();

}

}

/**

*解析HTML

* @param url

* @throws ParserException

* @throws Exception

*/

public void processHtml(String url) throws ParserException, Exception { searchedsite.add(url);

count = 0;

System.out.println("searching ... :" + url); parser.setURL(url); parser.setEncoding("GBK"); URLConnection uc = parser.getConnection(); uc.connect(); //uc.getLastModified(); NodeIterator nit = parser.elements();

while (nit.hasMoreNodes()) { Node node = nit.nextNode();

parserNode(node);

}

srb.setKeywords(keyword); srb.setUrl(url); srb.setCount_key_words(count); resultlist.add(srb); System.out.println("count keywords is :" + count); System.out.println("----------------------------------------------");

}

/**

*处理HTML标签

* @param tag

* @throws Exception

*/

public void dealTag(Tag tag) throws Exception {

NodeList list = tag.getChildren(); if (list != null) { NodeIterator it = list.elements(); while (it.hasMoreNodes()) { Node node = it.nextNode();

parserNode(node);

}

}

}

/**

*处理HTML标签结点

* @param node

* @throws Exception

*/

public void parserNode(Node node) throws Exception{

if (node instanceof StringNode) {//判断是否是文本结点

StringNode sNode = (StringNode) node;

StringFilter sf = new StringFilter(keyword,false); search_key_words = sf.accept(sNode);

if (search_key_words) {

count++;

}

// System.out.println("text is :"+sNode.getText().trim());

} else if (node instanceof Tag) {//判断是否是标签库结点

Tag atag = (Tag) node;

if (atag instanceof TitleTag) {//判断是否是标TITLE结点

srb.setTitle(atag.getText());

}

if (atag instanceof LinkTag) {//判断是否是标LINK结点

LinkTag linkatag = (LinkTag) atag;

checkLink(linkatag.getLink(), linklist); // System.out.println("-----------------this is link --------------");

}

dealTag(atag);

} else if (node instanceof RemarkNode) {//判断是否是注释

// System.out.println("this is remark");

}

}

/*

*检查链接是否需要加入列队

*/

public void checkLink(String link, Queue queue) { if (link != null && !link.equals("") && link.indexOf("#") == -1) { if (!link.startsWith("http://") && !link.startsWith("ftp://") && !link.startsWith("www.")) {

link = "file:///" + link;

} else if (link.startsWith("www.")) {

link = "http://" + link;

}

if (queue.isEmpty()) queue.add(link);

else {

String link_end_=link.endsWith("/")?link.substring(0,link.lastIndexOf("/")):(link+"/"); if (!queue.contains(link)&&!queue .contains(link_end_)) { queue.add(link);

}

}

}

}

/**

*检查该链接是否已经被扫描

* @param list

* @param url

* @return

*/

public boolean isSearched(List list, String url) {

String url_end_ = "";

if (url.endsWith("/")) { url_end_ = url.substring(0, url.lastIndexOf("/"));

} else {

url_end_ = url + "/";

}

if (list.size() > 0) { if (list.indexOf(url) != -1 || list.indexOf(url_end_) != -1) {

return true;

}

}

return false;

}

/**

*检查URL是否被允许搜索

* @param urlToCheck

* @return

*/

private boolean isRobotAllowed(URL urlToCheck) {

String host = urlToCheck.getHost().toLowerCase();// 获取给出RUL的主机// System.out.println("主机="+host);

//获取主机不允许搜索的URL缓存

ArrayList disallowList = disallowListCache.get(host);

// 如果还没有缓存,下载并缓存。

if (disallowList == null) {

disallowList = new ArrayList();

try {

URL robotsFileUrl = new URL("http://" + host + "/robots.txt");

BufferedReader reader = new BufferedReader(

new InputStreamReader(robotsFileUrl.openStream()));

// 读robot文件,创建不允许访问的路径列表。

String line;

while ((line = reader.readLine()) != null) { if (line.indexOf("Disallow:") == 0) {// 是否包含"Disallow:" String disallowPath = line.substring("Disallow:" .length());// 获取不允许访问路径

// 检查是否有注释。

int commentIndex = disallowPath.indexOf("#"); if (commentIndex != -1) { disallowPath = disallowPath.substring(0,

commentIndex);//去掉注释

}

disallowPath = disallowPath.trim(); disallowList.add(disallowPath);

}

}

for (Iterator it = disallowList.iterator(); it.hasNext();) { System.out.println("Disallow is :" + it.next());

}

// 缓存此主机不允许访问的路径。

disallowListCache.put(host, disallowList);

} catch (Exception e) {

return true; // web站点根目录下没有robots.txt文件,返回真

}

}

String file = urlToCheck.getFile(); // System.out.println("文件getFile()="+file); for (int i = 0; i < disallowList.size(); i++) { String disallow = disallowList.get(i); if (file.startsWith(disallow)) {

return false;

}

}

return true;

}

public static void main(String[] args) {

Spider ph = new Spider("英超",http://www.microsoft.com);

try {

// ph.processHtml();

Thread search = new Thread(ph);

search.start();//启动线程

} catch (Exception ex) {

}

}

}

--------------------------------------SearchResultBean.java---------------------------------------------------------

public class SearchResultBean {

String url = "";

String title = "";

String keywords = "";

int count_key_words = 0;

public int getCount_key_words() {

return count_key_words;

}

public void setCount_key_words(int count_key_words) {

this.count_key_words = count_key_words;

}

public String getKeywords() {

return keywords;

}

public void setKeywords(String keywords) {

this.keywords = keywords;

}

public String getTitle() {

return title;

}

public void setTitle(String title) {

this.title = title;

}

public String getUrl() {

return url;

}

public void setUrl(String url) {

this.url = url;

}

}

java spider爬虫_一个简单的java网络爬虫(spider)相关推荐

  1. java 序列化 例子_一个简单的Java序列化的例子

    简单来说序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化,流的概念这里不用多说(就是I/O),我们可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间(注:要想将对 ...

  2. java年龄计算_一个简单的java年龄计算器

    制作一个如下图年龄计算器 根据题目,我做了一个由Calendar类以及年月日各相减得到的年龄,当然正确的方法不止一个,以下为我的源代码和结果截图: package com.Date; import j ...

  3. java 语言 写字板_一个简单的java语言写字板.docx

    一个简单的java语言写字板.docx 一个简单的JAVA语言写字板一.需求分析1.需求分析:现在网络上各种文档编辑器数不胜数.功能也是应有尽有,有能改变字体的,有可以改变字体颜色的,但是,这些软件有 ...

  4. java仿真软件_一个简单的Java仿真程序

    这是一个简单的仿真程序: 在这个仿真程序中,花园委员会都希望了解每天通过大门进入公园的总人数.每个大门都有一个十字 转门或某种其他形式的计数器,并且任何一个十字转门的计数器递增时,就表示公园中的总人数 ...

  5. java 分布式任务_一个简单的基于 Redis 的分布式任务调度器 —— Java 语言实现...

    折腾了一周的 Java Quartz 集群任务调度,很遗憾没能搞定,网上的相关文章也少得可怜,在多节点(多进程)环境下 Quartz 似乎无法动态增减任务,恼火.无奈之下自己撸了一个简单的任务调度器, ...

  6. java单机应用程序_一个简单的java桌面应用:单机版IFTTT

    1.项目背景: ifttt是"if this then that"的缩写,事实上是让你的网络行为能够引发连锁反应.让你使用更为方便.ifttt旨在帮助人们利用各网站的开放API,将 ...

  7. java应用开发_开发简单的Java应用

    第一章 开发简单的Java应用 1.Java语言的技术分类 (1)JavaSE:标准版,开发桌面应用 (2)JavaEE:企业版,Web应用 (3)JavaME:小型版,嵌入式 2.如何开发和运行Ja ...

  8. java笔试题_一道简单的 Java 笔试题,但值得很多人反思

    专注于Java领域优质技术,欢迎关注 作者:匿蟒 前言 面试别人,对我来说是一件新奇事,以前都是别人面试我.我清楚地知道,我在的地域与公司,难以吸引到中国的一流软件人才.所以,我特地调低了期望,很少问 ...

  9. java时钟代码_一个经典的JAVA APPLET时钟程序(一)

    转眼间一年又要过了,自己又老了一岁,郁闷啊.趁着还有几分钟才新年,赶快再发几篇文章,给过去的一年添点东西. 该程序是从网上发现的,是一个简单的时钟显示程序. 代码特色: 时钟代码提供了各种接口,可以在 ...

  10. java断点续传原理_很简单的Java断点续传实现原理

    原理解析 在开发当中,"断点续传"这种功能很实用和常见,听上去也是比较有"逼格"的感觉.所以通常我们都有兴趣去研究研究这种功能是如何实现的? 以Java来说,网 ...

最新文章

  1. pythonrgbd图片像素对齐_利用pyrealsense获取深度图,并进行像素对齐
  2. 深度学习(3)手写数字识别问题
  3. vue面试题,知识点汇总(有答案)
  4. 《企业私有云建设指南》-导读
  5. mysql行级锁升级_mysql innodb 行级锁升级
  6. 泥鳅般的const(一个小Demo彻底搞清楚)
  7. Docker 容器的通信(十二)
  8. 诺基亚e7刷linux,当之无愧的机皇 诺基亚E7-00十大细节解析
  9. 图像算法八 —— 多种边缘检测算法(Sobel算子、Isotropic Sobel算子、Roberts算子、Prewitt算子、Laplacian算子、Canny算子)介绍及比较
  10. 技嘉服务器主板装系统,技嘉主板bios设置图解教程
  11. MATLAB--求一个矩阵中所有元素的平均值
  12. Sourcetree下载-使用-快速入门
  13. php 处理树形数据,php设计模式之组合模式——处理树形结构数据
  14. mac 桌面不显示东西
  15. UE4--局域网多人联机
  16. 谷俊丽:基于大数据的深度学习
  17. ionic2开发环境 linux,安装ionic开发环境
  18. 富勒烯|Fullerene C60 富勒石 CAS:131159-39-2 |瑞禧
  19. uniapp:在HBuilderX里使用夜神模拟器
  20. Android Q (Android 10.0)

热门文章

  1. PHP生成一寸照片代码,ps做一寸证件照的步骤
  2. Hackintosh_guide黑苹果
  3. Cannot assign requested address问题总结
  4. 上海电力学院计算机软件技术大作业,计算机硬件技术大作业报告2.doc
  5. 服务器bios怎么用u盘装系统,如何进入BIOS并用U盘重装系统
  6. 用Xbrowser连接CentOS
  7. 【win10专业版】win10系统下Office2013无法激活的解决方法
  8. AD831混频器模块
  9. 关于浮动元素,你还在自己计算位置吗?来看看 Floating UI 吧
  10. 计算机c盘中无法搜索文件格式,电脑C盘中programdata文件夹找不到该怎么办