我们正在设计一个大规模的网络抓取/解析项目。基本上,脚本需要浏览网页列表,提取特定标记的内容,并将其存储在数据库中。 你会建议用什么语言大规模(数千万页?)。
我们正在将MongoDB用于数据库,因此任何具有可靠MongoDB驱动程序的东西都是优势。
到目前为止,我们一直在使用(不要笑)PHP,curl和Simple HTML DOM Parser,但我不认为它可以扩展到数百万页,特别是因为PHP没有适当的多线程。 / p>
我们需要一些易于开发的东西,可以在Linux服务器上运行,具有强大的HTML / DOM解析器以轻松提取该标签,并且可以在合理的时间内轻松下载数百万个网页。 我们并不是真的在寻找网络抓取工具,因为我们不需要关注链接并索引所有内容,我们只需要从列表中的每个页面中提取一个标记。
答案 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)