问题标签 [stormcrawler]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
217 浏览

postgresql - 如何使用 Postgres 设置风暴爬虫?

我正在尝试使用 postgres sql 数据库作为后端来设置stormcrawler。但是没有关于需要存在哪些表才能启动风暴爬虫的文档。

我需要哪些表以及它们有哪些列?或者有什么方法可以自动创建所需的表?另外如何在这种模式下启动爬虫?因为我无法像示例爬虫拓扑那样发送种子 URL。

0 投票
1 回答
85 浏览

elasticsearch - 使用 metadata.transfer 和 N:M-relationships 抓取小型主页

嗨伙计,

我们使用 StormCrawler 和 elasticsearch 来为我们的主页创建一个索引,它由“旧页面”和“新页面”组成。简而言之我的问题:如果两个页面 A(旧),B(新)链接到页面 X,如何将元数据从 B 传递到 X?

我的问题很长:我们逐步重新启动了我们的主页。所以有时我们有 pdf 文件,这些文件只能通过旧的 html 页面、只能通过新的 html 页面或两种方式访问​​。

出于“排序依据”的目的,我们必须标记新 html 页面可访问的所有 pdf 文件。所以我们将“newHomepage=true”插入到seeds.txt,将“metadata.transfer/-newHomepage”插入到“crawler-conf.yaml”:很好:-)

但是对于从旧的 !and! 可以访问的 pdf 文件!新的 html 页面,我们现在有一个竞争条件:如果我们的 pdf 文件是从旧页面“发现”的,则此信息 (newHomepage=false) 位于状态索引中并且不能被覆盖。(StatusUpdaterBolt 不会覆盖文档,IndexerBolt 默认会覆盖)。

为了使想法更复杂:在我们的例子中,一个指向 PDF 的 URL(在 html 页面上)在文件交付之前被重定向了两次。

所以从我的角度来看,我们有两种可能性:

  1. 启动爬虫两次。首先,我们只索引我们的新页面(以及所有可访问的 pdf 文件),其次我们索引我们的旧页面。
    • --> 爬虫启动后新页面发生变化的问题
  2. 存储“outbound_links”并使用它们独立于爬虫设置“newHomepage”
    • --> 索引中元数据错误的时间很短

有什么建议或其他想法吗?

最好的问候卡斯滕

0 投票
2 回答
643 浏览

java - 使用 Storm crawler 对每个域(例如速度)进行不同设置的域特定爬取

我最近才发现 Storm 爬虫,根据过去的经验和研究以及使用不同的爬虫,我发现这个基于 Apache Storm 的项目非常健壮,适用于许多用例和场景。

我已经阅读了一些教程并使用一些基本设置测试了风暴爬虫。我想在我的项目中使用爬虫,但有些事情我不确定爬虫是否能够做,或者即使它是否适合这样的用例。

我想在许多具有特定速度设置并限制获取的 url 数量的 web 域上进行大小递归爬网。可以随时使用不同的设置单独启动爬网(不同的速度,忽略该域的 robots.txt,忽略外部链接)。

问题:

  • 风暴爬虫适合这样的场景吗?
  • 我可以将限制设置为爬虫获取的最大页面数吗?
  • 我可以为不同域设置获取页面数量的限制吗?
  • 我可以单独监控特定域的爬取进度吗?
  • 我可以动态设置设置而不需要将修改后的拓扑上传到storm吗?
  • 是否可以暂停或停止抓取(针对特定域)?
  • 风暴爬虫通常作为一种部署的拓扑运行吗?

我认为对于其中一些问题,答案可能是定制或编写我自己的螺栓或喷口。但我宁愿避免修改 Fetcher Bolt 或爬虫的主要逻辑,因为这意味着我正在开发另一个爬虫。

谢谢你。

0 投票
1 回答
1107 浏览

maven - 如何开始使用 Storm-crawler

