【问题标题】:How can I get started with web page scraping using Perl?如何开始使用 Perl 进行网页抓取?
【发布时间】:2011-02-01 10:17:18
【问题描述】:

我对学习 Perl 很感兴趣。我正在使用 Learning Perl 书籍和 cpan 的网站作为参考。

我期待使用 Perl 做一些网络/文本抓取应用程序来应用我所学的任何东西。

请给我一些好的选择。

(这不是家庭作业。想在 Perl 中做一些事情来帮助我利用 Perl 的基本功能)

【问题讨论】:

  • 很多人的想法正好相反!
  • @Joe:多么愚蠢的评论。标记它。
  • 在 Joe 的辩护中,这是因为标题中的“scrapping”拼写错误(现已更正)。然而,无休止的 perl 抨击确实变得非常令人厌烦(谢天谢地,最近 SO 似乎少了)。
  • @plusplus 我经常在与其他语言相关的问题中看到有趣的拼写错误,但出于某种原因,我不会对这些语言发表讽刺评论。我觉得有趣的是,有很多人“Perl 必须很烂”才能​​让他们对自己选择的编程语言感到满意。另见:blog.nu42.com/2010/12/…
  • 来吧伙计们,你不能开个玩笑吗?是的,如果您查看历史记录,您会发现最初的问题是“报废”。

标签: perl project web-scraping


【解决方案1】:

如果您要抓取的网页需要 JavaScript 才能正常运行,那么您需要的不仅仅是 WWW::Mechanize 所能提供的。您甚至可能不得不求助于通过 Perl 控制特定浏览器(例如,使用 Win32::IE::MechanizeWWW::Mechanize::Firefox)。

我没试过,不过也有WWW::ScripterWWW::Scripter::Plugin::JavaScript插件。

【讨论】:

  • 我总是尝试通过直接观察它构建的 HTTP 请求和响应来跳过 Javascript,而不是执行或分析 JS。 AT&T 的“Web Scraping Proxy”是逆向工程网站的炸弹,它以 WWW::Mechanize Perl 代码的形式记录流量以启动!
  • @tadmc 当然,但控制 Internet Explorer(通过 Win32::OLE)在很多情况下直接为我节省了大量时间。
【解决方案2】:

最流行的 Perl 网络抓取模块是 WWW::Mechanize,如果您不能只检索目标页面,而是需要使用链接或表单导航到该页面(例如登录),则该模块非常有用。看看在其documentation 寻求灵感。 如果您的需求很简单,您可以使用正则表达式从 HTML 中提取您需要的信息(但请注意您的 sanity),否则最好使用诸如 HTML::TreeBuilder 之类的模块来完成这项工作。

一个看起来很有趣但我还没有真正尝试过的模块是WWW::Scripter。它是 WWW::Mechanize 的子类,但支持 Javascript 和 AJAX,还集成了HTML::DOM,这是另一种从页面中提取信息的方式。

【讨论】:

  • +1 应该提到的是,WWW::Mechanize 提供了使用链接和表单进行导航所需的解析。
【解决方案3】:

正如其他人所说,WWW::Mechanize 是用于网络抓取任务的优秀模块;你会很好地学习如何使用它,它可以使常见的任务变得非常容易。我已经将它用于几个网络抓取任务,它只处理所有无聊的东西 - “去这里,找到包含此文本的链接并关注它,现在找到一个名为“用户名”和“密码”的表单,输入这些值并提交表单..."。

Scrappy 也非常值得一看 - 它可以让您用很少的代码做很多事情 - 其文档中的一个示例:


    my $spidy = Scrappy->new;

    $spidy->crawl('http://search.cpan.org/recent', {
        '#cpansearch li a' => sub {
            print shift->text, "\n";
        }
    });

Scrappy 在后台使用Web::Scraper,您可能也想将其视为另一种选择。

另外,如果您需要从 HTML 表格中提取数据,HTML::TableExtract 让这变得非常容易 - 您可以通过命名表格包含的标题来定位您感兴趣的表格,并且确实非常容易地提取数据,例如:


    use HTML::TableExtract;
    $te = HTML::TableExtract->new( headers => [qw(Date Price Cost)] );
    $te->parse($html_string) or die "Didn't find table";
    foreach $row ($te->rows) {
        print join(',', @$row), "\n";
    }

【讨论】:

    【解决方案4】:

    试试 Web-Scraper Perl 模块。一个beginners tutorial can be found here

    它安全、易用且快速。

    【讨论】:

      【解决方案5】:

      您可能还想看看我在 Java HtmlUnit 上的新 Perl 包装器。它非常易于使用,例如在此处查看快速教程:

      http://code.google.com/p/spidey/wiki/QuickTutorial

      到明天我将发布一些详细的安装说明和第一个版本。 与 Mechanize 等不同,您获得了一些 JavaScript 支持,而且它比屏幕抓取更快且内存要求更低。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-12-16
        • 2020-11-07
        • 2018-02-06
        • 2017-06-23
        • 2011-03-13
        • 2019-04-06
        • 2019-06-23
        相关资源
        最近更新 更多