Perl中支持JavaScript的Web爬网程序

Web Crawler with JavaScript support in Perl?

本文关键字:程序 Web 支持 JavaScript Perl      更新时间:2023-09-26

我想编写一个perl应用程序,该应用程序将抓取一些网站,并从这些网页收集图像链接。因为大多数页面都使用JavaScript来生成HTML内容,所以我需要编写一个支持JavaScript的准客户端浏览器,以便解析由JavaScript生成和/或修改的最终HTML代码。我有什么选择?

如果可能,请发布一些实现代码或链接到一些示例。

有几个选项。

  • Win32::IE::在Windows上机械化
  • Mozilla::机械化
  • WWW::机械化::Firefox
  • WWW::硒
  • 怀特

脑海中浮现的选项:

  • 您可以让Perl使用Selenium,并让一个成熟的浏览器为您完成这项工作。

  • 您可以下载并编译V8或其他开源JavaScript引擎,并让Perl调用外部程序来评估JavaScript。

  • 我不认为Perl的LWP模块支持JavaScript,但如果您还没有这样做,您可能需要检查一下。

WWW::Scripter与WWW::Scripter::Plugin::JavaScript和WWW::Script er::Plugin::Ajax插件似乎是在不使用实际浏览器的情况下最接近的插件(模块WWW::Selenium、Mozilla::Mechanical或Win32::IE::Mechanical使用真实的浏览器)。

查看充满JavaScript的Scratching页面中的完整工作示例。它使用Web::Scraper处理HTML,使用Gtk3::WebKit处理动态内容。然而,后一个是相当PITA安装。如果没有那么多页面需要抓取(<1000),那么通过PhantomJS获取处理后的DOM内容是一个有趣的选择。我为此写了以下脚本:

var page = require('webpage').create(),
    system = require('system'),
    fs = require('fs'),
    address, output;
if (system.args.length < 3 || system.args.length > 5) {
    console.log('Usage: phantomjs --load-images=no html.js URL filename');
    phantom.exit(1);
} else {
    address = system.args[1];
    output = system.args[2];
    page.open(address, function (status) {
        if (status !== 'success') {
            console.log('Unable to load the address!');
        } else {
            fs.write(output, page.content, 'w');
        }
        phantom.exit();
    });
}

CPAN上已经有类似的东西了,它是一个名为Wight的模块,但我还没有测试它。

WWW::机械化::Firefox可以与mozrepl一起使用,并具有所有javascript操作。