我正在尝试开始使用Storm-crawler,但在涉及 Maven 时有点困惑,对 Maven 不太熟悉。我是否只是简单地将Storm-crawler的 github 存储库克隆到其中,然后运行 ​​mvn clean install?

还是我 mkdirstorm-crawler, cd 进入该目录并运行stormcrawler.net入门页面上的所有maven命令?maven 会下载我需要的所有东西,然后我如何运行 Storm-crawler。

Storm-crawler 看起来真的很酷,但 Maven 对我来说是全新的......(我熟悉 npm - 他们保持简单!)

0 投票
3 回答
248 浏览

maven - Storm-crawler 和 Elasticsearch 版本

我正在努力让最新版本的 ES (5x) 与Storm-crawler一起使用。

我做了这里提到的,我克隆了 repo,mvn clean install 来构建,然后我输入了这里提到的所有 mvn 命令,一切正常。

我对 pom.xml 文件感到困惑的是version number

我是在此处输入 1.5 还是保留为 1.4?我仍在努力让 Maven 和 Java 构建过程变得更好。

0 投票
1 回答
659 浏览

elasticsearch - Storm-crawler 爬取和索引

我曾使用 Nutch 1x 来抓取网站并使用 Elasticsearch 来索引数据。我最近遇到了 Storm-crawler 并喜欢它,尤其是它的流媒体性质。

我是否必须为 Storm-crawler 将数据发送到的 ES 服务器初始化并创建映射?

使用 Nutch,只要我启动并运行 ES 索引,映射就会自行处理……除了一些微调。风暴爬行者也一样吗?还是我必须先初始化索引和映射?

0 投票
1 回答
207 浏览

web-crawler - 如何调试 Storm Crawler 解析过滤器

我遇到了 XPathFilter 没有解析页面中的某些链接的情况 - 可能是因为 HTML 格式错误。

我可以看到链接可以直接用 JSoup 解析。我想知道是否有一种简单的方法(可能是测试用例/钻机)确定 XPathFilter 看到了什么?

0 投票
1 回答
148 浏览

elasticsearch - ES 索引名称和 Stormcrawler

我已经与 Stormcrawler 合作了几天,并且对它感到满意。我一直在遵循使用 ES 进行索引的指南

如何更改 Stormcrawler 将数据发送到的 ES 索引的名称?

我一直在玩 ES_IndexInit.sh 脚本,但似乎无论我做什么,它都会将抓取数据发送到索引索引。开始并进行一些测试很好,但我现在想创建自己的索引和映射。

0 投票
1 回答
173 浏览

web-crawler - 为warc Bolt设置新流失败

我正在尝试设置一个新流以将 Tika 螺栓连接到 Warc 螺栓。

在 Tika 定义中,我修改了 outputDeclarerFields 函数,如下所示定义我的新“warc”流:

但是,当我以本地模式启动拓扑时,我得到:

