【问题标题】:Perl, using Mechanize to navigate webpagesPerl,使用 Mechanize 浏览网页
【发布时间】:2012-03-22 20:54:34
【问题描述】:

我有一堆网页,我想浏览一个脚本并获取其中的所有内容。我知道该链接是每个页面上的第 18 个链接。我有以下代码作为测试,只需点击一次链接并进行屏幕抓取:

use strict;
use WWW::Mechanize;

my $start = "http://*some-webpage*";

my $mech = WWW::Mechanize->new( autocheck => 1 );
$mech->get( $start );
open(Output, ">mech_test.txt") or die $!;
$mech->follow_link(url_regex => qr//,  n => 18 );
print Output $mech->response()->content();
close(Output);

不幸的是,我试图访问的链接在 href 标记中没有任何内容。查看页面源链接如下:

<a href="" onclick="return _doClick('CA256D6E001A7020.80376e858b0791b1ca256d7300098304/$Body/0.155A', this, null)">Next &gt;&gt;</a>

我相信这是 javascript,mechanize 无法访问此链接。有什么想法可以解决这个问题?

【问题讨论】:

标签: perl screen-scraping www-mechanize


【解决方案1】:

您应该使用WWW::Scripter 模块,它是WWW::Mechanize 的子类,它使用W3C DOM 并提供对脚本的支持。

【讨论】:

    【解决方案2】:

    如果JS很简单的话,可以是纯perl。

    您必须找到 javascript 子程序,如果它相当简单,您可以将其复制为 perl sub。

    然后你就可以自己建立链接了。

    my @javascript_links = $html =~ m#return _doClick\((.*?)\)#gis;
    #array contain 'CA256D6E001A7020.80376e858b0791b1ca256d7300098304/$Body/0.155A', this, null
    my @links = extract_links(@javascript_links);
    foreach my $link (@links){
      $mech->get( $link )
    }
    #***
    sub extract_links{
     my $line = shift;
     my @params = split(/,/,$line);
     trim(@params);
     #mimic JS logic here, whatever it is
     my $link = "/some/path/here/to/add/some.php?someparam1=val1&param=$params[0]"; 
     return $link;
    
    }
    

    【讨论】:

    • 谢谢。这可能是一个选项,但我也会先研究 win32::ieautomation。
    猜你喜欢
    • 1970-01-01
    • 2011-09-14
    • 1970-01-01
    • 2012-03-11
    • 2011-08-29
    • 2015-01-09
    • 2015-02-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多