用于大规模刮削/解析的技术是什么?

时间:2010-06-29 17:50:18

标签: parsing screen-scraping large-data-volumes

我们正在设计一个大规模的网络抓取/解析项目。基本上,脚本需要浏览网页列表,提取特定标记的内容,并将其存储在数据库中。 你会建议用什么语言大规模(数千万页?)。

我们正在将MongoDB用于数据库,因此任何具有可靠MongoDB驱动程序的东西都是优势。

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

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

4 个答案:

答案 0 :(得分:7)

如果您真的在谈论大型比例,那么您可能需要一些可以横向扩展的内容,例如像Hadoop这样的Map-Reduce框架。您可以使用多种语言编写Hadoop作业,因此您不必使用Java。例如,这是关于writing Hadoop jobs in Python的文章。顺便说一句,这可能是我使用的语言,感谢像httplib2这样的lib用于发出请求,而lxml用于解析结果。

如果Map-Reduce框架过度,您可以将其保存在Python中并使用multiprocessing

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

答案 1 :(得分:3)

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

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

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

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

使用TopShelf和NServiceBus,您可以水平扩展工作人员。

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

如果不需要评估JavaScript以动态加载数据: 任何需要将文档加载到内存中的东西都会浪费时间。如果您知道标记的位置,那么您只需要一个sax解析器。

答案 2 :(得分:1)

我使用Java和HttpClient commons库做类似的事情。虽然我避免使用DOM解析器,因为我正在寻找一个可以从正则表达式中轻松找到的特定标记。

操作中最慢的部分是发出http请求。

答案 3 :(得分:0)

c ++怎么样?有很多大型图书馆可以帮到你。

boost asio可以帮助您建立网络。

TinyXML可以解析XML文件。

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