【问题标题】:How can I use Perl to grab text from a web page that is dynamically generated with JavaScript?如何使用 Perl 从使用 JavaScript 动态生成的网页中获取文本?
【发布时间】:2011-02-08 22:44:41
【问题描述】:

我正在尝试从 Perl 中提取信息的网站,但是我需要的页面部分是使用 javascript 生成的,因此您在源代码中看到的只是:

<div id="results"></div>

我需要以某种方式提取该 div 的内容并将其保存到使用 Perl/proxies/whatever 的文件中。例如我要保存的信息是

document.getElementById('results').innerHTML;

我不确定这是否可能,或者是否有人有任何想法或方法来做到这一点。 我对其他页面使用了 lynx 源转储,但由于我无法直接从屏幕上抓取此页面,所以我来这里询问一下!

如果有人感兴趣,页面是http://downloadcenter.trendmicro.com/index.php?clk=left_nav&clkval=pattern_file&regs=NABU,我想获取的信息是关于 ConsumerOPR 的行

【问题讨论】:

  • 我也对此感兴趣...您能看到和/或您是否有权访问 AJAX 请求 URL(假设数据是通过 AJAX 填充的)?
  • 是的,我可以看到 ajax,但是在这个站点上,所有从 ajax 查询返回的都是另一个 js 函数,results.innerHTML 被设置为。

标签: javascript html perl screen-scraping


【解决方案1】:

要使用动态创建的 HTML,您可以使用 FireFox Chickenfoot 插件。 或者,如果您需要从命令行脚本运行的东西,请使用与 Perl 的绑定。我以前用 Python 做过。

【讨论】:

    【解决方案2】:

    这可能是您正在寻找的(在 PHP 中):

    $url = 'http://downloadcenter.trendmicro.com/ajx/pattern_result.php';
    
    $ch = curl_init();
    curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
    curl_setopt ($ch, CURLOPT_URL, $url);
    curl_setopt ($ch, CURLOPT_POST, 1);
    curl_setopt ($ch, CURLOPT_POSTFIELDS, 'q=patresult_page&reg=NABU');
    curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
    $content = curl_exec($ch);
    curl_close($ch);
    
    echo $content;
    exit;
    

    一旦你得到内容,你可以使用类似的东西:http://code.google.com/p/phpquery/ 来解析你需要的结果或类似的 perl 等价物???

    和/或自己进行解析。

    仅供参考:我所做的只是使用 firebug 检查请求并使用 PHP/CURL 重新创建它...

    【讨论】:

      【解决方案3】:

      【讨论】:

      • 非常有趣的链接。多年来,我不得不以艰难的方式处理这些事情。实际上,我有点失望,现在它会变得容易几个数量级。
      • 大声笑...随着网站增加动态组件,我欢迎易用性...我记得必须设置专用服务器才能运行浏览器以实现类似目的。
      • 单个专用服务器?四个专用的四 CPU 系统同时运行 64 个 IE 实例怎么样? ;-)
      【解决方案4】:

      由于您的页面内容是由一些 Javascript 生成的,因此您需要能够:

      • 执行一些 Javascript 代码
        • 甚至可能是一些复杂的 JS 代码、执行 Ajax 请求等等?
      • 并使用支持浏览器中存在的功能/方法的引擎(如 DOM 操作)


      一个解决方案可能是真正启动浏览器以导航到该页面,然后解析由它加载的页面,以提取信息?

      我从来没有用它来抓取,但Selenium suite 可能会有所帮助,在这里:使用 Selenium RC,您可以启动一个真正的浏览器,并对其进行试运行 - 然后,您就有了从中获取数据的功能。

      它不是很快,而且很重(它必须启动一个浏览器!),但它工作得很好:例如,你将使用 Firefox 来导航到你的页面-- 这意味着一个真正的 Javascript 引擎,每天都有很多人使用;-)

      【讨论】:

        【解决方案5】:

        您需要对 Javascript 的功能进行逆向工程。它是否会触发 AJAX 请求以填充 &lt;div&gt;?如果是这样,使用Firebug 嗅探请求应该很容易,然后使用LWP::UserAgentWWW::Mechanize 复制它以获取信息。

        如果 Javascript 只是做纯 DOM 操作,那么这意味着数据必须存在于页面中的其他位置或 Javascript 已经存在。所以弄清楚它的来源并抓住它。

        最后,如果这些选项都不合适,您可能只需要使用真正的浏览器即可。有几个选项可以自动执行浏览器行为,例如 WWW::Mechanize::FirefoxWin32::IE::Mechanize

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-12-07
          • 2021-04-18
          • 2014-03-24
          • 2020-04-20
          • 2011-01-05
          • 1970-01-01
          • 2018-02-24
          相关资源
          最近更新 更多