- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
stormcrawler maven 原型(prototype)似乎与我的项目中的 warc 模块配合得不太好。目前它仅创建空的 0 字节文件,其名称类似于“crawl-20180802121925-00000.warc.gz”。我在这里遗漏了什么吗?
我尝试通过创建一个默认项目来启用 warc 写入,如下所示:
mvn archetype:generate -DarchetypeGroupId=com.digitalpebble.stormcrawler -DarchetypeArtifactId=storm-crawler-archetype -DarchetypeVersion=1.10
然后将依赖项添加到 pom.xml 中的 warc 模块,如下所示
<dependency>
<groupId>com.digitalpebble.stormcrawler</groupId>
<artifactId>storm-crawler-warc</artifactId>
<version>1.10</version>
</dependency>
然后我将 WARCHdfsBolt 添加到获取分组,同时尝试写入本地文件系统目录。
public class CrawlTopology extends ConfigurableTopology {
public static void main(String[] args) throws Exception {
ConfigurableTopology.start(new CrawlTopology(), args);
}
@Override
protected int run(String[] args) {
TopologyBuilder builder = new TopologyBuilder();
String[] testURLs = new String[] { "http://www.lequipe.fr/",
"http://www.lemonde.fr/", "http://www.bbc.co.uk/",
"http://storm.apache.org/", "http://digitalpebble.com/" };
builder.setSpout("spout", new MemorySpout(testURLs));
builder.setBolt("partitioner", new URLPartitionerBolt())
.shuffleGrouping("spout");
builder.setBolt("fetch", new FetcherBolt())
.fieldsGrouping("partitioner", new Fields("key"));
builder.setBolt("warc", getWarcBolt())
.localOrShuffleGrouping("fetch");
builder.setBolt("sitemap", new SiteMapParserBolt())
.localOrShuffleGrouping("fetch");
builder.setBolt("feeds", new FeedParserBolt())
.localOrShuffleGrouping("sitemap");
builder.setBolt("parse", new JSoupParserBolt())
.localOrShuffleGrouping("feeds");
builder.setBolt("index", new StdOutIndexer())
.localOrShuffleGrouping("parse");
Fields furl = new Fields("url");
// can also use MemoryStatusUpdater for simple recursive crawls
builder.setBolt("status", new StdOutStatusUpdater())
.fieldsGrouping("fetch", Constants.StatusStreamName, furl)
.fieldsGrouping("sitemap", Constants.StatusStreamName, furl)
.fieldsGrouping("feeds", Constants.StatusStreamName, furl)
.fieldsGrouping("parse", Constants.StatusStreamName, furl)
.fieldsGrouping("index", Constants.StatusStreamName, furl);
return submit("crawl", conf, builder);
}
private WARCHdfsBolt getWarcBolt() {
String warcFilePath = "/Users/user/Documents/workspace/test/warc";
FileNameFormat fileNameFormat = new WARCFileNameFormat()
.withPath(warcFilePath);
Map<String,String> fields = new HashMap<>();
fields.put("software:", "StormCrawler 1.0 http://stormcrawler.net/");
fields.put("conformsTo:", "http://www.archive.org/documents/WarcFileFormat-1.0.html");
WARCHdfsBolt warcbolt = (WARCHdfsBolt) new WARCHdfsBolt()
.withFileNameFormat(fileNameFormat);
warcbolt.withHeader(fields);
// can specify the filesystem - will use the local FS by default
// String fsURL = "hdfs://localhost:9000";
// warcbolt.withFsUrl(fsURL);
// a custom max length can be specified - 1 GB will be used as a default
FileSizeRotationPolicy rotpol = new FileSizeRotationPolicy(50.0f,
FileSizeRotationPolicy.Units.MB);
warcbolt.withRotationPolicy(rotpol);
return warcbolt;
}
}
无论我在本地运行它是否有助焊剂,似乎都没有什么区别。您可以在此处查看演示存储库:https://github.com/keyboardsamurai/storm-test-warc
最佳答案
感谢您提出这个问题。理论上,内容会写入 WARC 文件,当
由于您用作起点的拓扑不是递归的,并且不会处理超过 5 个 URL,因此永远不会满足条件 1 和 3。
您可以使用
更改它builder.setBolt("status", new MemoryStatusUpdater())
相反。这样新的 URL 将被不断处理。或者,您可以添加
warcbolt.withSyncPolicy(new CountSyncPolicy(1));
到您的代码,以便在每个元组之后触发同步。实际上,您不需要在 URL 不断出现的实际爬网中执行此操作。
现在奇怪的是,无论同步是由条件 1 还是条件 2 触发的,我根本看不到文件有任何变化,它仍然是 0 字节。 1.8版本不是这样的
<dependency>
<groupId>com.digitalpebble.stormcrawler</groupId>
<artifactId>storm-crawler-warc</artifactId>
<version>1.8</version>
</dependency>
所以这可能是由于之后代码的更改所致。
我知道有些用户一直依赖FileTimeSizeRotationPolicy,它可以根据时间触发上述条件3。
欢迎在 Github 上提出问题,我会仔细研究它(下个月我回来时)。
编辑:条目压缩存在一个错误,现已修复,并将成为下一个 SC 版本的一部分。
查看 issue 上的评论OP 友情发布。
关于java - 在 StormCrawler 上获取拓扑以正确写入 warc 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51654160/
当爬网程序爬行完一个域时,我想执行一项操作(在我的例子中,将一个元组发送到一个 bolt )。 我发现 StormCrawler 甚至能够在给定的时间间隔后重新访问网站。在同时爬取多个域的场景下,在哪
我们正在尝试将网页的内容存储在 中状态索引 ,以及 url、状态和元数据信息。 我们尝试编辑 ES_IndexInit.sh 并在“状态”映射部分添加下一个属性: "content": {
我正在使用 Stormcrawler 1.15、ElasticSearch 7.5,并按照本教程启动并运行 SC:https://www.youtube.com/watch?v=KTerugU12TY
我正在使用stormcrawler将数据放入一些Elasticsearch索引中,并且在状态索引中有一堆URL,它们具有各种状态-DISCOVERED,FETCHED,ERROR等。 我想知道是否可以
我们的大学网络系统有大约 1200 个站点,包括几百万个页面。我们在一台本地运行 apache 的机器上安装和配置了 Stormcrawler,并将驱动器映射到 Web 环境的文件系统。这意味着我们可
Stormcrawler 1.13出现了一个奇怪的问题。在我们的某些(但不是全部)网站上,我们有一个标记,而SC的indexer.md.mapping设置为- parse.college=colleg
stormcrawler maven 原型(prototype)似乎与我的项目中的 warc 模块配合得不太好。目前它仅创建空的 0 字节文件,其名称类似于“crawl-20180802121925-
在Stormcrawler 1.14的已完成任务列表中,我同时看到“升级到Elasticsearch 7.0.x”和“ES 6.70依赖Elasticsearch”。这是否意味着1.14与两者兼容?
我一直在使用StormCrawler来抓取网站。作为https协议(protocol),我在StormCrawler中设置了默认的https协议(protocol)。但是,当我抓取一些网站时,我收到以
我们有很多网站正在更新、添加和删除。我很好奇 Stormcrawler 如何处理一个具有先前“获取”的 url 的站点,当下次 SC 到达它时,它已被删除并生成重定向或 404。来自的内容会发生什么旧
Closed. This question does not meet Stack Overflow guidelines 。它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 Stack Ov
我是一名优秀的程序员,十分优秀!