2009-09-11 51 views
2

我正在用Perl写一个爬虫程序,它必须提取驻留在同一台服务器上的网页内容。我目前使用HTML::Extract模块来完成这项工作,但是我发现模块有点慢,所以我查看了它的源代码,发现它没有使用任何连接缓存来处理LWP::UserAgent如何使用Perl高效提取HTML内容?

我最后的手段是抓住HTML::Extract的源代码,并修改它以使用缓存,但我真的想避免,如果我可以。有没有人知道任何其他模块可以更好地执行相同的工作?我基本上只需要抓取<body>元素中的所有文本,并删除HTML标签。

回答

4
+0

感谢您的回答。我想知道,你知道你提到的哪个模块更适合重复提取大量的HTML页面吗? – Alvin 2009-09-11 17:25:04

+0

使用Web :: Scraper,至少可以将它传递给页面的内容,而不是URL。这样,您就可以在抓取之前执行自己的缓存。 – 2009-09-12 12:52:06

+0

@Alvin:我不知道,因为我不知道Web :: Scraper,HTML :: TreeBuilder或任何其他模块如何针对pQuery执行操作。所有的利弊取决于具体的要求。顺便说一句,要获得在与在pQuery中删除的HTML标签中的所有文本是:pQuery($ html_data) - > find('body') - > text; – draegtun 2009-09-12 21:48:29

1

HTML::Extract的功能看起来基本和无趣。如果draegfun提到的模块不感兴趣,那么您可以自己使用LWP::UserAgentHTML::TreeBuilder来做所有的事情,而不需要太多的代码,然后您可以自由地按照自己的条件进行缓存。

0

我一直在使用Web::Scraper为我的刮需要。提取数据的确非常好,因为你可以调用->scrape($html, $originating_uri),所以缓存你需要的结果也是非常容易的。

0

您是否需要实时进行此操作?效率如何影响你?你是否连续执行这项任务,以便在进入下一个页面之前必须提取一页?为什么你想避免缓存?

您的抓取工具能否下载页面并将它们传递给其他内容?也许您的抓取工具甚至可以并行运行,或者以某种分布式方式运行。

+0

谢谢,你说的对,我可以并行执行任务。使用线程模块解决了瓶颈问题。 – Alvin 2009-09-17 18:05:54