8

我们正在设计一个大型网络抓取/解析项目。基本上,脚本需要遍历网页列表,提取特定标签的内容,并将其存储在数据库中。对于大规模(数千万页?)执行此操作,您会推荐什么语言。.

我们使用 MongoDB 作为数据库,所以任何具有可靠 MongoDB 驱动程序的东西都是一个加分项。

到目前为止,我们一直在使用(不要笑)PHP、curl 和Simple HTML DOM Parser,但我不认为它可以扩展到数百万个页面,特别是因为 PHP 没有适当的多线程。

我们需要一些易于开发的东西,可以在 Linux 服务器上运行,具有强大的 HTML/DOM 解析器来轻松提取该标签,并且可以在合理的时间内轻松下载数百万个网页。我们并不是真的在寻找网络爬虫,因为我们不需要跟踪链接和索引所有内容,我们只需要从列表中的每个页面中提取一个标签。

4

4 回答 4

7

如果您真的在谈论大规模,那么您可能需要一些可以让您水平扩展的东西,例如,像Hadoop这样的 Map-Reduce 框架。您可以使用多种语言编写 Hadoop 作业,因此您不必依赖于 Java。例如,这是一篇关于用 Python 编写 Hadoop 作业的文章。顺便说一句,这可能是我会使用的语言,这要感谢 libs 之类httplib2的请求和lxml解析结果。

如果 Map-Reduce 框架太过分了,您可以将其保留在 Python 中并使用multiprocessing.

更新:如果您不想要 MapReduce 框架,并且您更喜欢不同的语言,请查看ThreadPoolExecutorin Java。不过,我肯定会使用 Apache Commons HTTP 客户端的东西。JDK 本身的东西对程序员不太友好。

于 2010-06-29T18:00:42.227 回答
3

您可能应该使用用于测试 Web 应用程序的工具(WatiN 或 Selenium)。

然后,您可以使用我编写的工具将您的工作流程与数据分开。

https://github.com/leblancmeneses/RobustHaven.IntegrationTests

使用 WatiN 或 Selenium 时,您不必进行任何手动解析。您将改为编写一个 css querySelector。

使用 TopShelf 和 NServiceBus,您可以水平缩放工人的数量。

仅供参考:使用 mono,我提到的这些工具可以在 Linux 上运行。(虽然里程可能会有所不同)

如果不需要评估 JavaScript 来动态加载数据:任何需要将文档加载到内存中的事情都是在浪费时间。如果您知道您的标签在哪里,那么您只需要一个 sax 解析器。

于 2012-05-04T04:27:01.683 回答
1

I do something similar using Java with the HttpClient commons library. Although I avoid the DOM parser because I'm looking for a specific tag which can be found easily from a regex.

The slowest part of the operation is making the http requests.

于 2010-06-29T17:54:10.887 回答
0

C++呢?有很多大型图书馆可以帮助你。

boost asio可以帮你做网络。

TinyXML可以解析 XML 文件。

我对数据库一无所知,但几乎所有数据库都有c++接口,这不是问题。

于 2012-05-09T09:50:28.297 回答