1.添加了org.archive.crawler.frontier.ELFHashQueueAssignmentPolicy.java
public class ELFHashQueueAssignmentPolicy extends QueueAssignmentPolicy {
private static final Logger logger = Logger
.getLogger(ELFHashQueueAssignmentPolicy.class.getName());
private static String DEFAULT_CLASS_KEY = "default...";
private static final String DNS = "dns";
/**
*
*/
@Override
public String getClassKey(CrawlController controller, CandidateURI cauri) {
String uri = cauri.getUURI().toString();
String scheme = cauri.getUURI().getScheme();
String candidate = null;
try {
if (scheme.equals(DNS)) {
if (cauri.getVia() != null) {
// Special handling for DNS: treat as being
// of the same class as the triggering URI.
// When a URI includes a port, this ensures
// the DNS lookup goes atop the host:port
// queue that triggered it, rather than
// some other host queue
UURI viaUuri = UURIFactory.getInstance(cauri.flattenVia());
candidate = viaUuri.getAuthorityMinusUserinfo();
// adopt scheme of triggering URI
scheme = viaUuri.getScheme();
} else {
candidate = cauri.getUURI().getReferencedHost();
}
} else {
// String uri = cauri.getUURI().toString();
long hash = ELFHash(uri);
candidate = Long.toString(hash % 100);
}
if (candidate == null || candidate.length() == 0) {
candidate = DEFAULT_CLASS_KEY;
}
} catch (URIException e) {
logger.log(Level.INFO,
"unable to extract class key; using default", e);
candidate = DEFAULT_CLASS_KEY;
}
return candidate.replace(':', '#');
}
public String getClassKey(String uri) {
// String uri = cauri.getUURI().toString();
long hash = ELFHash(uri);
String a = Long.toString(hash % 100);
return a;
}
public static long ELFHash(String str) {
long hash = 0;
long x = 0;
for (int i = 0; i < str.length(); i++) {
hash = (hash << 4) + str.charAt(i);
if ((x = hash & 0xF0000000L) != 0) {
hash ^= (x >> 24);
hash &= ~x;
}
}
return (hash & 0x7FFFFFFF);
}
public static void main(String args[]){
ELFHashQueueAssignmentPolicy el=new ELFHashQueueAssignmentPolicy();
String a=el.getClassKey("http://www.chinanews.com.cn/");
System.out.println(a);
}
}
2.修改了AbstractFrontier 类的AbstractFrontier方法
/**
* 自己添加修改的配置----------------------------
*/
String queueStr = System.getProperty(AbstractFrontier.class.getName() +
"." + ATTR_QUEUE_ASSIGNMENT_POLICY,
ELFHashQueueAssignmentPolicy.class.getName() + " " +
IPQueueAssignmentPolicy.class.getName() + " " +
BucketQueueAssignmentPolicy.class.getName() + " " +
SurtAuthorityQueueAssignmentPolicy.class.getName() + " " +
TopmostAssignedSurtQueueAssignmentPolicy.class.getName());
Pattern p = Pattern.compile("\\s*,\\s*|\\s+");
/**
* -----------------------------------------------
*/
3.修改了heritrix.properties
修改为
#############################################################################
# FRONTIER
#############################################################################
# List here all queue assignment policies you'd have show as a
# queue-assignment-policy choice in AbstractFrontier derived Frontiers
# (e.g. BdbFrontier).
org.archive.crawler.frontier.AbstractFrontier.queue-assignment-policy = org.archive.crawler.frontier.ELFHashQueueAssignmentPolicy org.archive.crawler.frontier.IPQueueAssignmentPolicy org.archive.crawler.frontier.BucketQueueAssignmentPolicy org.archive.crawler.frontier.SurtAuthorityQueueAssignmentPolicy org.archive.crawler.frontier.TopmostAssignedSurtQueueAssignmentPolicy
org.archive.crawler.frontier.BdbFrontier.level = INFO
要新建一个job才有效,否则还是默认的HostnameQueueAssignmentPolicy
还有,有时候只是散列出30个DNS就关闭。
解决方法1,增加入口连接
2,对这个job重新建立以下with exist
分享到:
相关推荐
### C#多线程网页内容抓取技术解析 #### 概述 在现代互联网应用开发中,网页抓取是一项常见的需求,特别是在数据挖掘、搜索引擎等领域。传统的单线程抓取方式往往因效率低下而不适用于大规模的数据采集场景。本文...
多线程抓取的必要性 在PHP环境下抓取多个网页可以使用fopen()、file_get_contents()等函数实现,但是这种方式通常是顺序处理,即利用循环依次读取多个网页,然后再分析处理数据。当网页个数较少时,这不失为一种...
在这个“c++多线程抓取网页代码”的示例中,我们将探讨如何利用C++来实现多线程下载网页的机制,这对于网络爬虫或者数据抓取等应用非常实用。标签“vc”表明这可能与Visual C++环境有关,而“html”则提示我们主要...
描述:由C#编写的多线程异步抓取网页的网络爬虫控制台程序 功能:目前只能提取网络链接,所用的两个记录文件并不需要很大。网页文本、图片、视频和html代码暂时不能抓取,请见谅。 但需要注意,网页的数目是非常...
Java多线程技术在爬虫应用中的重要性不言而喻,它能显著提升图片抓取的效率。本文将深入探讨如何使用Java实现多线程爬虫,以及压缩包中的三个示例案例。 首先,我们需要了解Java中的多线程概念。在Java中,通过创建...
自己写的一个多线程爬虫,在当前目录下创建目录保存相应图片,共100行代码,可以正常运行
在Java编程领域,多线程技术是实现高效并发处理的关键,尤其在大数据抓取和处理时更为重要。本文将深入探讨如何使用Java多线程来抓取去哪儿网(qunar)的机票数据,同时涉及httpclient和jsoup库的使用。 一、Java多...
在IT行业中,多线程技术是一种常见的编程方法,特别是在处理大量数据或实时更新的应用场景下,如本例中的“多线程抓取网上七星彩开奖号码”。这种技术允许程序同时执行多个任务,提高效率,避免单线程在等待网络响应...
在IT领域,尤其是在编程实践中,"C# 多线程网页信息抓取"是一个重要的主题。这个主题涉及到网络编程、多线程技术和信息提取技术,是构建高效爬虫程序的关键。下面将详细解释这些知识点: 1. **C#语言基础**:C#是一...
以下是一个简单的多线程cURL抓取示例: ```php class CurlThread extends \Thread { private $url; public function __construct($url) { $this->url = $url; } public function run() { $ch = curl_init...
在本项目"基于C#的多线程的网页抓取"中,我们探讨了如何使用C#编程语言来创建一个高效的爬虫,特别是在多线程环境下进行网页抓取和URL提取的技术。 首先,C#是微软开发的一种面向对象的编程语言,它提供了丰富的...
这个项目的核心目标是高效地抓取网页上的新闻内容,通过多线程技术来提升爬取效率。jsoup是一款强大的HTML解析库,它能够帮助开发者方便地解析和操作HTML文档,从而提取所需的数据。 首先,我们需要理解jsoup库的...
这是一个多线程抓取知乎用户的程序 Requirements 需要用到的包: beautifulsoup4 html5lib image requests redis PyMySQL pip安装所有依赖包: pip install Image requests beautifulsoup4 ...
测试运行环境python3.5,不保证其他运行环境能完美运行1.需要安装mysql和redis2.配置config.ini文件,设置好mysql和redis,并且填写你的知乎帐号(master分支新版爬虫不需要登陆,但是可能会有时效问题,可以切换至...
在PHP中,我们可以利用cURL库来实现多线程数据抓取,这在处理大量网页数据或者需要同时从多个来源获取信息时非常有用。本文将详细介绍如何使用PHP结合cURL进行多线程抓取。 首先,cURL是一个客户端URL传输库,支持...
人工智能-项目实践-多线程-多线程爬虫--抓取淘宝商品详情页URL 本项目是一个Java编写的多线程爬虫系统。此系统与我之前开发的ip-proxy-pools-regularly结合使用,共抓取了淘宝近3000个页面,从中解析到了近9万的...
适合:简单地获取纯文字网页的内容。需要创建子线程or修改爬取网页请在testpc.java中修改,webpc用于获取指定网页内容,runthread用于创建子线程爬虫,testpc则是主线程,用于管理子线程的创建、运行与等待。
在学习如何使用Python实现多线程抓取数据并存入数据库之前,我们需要先了解Python中的几个核心概念和技术点,包括Python的多线程编程、数据库操作以及网络数据抓取。 首先,Python的多线程编程允许我们在同一个程序...
在编程领域,多线程是实现并发执行任务的重要机制,特别是在现代计算机系统中,多核处理器使得多线程成为提高程序性能的关键手段。C#语言提供了丰富的多线程支持,让我们能够编写出高效的多线程应用程序。在这个"多...
一个Python多线程爬虫,在工作时,开10个线程来抓取新浪网页的数据,抓取并保存页面, 并且根据deep返回页面链接,根据key确定是否保存该页面,其中: deep == 0时,是抓取的最后一层深度,即只抓取并保存页面,不...