最近对heritrix研究有一阵子了,大概也了解其工作原理的一部分,但是heritrix功能实现的比较多,仅配置就挺折腾人的,好在网上的资料也比较齐,加上源码也有,所以自己跟据原理也写了一个类似的超简单的爬虫。
我的爬虫的原理是:
1 手动分析一个页面,得到一个网页块的class标识,手动的原因是给不同网站能实现不同的“精确”抓取,但就是这个手动的原因,使的除了程序员外,基本上不能给别人使用了,一直在纠结这个问题怎么解决,原本是设计成将整个网页解析得到里面的所有链接,但是这样做的话,不精确。所以改成了这个样子
Document doc = null;
doc = Jsoup.connect(url).timeout(30000).get();
String classes = chose;
Elements el = doc.select(classes);
List<String> links = getPageLinks(el.toString());
2 解析html得到页面里所有的<a>标签里的链接
protected static List<String> getPageLinks(String html) {
Parser parser = null;
NodeList nodeList = null;
NodeFilter filter = null;
List<String> urlList = new ArrayList<String>();
try {
// 创建指定编码的Parser对象
parser = Parser.createParser(html, "GB18030");
// 创建一个接受标签A的过滤器
filter = new TagNameFilter("A");
// 过滤节点内容
nodeList = parser.extractAllNodesThatMatch(filter);
int size = nodeList.size();
for (int i = 0; i < size; i++) {
LinkTag tag = (LinkTag) nodeList.elementAt(i);
// System.out.println(tag.getLink());
urlList.add(tag.getLink());
}
} catch (ParserException e) {
e.printStackTrace();
}
return urlList;
}
3 这个处理链会将新添加的链接去重,因为heritrix用的是dbd的嵌入式的数据库,能够处理更多的数据,我这里用的是Arraylist加set去重,因为这个爬虫是精确抓取,得到链接也不会一次超过百万条,简单测试结果是一次添加超过100万级的则会内存溢出。然后分配多个线程去抓取,每个线程得到一个链接,同步了得到链接的方法
/**
* 分配链接,同步此方法,使每个线程得到的链接都不重复
* @return
*/
public synchronized String getLinks() {
if (list.size() == 0) {
return "shut-down";
}
logger.info(Thread.currentThread().getName() + " " + list.get(0));
String link = list.get(0);
list.remove(0);
return link;
}
4 用多线程去得到处理链,相应的操作后,将网页下载到本地
贴代码挺麻烦的,先介绍这么多,本人表达能力有限,自己都不知道这样写能不能理解,内容全写在代码里,代码不多,还是直接下代码自己看看吧
分享到:
相关推荐
java实现一个简单的网络爬虫程序,可以抓取网页,并输出网页源代码
【Qt实现简易爬虫】 Qt是一个跨平台的C++库,提供了一整套工具和功能,用于开发桌面、移动和嵌入式应用。在本文中,我们将深入探讨如何利用Qt来构建一个简单的网络爬虫,这涉及到Qt的网络访问模块...
在本文中,我们将深入探讨如何使用Go语言(Golang)原生库来实现一个简单的网络爬虫。Go语言因其高效、简洁的语法和强大的并发能力,成为开发爬虫的热门选择。我们将通过一个具体的代码实例来阐述这个过程。 首先,...
【简易网络爬虫的实现】是一个关于编程领域,特别是针对网络数据抓取的项目。网络爬虫,也称为网页蜘蛛,是一种自动浏览互联网并提取网页信息的程序。在这个项目中,我们将探讨如何构建一个简单的网络爬虫,它能解析...
总之,HttpClient和HtmlParser结合使用,可以构建一个基础的网络爬虫,用于抓取和解析网页数据。它们提供了一种有效的方式,让开发者能够轻松地与Web服务器交互,并处理返回的HTML内容,从而实现各种Web数据挖掘和...
使用C++Socket库实现的简单网络爬虫,可以爬取网页中的一些图片,貌似大部分网页都爬不了,我测试时,只爬取到 http://59pic.92demo.com/ 中的部分图片,并且在多次爬取后也不管用了。
如何实现一个爬虫系统或则简单的小脚本?一般是定义一个入口页面,然后一个页面会有其他页面的URL,于是从当前页面获取到这些URL加入到爬虫的抓取队列中,然后进入到新页面后再递归的进行上述的操作,其实说来就跟...
在这个"网络爬虫一个最简单的实例"中,我们了解了如何创建一个Scrapy项目,定义爬虫类,设置起始URL,以及如何解析网页内容。随着技能的提升,你可以进一步挖掘Scrapy的潜力,实现更复杂的爬虫应用。
使用nodejs实现一个简单的爬虫适用于想了解node 爬虫等入门的同学学习使用
总的来说,HTMLParser是一个强大的工具,它使得在Java中构建简易爬虫变得简单。通过理解和熟练使用HTMLParser,开发者可以有效地抓取和处理大量网页数据,为数据分析、信息提取等应用场景提供支持。
本篇文章将深入探讨如何使用Java实现一个简单的爬虫以及设计一个简易的排序检索系统。 首先,让我们了解什么是网络爬虫。网络爬虫,又称网页抓取器,是一种自动浏览互联网并提取网页信息的程序。在Java中,我们可以...
本示例将深入探讨如何使用C#语言来实现一个简单的爬虫,以抓取网站首页的城市列表。C#是一种面向对象的编程语言,由于其强大的.NET框架支持,非常适合进行网络编程。 首先,我们需要引入必要的库,如`System.Net`和...
本项目涉及的“一个简单的C++ 爬虫”是利用C++语言实现的一个基础网络爬虫,它的主要功能是对网页进行抓取并解析HTML格式,从而提取出所有的链接地址。 【描述】:“用VC的爬虫,完成了HTML格式解析获得所有链接” ...
【简易Java网络爬虫】是一种基于Java编程语言实现的简单网络数据抓取工具,主要用于从趣配音的web页面上获取...通过这个项目,我们可以学习到如何利用这些技术实现一个基本的网络爬虫,并针对特定网站进行定制化抓取。
下面将详细介绍如何用C#语言实现一个简单的网络爬虫。 首先,需要定义两个集合:待下载集合和已下载集合。待下载集合用来存放需要下载的URL,同时防止重复下载。已下载集合用来存放已经下载的URL。为了保存URL同时...
在实际的项目中,`dht-master`这个文件名可能表示的是一个DHT爬虫的源码仓库,里面包含了实现上述功能的代码。通过学习和理解这些代码,开发者可以深入理解Go语言如何应用于DHT网络,并掌握构建分布式系统的技能。
在这个项目中,我们将探讨如何使用WinForm这一Windows应用程序开发框架来实现一个简单的网络爬虫。 首先,WinForm是.NET Framework提供的一种用于构建桌面应用程序的用户界面框架。它允许开发者创建具有丰富交互性...
本文将详细介绍如何使用C#语言简单实现一个网络爬虫。 首先,我们需要了解网络爬虫的基本步骤: 1. **发送HTTP请求**:网络爬虫首先需要向目标网站发送HTTP请求,获取网页内容。在C#中,可以使用`HttpClient`类来...
在Java中,我们可以利用各种库来构建一个简单的爬虫,例如Jsoup、Apache HttpClient、WebMagic等。以下是对Java爬虫实现的一些关键知识点的详细说明: 1. **HTTP请求与响应**: - Java中的`HttpURLConnection`类...