14308 [main] WARN oasdsSlot - SLOT debian8:1027 以 EMPTY 状态开始 - 赋值 null 14308 [main] WARN oasdsSlot - SLOT debian8:1028 以 EMPTY 状态开始 - 赋值 null 14308 [main] WARN oasdsSlot - SLOT debian8:1029 以状态开始EMPTY - assignment null 14309 [main] INFO oaslAsyncLocalizer - 清理 /tmp/a1e3b7f5-e251-40ae-a032-b0839ca103c8/supervisor/stormdist 中未使用的拓扑 14318 [main] INFO oasdsSupervisor - 使用 id f42c64cd-7c36-40ab-9f85 启动 supervisor -4b7751ed2d6a 在主机 debian8 上。15030 [main] WARN oasdnimbus - 拓扑提交异常。(拓扑名称='xxCrawler') #error { :cause nil :via [{:type org.apache.storm.generated.InvalidTopologyException :message nil
:at [org.apache.storm.daemon.common$validate_structure_BANG_invoke common.clj 185]}] :trace [[org.apache.storm.daemon.common$validate_structure_BANG_invoke common.clj 185]
[org.apache.storm. daemon.common$system_topology_BANG_ 调用 common.clj 378]
[org.apache.storm.daemon.nimbus$mk_reified_nimbus$reify__10782 submitTopologyWithOpts nimbus.clj 1694]
[org.apache.storm.daemon.nimbus$mk_reified_nimbus$reify__10782 submitTopology nimbus.clj 1726 ]
[sun.reflect.NativeMethodAccessorImpl invoke0 NativeMethodAccessorImpl.java -2]
[sun.reflect.NativeMethodAccessorImpl 调用 NativeMethodAccessorImpl.java 62]
[sun.reflect.DelegatingMethodAccessorImpl 调用 DelegatingMethodAccessorImpl.java 43] [java.lang.reflect.Method 调用 Method.java 498] [clojure.lang.Reflector invokeMatchingMethod Reflector.java 93] [clojure.lang.Reflector invokeInstanceMethod Reflector.java 28] [org.apache.storm.testing$submit_local_topology 调用 testing.clj 310]
[org.apache.storm.LocalCluster$_submitTopology 调用 LocalCluster.clj 49] [org.apache.storm.LocalCluster submitTopology nil -1]
[com.digitalpebble. stormcrawler.ConfigurableTopology 提交 ConfigurableTopology.java 76]
[com.digitalpebble.stormcrawler.ConfigurableTopology 提交 ConfigurableTopology.java 65] [xx.xx.xx.xx.xxTopology 运行 xxTopology.java 111]
[com.digitalpebble.stormcrawler.ConfigurableTopology start ConfigurableTopology.java 50] [xx.xx.xx.xx.xxTopology main xxTopology.java 53]]} 15035 [main] 错误 oassoazsNIOServerCnxnFactory - Thread Thread[main,5,main] dead org .apache.storm.generated.InvalidTopologyException: null at org.apache.storm.daemon.common$validate_structure_BANG_.invoke(common.clj:185) ~[storm-core-1.1.0.jar:1.1.0] at org. apache.storm.daemon.common$system_topology_BANG_.invoke(common.clj:378) ~[storm-core-1.1.0.jar:1.1.0] at org.apache.storm.daemon.nimbus$mk_reified_nimbus$reify__10782.submitTopologyWithOpts (nimbus.clj:1694) ~[storm-core-1.1.0.jar:1.1.0] at org.apache.storm.daemon.nimbus$mk_reified_nimbus$reify__10782.submitTopology(nimbus.clj:1726) ~[storm- core-1.1.0.jar:1.1.0] 在 sun.reflect。NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_131] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_131] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java :43) ~[?:1.8.0_131] at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_131] at clojure.lang.Reflector.invokeMatchingMethod(Reflector.java:93 ) ~[clojure-1.7.0.jar:?] at clojure.lang.Reflector.invokeInstanceMethod(Reflector.java:28) ~[clojure-1.7.0.jar:?] at org.apache.storm.testing$submit_local_topology .invoke(testing.clj:310) ~[storm-core-1.1.0.jar:1.1.0] at org.apache.storm.LocalCluster$_submitTopology.invoke(LocalCluster.clj:49) ~[storm-core- 1.1.0.jar:1.1.0] 在 org.apache.storm.LocalCluster。submitTopology(未知来源)~[storm-core-1.1.0.jar:1.1.0] at com.digitalpebble.stormcrawler.ConfigurableTopology.submit(ConfigurableTopology.java:76)~[xx-crawler-1.1.jar:?]在 com.digitalpebble.stormcrawler.ConfigurableTopology.submit(ConfigurableTopology.java:65) ~[xx-1.1.jar:?] 在 xx.xx.xx.xx.xxTopology.run(xxTopology.java:111) ~[xx- crawler-1.1.jar:?] at com.digitalpebble.stormcrawler.ConfigurableTopology.start(ConfigurableTopology.java:50) ~[xx-crawler-1.1.jar:?] at xx.xx.xx.xx.xxTopology.main( xxTopology.java:53) ~[xx-crawler-1.1.jar:?]提交(ConfigurableTopology.java:65)~[xx-1.1.jar:?] at xx.xx.xx.xx.xxTopology.run(xxTopology.java:111)~[xx-crawler-1.1.jar:?] at com.digitalpebble.stormcrawler.ConfigurableTopology.start(ConfigurableTopology.java:50) ~[xx-crawler-1.1.jar:?] at xx.xx.xx.xx.xxTopology.main(xxTopology.java:53) ~[xx -crawler-1.1.jar:?]提交(ConfigurableTopology.java:65)~[xx-1.1.jar:?] at xx.xx.xx.xx.xxTopology.run(xxTopology.java:111)~[xx-crawler-1.1.jar:?] at com.digitalpebble.stormcrawler.ConfigurableTopology.start(ConfigurableTopology.java:50) ~[xx-crawler-1.1.jar:?] at xx.xx.xx.xx.xxTopology.main(xxTopology.java:53) ~[xx -crawler-1.1.jar:?]

