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】:
在加载前获取数据后,您可以在 perl 中模拟 javascript,并且 javascript 从何处下载新数据。查看数据是否经过某种编码,然后使用 perl 对其进行解码。 您使用 Mech Firefox,那么您不需要关心 javascript,因为它将由 Firefox 处理。如果您不想看到应用程序,可以隐藏它。它不适用于 Mechanize 本身,您需要先检查什么 javascript 正在对页面进行操作,以及数据来自何处 从。那么,两种可能性:
例子:
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 一起崩溃