Perl Mechanize : 获取页面修改后的响应页面?

Posted

技术标签:

【中文标题】Perl Mechanize : 获取页面修改后的响应页面?【英文标题】:Perl Mechanize : Get the response page after the page is modified? 【发布时间】:2014-09-27 13:05:19 【问题描述】:

我正在尝试检索使用 js 和数据库加载的页面。加载大约需要 2 到 3 分钟。我能够获得显示“请等待 2 到 3 分钟以加载页面”的页面。 但加载后无法检索页面。

我已经尝试了以下方法:

1.) 在机械化中使用mirror method。但是响应内容没有被解码。因此该文件是乱码。 (还尝试编写与镜像方法类似的方法,该方法将解码响应内容,但也不起作用。未加载新内容。)

2.) 尝试添加请求标头“if-modified-since”。但是时间还是一样的,没有获取到新的内容。

任何指针或建议都会很有帮助。

TIA :)

【问题讨论】:

你知道WWW::Mechanize doesn't support javascript,对吧?您可以改用WWW::Mechanize::Firefox。 是的。我知道。我只想检索页面中的 html。 (完全加载后) JavaScript 没有修改 DOM 吗? 它正在修改 DOM,并且可以在浏览器中看到更改,但是在通过 Mechanize 检索页面时,会加载显示“请等待 1 到 2 分钟”的页面。 WWW::Mechanize 不是浏览器。 Mech 不会看到由加载到 Web 浏览器中的 JavaScript 代码所做的任何 DOM 更改。如果页面通过对服务器进行 AJAX 调用,然后动态创建 DOM 元素来显示结果,您将无法使用 Mech 看到它们。 【参考方案1】:

它不适用于 Mechanize 本身,您需要先检查什么 javascript 正在对页面进行操作,以及数据来自何处 从。那么,两种可能性:

在加载前获取数据后,您可以在 perl 中模拟 javascript,并且 javascript 从何处下载新数据。查看数据是否经过某种编码,然后使用 perl 对其进行解码。 您使用 Mech Firefox,那么您不需要关心 javascript,因为它将由 Firefox 处理。如果您不想看到应用程序,可以隐藏它。

例子:

use WWW::Mechanize::Firefox;
use HTML::TreeBuilder::LibXML;
my $mech = WWW::Mechanize::Firefox->new;
$mech->get('http://example.com/ajax.html');
my $tree = HTML::TreeBuilder::LibXML->new;
$tree->parse($mech->content);
$tree->eof;
my $something = $tree->findvalue('/html/body/div[10]/table');

以上代码未经测试,但应该可以工作。

享受吧。

【讨论】:

以上是关于Perl Mechanize : 获取页面修改后的响应页面?的主要内容,如果未能解决你的问题,请参考以下文章

是否有与 Perl 的 WWW::Mechanize 等效的 PHP?

在 MacOS Big Sur 上使用 perl WWW:Mechanize

Perl 与 Parallel::ForkManager 和 WWW::Mechanize 一起崩溃

Python Mechanize.Browser.Open(url) 状态码

如何使用 Mechanize 处理 JavaScript?

jsp中怎样获取选择栏修改前和修改后的值