任何帮助将不胜感激!

请注意,如果我使用 StatusStreamName ("status") 流来连接 tika 和 warc 螺栓,它工作正常。

谢谢,

艾蒂安

0 投票
1 回答
135 浏览

web-crawler - 如何动态更改 StormCrawler 的开始、关注和不关注 URL

我对 StormCrawler 很陌生,我第一次实现了网络爬虫,到目前为止我对这个产品非常满意!

我正在使用带有 Elastic 5.5.1 的 StormCrawler v1.5.1,并根据提供的“ESCrawlTopology.java”设置我的拓扑。

我希望能够在拓扑运行时更改起始 URL(种子)和跟随/不跟随 URL。到目前为止,我得到的是一个包含此配置的 redis-DB 和一个 URL-Filter,它使用 redis 从中读取其跟随-不跟随-模式。我还实现了一个 start-url spout,它从 redis 读取,检测更改并通过 status-updater 将新找到的 start-urls 发布到 elastic。到目前为止,此设置效果很好。

对于 follow-/no-follow 规则,我还实现了一个 spout,它检测更改并使用“DeleteByQuery”-Elastic-action 从 Elastic 中的“index”和“status”-Index 中删除所有不再匹配的 URL。我没有为此使用 Status-Updater 或 DeletionBolt。

即使这可行,但感觉不对,我确实看到了潜在的问题。首先,我不能使用状态更新器的缓存,因为删除不是通过此组件完成的,因此缓存不会更新,从而阻止状态更新器添加曾经添加、删除和再次添加的 URL。其次,当一个或多个 URL 被提取或解析而它们被排除并从“状态”和“索引”中删除时,我不确定结果。我希望处理中的 URL 被编入索引,尽管它们之前被排除在外。

我还尝试了一种设置,在该设置中,我将所有排除的 URL 发送到具有 ERROR 状态的状态更新程序。与 DeletionBolt 结合使用会导致 URL 从“index”-index 中取出。这似乎是一个更干净的解决方案 - 但是曾经被排除的 URL 永远不能再被重新索引,因为它们作为“错误”驻留在“状态”-索引中。

在我看来,最好的解决方案是:

  1. 使用状态“已移除”在“状态”索引中标记排除的 URL(目前不可用)
  2. 使所有组件(提取器、解析器...)都知道“已删除”状态以丢弃当前正在处理的排除 URL
  3. 实现一个清理过程,将所有“已删除”的 URL 发送到 DeletionBolt,并在确认时从“状态”中删除此 URL

目前我看不到在不对 StormCrawler 的核心组件进行重大调整的情况下实现这一点的方法,因为目前没有“已移除”这样的状态。

你对这个问题有什么想法,什么是可能的解决方案?