标签: www-mechanize

请帮我调试使用WWW :: Mechanize(或LWP :: UserAgent)的SSL问题

我正在使用WWW::Mechanize从我们的产品提供商加载目录到我们的数据库.我每天每2小时运行一次这个脚本,并使用大约50个同步线程在大约12分钟内完成.

一切都很顺利,直到这个周末.他们让他们的网站离线进行定期维护,一旦他们再次在线,我的脚本就不再有用了.在分析了一些事情后,它归结为以下代码失败:

use strict;
use warnings;

use WWW::Mechanize;

my $mec = WWW::Mechanize->new;
$mec->get('https://www.imstores.com/Ingrammicromx/login/login.aspx');

print $mec->content;
Run Code Online (Sandbox Code Playgroud)

代码消失(大约60秒后),并显示以下消息:

Error GETing https://www.imstores.com/Ingrammicromx/login/login.aspx:
Can't connect to www.imstores.com:443 at test.pl line 7.
Run Code Online (Sandbox Code Playgroud)

现在,这些是让我很难找到问题的要点:

  1. 它与网络无关 - 如果我从任何浏览器访问相同的URL,我都会获得该页面.

  2. 如果我在包含我的Perl安装的精确副本的远程计算机上尝试相同的代码,它可以工作.

  3. 如果我use Net::SSL之前WWW::Mechanize,它需要很长时间,但最终得到页面.

  4. 如果我尝试任何其他SSL页面,例如" https://www.paypal.com ",它的工作速度非常快.

  5. 然后,它再次在他们的计划维护之前工作.

我不知道还有什么可以尝试的.如果我切换到非SSL版本,它可以工作,但我不想这样做,因为我们自动化采购操作.

除了我想到的许多事情,想一想为什么它在远程机器上工作以及为什么我可以在我的浏览器中打开本地的页面:

是否可能被我的SSL公钥阻止?那可能吗?如果是这样,LWP/Mechanize用于SSL会话的公钥是什么?如何使用不同的公钥?

我当前设置的一些数据:

在此先感谢任何有用的评论.

perl ssl www-mechanize lwp-useragent

4
推荐指数
1
解决办法
5169
查看次数

使用 WWW::Mechanize 进行内存泄漏

我在 Perl 中有这个脚本"Out of memory",运行几分钟后出现错误。我看不到任何循环引用,我无法弄清楚为什么会发生这种情况。

use feature 'say';
use WWW::Mechanize;
use HTML::TreeBuilder::XPath;
use utf8;

$url = "some url";

my $mech = new WWW::Mechanize;
$mech->get($url);
my $html = HTML::TreeBuilder::XPath->new_from_content($mech->content);
my $html2;

