gpt4 book ai didi

java - 在 StormCrawler 上获取拓扑以正确写入 warc 文件

转载 作者:行者123 更新时间:2023-12-02 10:56:57 25 4
gpt4 key购买 nike

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 文件,当

  1. 同步策略中设置了显式同步 which we have by default at 10 tuples
  2. 有一个通过勾选元组自动发生的 every 15 secs by default
  3. 文件已轮换 - 在您的情况下,这应该在内容达到 50MB 时发生

由于您用作起点的拓扑不是递归的,并且不会处理超过 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com