do { 
    for $item ($html->findnodes('//li[@class="dataset-item"]'))
    {
        my $title = $item->findvalue('normalize-space(.//a[2])');
        next unless $title =~ /environmental impact statement/i;        
        my $link = $item->findvalue('.//a[2]/@href');
        $mech->get($link);
        $html2 = HTML::TreeBuilder::XPath->new_from_content($mech->content);
        my @pdflinks = $html2->findvalues('//a[@title="Go to external URL"]/@href');
        my $date = $html2->findvalue('//tr[th="Date Created"]/td');
        for $pdflink (@pdflinks)
        {
            next unless $pdflink =~ /\.pdf$/;
            $mech->get($pdflink);
            $mech->save_content($filename …
Run Code Online (Sandbox Code Playgroud)

perl out-of-memory www-mechanize

4
推荐指数
1
解决办法
154
查看次数

Perl WWW::Mechanize:如何独立于 URL 指定目标 IP 地址?

我想使用 Perl www::mechanize 连接到网络服务器并请求资源。例如http://www.my.domain/test.html。但我想独立于 URL 中的主机名指定 IP 地址。

例如:www.my.domain解析为 1.1.1.1,但我想连接到 2.2.2.2。

我想这样做是为了测试负载均衡器后面的多个 Web 服务器。

perl www-mechanize

4
推荐指数
1
解决办法
66
查看次数

如何制作WWW:机械化以不两次获取页面?

我有一个用OO Perl编写的网络抓取应用程序.应用程序中使用了单个WWW :: Mechanize对象.如何使它不能两次获取相同的URL,即get()使用相同的URL no-op 制作第二个URL:

my $mech = WWW::Mechanize->new();
my $url = 'http:://google.com';

$mech->get( $url ); # first time, fetch
$mech->get( $url ); # same url, do nothing
Run Code Online (Sandbox Code Playgroud)

perl www-mechanize

3
推荐指数
1
解决办法
402
查看次数

使用Perl访问半百万页

目前我正在使用Mechanize和get()方法来获取每个站点,并使用content()方法检查每个主页的内容.我有一个非常快的计算机+ 10Mbit连接,但仍然需要9个小时来检查11K站点,这是不可接受的,问题是,get()函数的速度,显然,需要获取页面,有什么方法可以让它更快,也许是禁用某些东西,因为我只需要检查主页面html.

谢谢,

perl web-crawler www-mechanize

3
推荐指数
2
解决办法
886
查看次数

Perl:网站抓取时出现意外行为

我正在使用WWW::MechanizeHTML::TokeParser解析网站以获取更新.我无法在网站上提供任何详细信息,因为它需要登录.该网站基本上有一个数据表.我只是解析html直到我到达表的第一行,检查它是否是我最后一次刮的值,如果没有发送邮件.当我在现有表条目上测试它时,这非常有效,除非在实际更新发生时,刮擦不会停留在我的最后一次刮擦.它一直发送邮件,直到桌子耗尽,并无限期地重复.我无法弄清楚发生了什么.我知道没有任何人可以在没有网站的情况下进行验证,但我仍然会发布我的代码.我会对可能出错的想法表示赞赏.

码:

sub func{
    my ($comid, $mechlink) = @_;

    my $mechanize = WWW::Mechanize->new(
        noproxy  => 0,
        stack_depth => 5,
        autocheck => 1
    );

    $mechanize->proxy( https => undef );
    eval{
            my $me = $mechanize->get($mechlink);
            $me->is_success or die $me->status_line;
    };
    return $comid if ($@);  

    my $stream = HTML::TokeParser->new( \$mechanize->{content} ) or die $!;

    while ( $tag = $stream->get_tag('td') ) {
    if( $tag->[1]{class} eq 'dateStamp' ) {
        $dt = $stream->get_trimmed_text('/td');
        $tag = $stream->get_tag;
        $tag = $stream->get_tag;
        $name = $stream->get_trimmed_text('/td') …
Run Code Online (Sandbox Code Playgroud)

perl www-mechanize

3
推荐指数
1
解决办法
461
查看次数

Perl Mechanize - 如何以更少的开销使脚本运行得更快

问题:我有2500个网站的列表,需要抓取它们的缩略图截图.我怎么做?我可以尝试使用Perl解析网站.- Mechanize将是一件好事.注意:我只需要将结果作为缩略图,在长维中最多240像素.目前,我有一个缓慢的解决方案并且不提供缩略图:如何使脚本以更少的开销更快地运行 - 吐出缩略图

先决条件: addon/mozrepl /模块WWW :: Mechanize :: Firefox; 模块成像器

第一种方法:这是第一个Perl解决方案:

 use WWW::Mechanize::Firefox;
 my $mech = WWW::Mechanize::Firefox->new();
 $mech->get('http://google.com');
 my $png = $mech->content_as_png();
Run Code Online (Sandbox Code Playgroud)

大纲:返回给定选项卡或呈现为PNG图像的当前页面.所有参数都是可选的.$ tab默认为当前选项卡.如果给出坐标,则将剪切该矩形.坐标应该是一个散列,其中包含四个常用条目,left,top,width,height.这特定于WWW :: Mechanize :: Firefox.

正如我从perldoc中了解到这个选项与坐标,它不是整个页面的大小调整它只是一个矩形切出它....好吧WWW :: Mechanize :: Firefox负责如何保存截图.好吧,我忘了提到我只需要将图像作为小缩略图 - 所以我们不必拥有非常大的文件......我只需要抓取它们的缩略图截图.我已经在cpan上查找了一些缩小$ png的模块,我找到了Imager

机械模块不关心调整图像大小.在这里,我们在CPAN上有各种图像模块,比如Imager.Imager - 用于生成24位图像的Perl扩展:Imager是用于创建和更改图像的模块.它可以读取和写入各种图像格式,绘制线条和多边形等原始形状,以各种方式将多个图像混合在一起,缩放,裁剪,渲染文本等.我安装了模块 - 但我没有扩展我的基本方法

我已经尝试过的了; 这里是:

#!/usr/bin/perl

use strict;
use warnings;
use WWW::Mechanize::Firefox;

my $mech = new WWW::Mechanize::Firefox();

open(INPUT, "<urls.txt") or die $!;

while (<INPUT>) {
        chomp;
        print "$_\n";
        $mech->get($_);
        my $png = $mech->content_as_png();
        my $name = "$_";
        $name …
Run Code Online (Sandbox Code Playgroud)

perl parsing timeout www-mechanize image-resizing

3
推荐指数
1
解决办法
1140
查看次数

WWW :: Mechanize不喜欢POSTing json

我有以下代码:

my $j = encode_json { "arguments" => { "peer-port" => "4444" }, "method" => "session-set", };
$mech->get('http://192.168.1.10:9091');
my $req = HTTP::Request->new( 'POST', 'http://192.168.1.10:9091/transmission/rpc' );
$req->header( 'Content-Type' => 'application/json' );
$req->content($j);
$mech->request($req);
Run Code Online (Sandbox Code Playgroud)

运行时,我收到以下错误:

Error POSTing http://192.168.1.10:9091/transmission/rpc: Conflict at ./pia.pl line 48.
Run Code Online (Sandbox Code Playgroud)

我无法找到关于这个特定错误的任何内容,也无法在WWW :: Mechanize的文档(或HTTP :: Request)中找到任何可以解释它的内容.脚本在执行正确的表单提交时没有问题,它只在这个上失败(目标http服务器显然只接受ajax/json请求).

perl json www-mechanize

3
推荐指数
1
解决办法
1494
查看次数

使用WWW :: Mechanize自动搜索

我正在尝试编写一个Perl脚本,该脚本将自动键入此LexisNexis搜索页面上的搜索变量并检索搜索结果.

我正在使用WWW :: Mechanize模块,但我不知道如何找出搜索栏本身的字段名称.这是我到目前为止的剧本 - >

#!/usr/bin/perl
use strict;
use warnings;
use WWW::Mechanize;
my $m = WWW::Mechanize->new();

my $url = "http://www.lexisnexis.com/hottopics/lnacademic/?verb=sr&csi=379740";
$m->get($url);

$m->form_name('f');
$m->field('q', 'Test');
my $response = $m->submit();
print $response->content();
Run Code Online (Sandbox Code Playgroud)

但是,我认为本网站搜索框的"名称"不是"q".我收到以下错误 - "无法调用方法"值"在站点/ lib/WWW/Mechanize.pm行1442上的未定义值." 任何帮助深表感谢.谢谢 !

perl webpage search-engine file www-mechanize

3
推荐指数
1
解决办法
213
查看次数

使用 Perl 在 HTML 中查找 Favicon

我正在尝试使用 Perl 查找给定 URL 的网站图标(和变体)(我想避免使用外部服务,例如 Google 的网站图标查找器)。有一个 CPAN 模块,WWW::Favicon,但它已经有十多年没有更新了——在这十年中,现在重要的变体(例如“apple-touch-icon”)已经取代了古老的“ico”文件。

我以为我在 WWW::Mechanize 中找到了解决方案,因为它可以列出给定 URL 中的所有链接,包括<link>标题标签。但是,我似乎找不到一种干净的方法来使用“find_link”方法来搜索rel属性。

例如,我尝试使用“rel”作为搜索词,希望尽管文档中没有提到它,但它可能在那里,但它不起作用。此代码返回有关无效“链接查找参数”的错误。

my $results = $mech->find_link( 'rel' => "apple-touch-icon" );
use Data::Dumper;
say STDERR Dumper $results;
Run Code Online (Sandbox Code Playgroud)

我还尝试使用其他链接查找参数,但它们似乎都不适合搜索 rel 属性。

我能弄清楚如何做到这一点的唯一方法是遍历所有链接并寻找像这样的 rel 属性:

my $results = $mech->find_all_links(  );

foreach my $result (@{ $results }) {
    my $attrs = $result->attrs();
    #'tag' => "apple-touch-icon"
    
    foreach my $attr (sort keys %{ $attrs }) {
        if ($attrs->{'rel'} =~ /^apple-touch-icon.*$/) {
            say STDERR "I found it:" . $result->url();
        } …
Run Code Online (Sandbox Code Playgroud)

favicon perl www-mechanize

3
推荐指数
1
解决办法
160
查看次数