HTML :: TableExtract一个HTTPS站点

时间:2016-10-15 06:26:24

标签: perl screen-scraping perl-module lwp html-tableextract

我创建了一个perl脚本,使用HTML :: TableExtract从站点上的表中抓取数据。

很好地为不安全的站点(即HTTP站点)转储表数据,但是当我尝试HTTPS站点时,它不起作用(tables_report行只打印空白..它应该打印一堆表数据) 。

但是,如果我获取该HTTPS页面的内容,并将其保存到html文件,然后将其发布到不安全的HTTP站点上(并将我的内容更改为指向此HTTP页面),则此脚本将按预期工作。

任何人都知道我如何通过HTTPS工作?

#!/usr/bin/perl
use lib qw( ..); 
use HTML::TableExtract; 
use LWP::Simple; 
use Data::Dumper; 
# DOESN'T work:
my $content = get("https://datatables.net/"); 
# DOES work:
#   my $content = get("http://www.w3schools.com/html/html_tables.asp"); 
my $te = HTML::TableExtract->new();
$te->parse($content);
print $te->tables_report(show_content=>1);
print "\n";
print "End\n";

上面提到的$ content的网站只是例子..这些并不是我正在提取的网站,但它们就像我真正想要抓住的网站一样。

我想一个选项是让我使用perl首先在本地下载页面然后从那里提取,但我不想,如果有更简单的方法可以做到这一点(任何有帮助的人,请不要花任何疯狂的时间提出了一个复杂的解决方案!)。

4 个答案:

答案 0 :(得分:1)

问题与LWP :: Simple使用的用户代理有关,该用户代理在该站点停止。使用LWP::UserAgent并设置允许的用户代理,如下所示:

use strict;
use warnings;
use LWP::UserAgent;

my $ua = LWP::UserAgent->new;
my $url = 'https://datatables.net/';

$ua->agent("Mozilla/5.0");  # set user agent
my $res = $ua->get($url);   # send request

# check the outcome
if ($res->is_success) {
   # ok -> I simply print the content in this example, you should parse it
   print $res->decoded_content;
}
else {
   # ko
   print "Error: ", $res->status_line, "\n";
}

答案 1 :(得分:0)

这是因为datatables.net阻止了LWP::Simple次请求。您可以使用以下代码确认:

#!/usr/bin/perl
use strict;
use warnings;
use LWP::Simple; 
print is_success(getprint("https://datatables.net/"));

输出:

$ perl test.pl 
403 Forbidden <URL:https://datatables.net/>

您可以尝试使用LWP::RobotUA。下面的代码对我来说很好。

#!/usr/bin/perl
use strict;
use warnings;

use LWP::RobotUA;
use HTML::TableExtract;

my $ua = LWP::RobotUA->new( 'bot_chankey/1.1', 'chankeypathak@stackoverflow.com' );
$ua->delay(5/60); # 5 second delay between requests
my $response = $ua->get('https://datatables.net/');
if ( $response->is_success ) {
    my $te = HTML::TableExtract->new();
    $te->parse($response->content);
    print $te->tables_report(show_content=>1);
}
else {
    die $response->status_line;
}

答案 2 :(得分:0)

最后,Miguel和Chankey的回应结合起来提供了我的解决方案。 Miguel构成了我的大部分代码,所以我选择了这个作为答案,但这是我的&#34; final&#34;代码(还有很多工作要做,但这是我无法弄清楚的......剩下的应该没问题了。)

Miguel / Chankey没有提到要么工作,但他们让我99%的方式..然后我只需要弄清楚如何绕过错误&#34;证书验证失败&#34 ;.我立即用Miguel的方法找到答案,所以最后我主要使用他的代码,但两个答案都很棒!

#!/usr/bin/perl

use lib qw( ..); 
use strict;
use warnings;
use LWP::UserAgent;

use HTML::TableExtract; 
use LWP::RobotUA;
use Data::Dumper; 

my $ua = LWP::UserAgent->new(
   ssl_opts => { SSL_verify_mode => 'SSL_VERIFY_PEER' },
);
my $url = 'https://WebsiteIUsedWasSomethingElse.com';

$ua->agent("Mozilla/5.0");  # set user agent
my $res = $ua->get($url);   # send request

# check the outcome
if ($res->is_success) 
{   
   my $te = HTML::TableExtract->new();
   $te->parse($res->content);
   print $te->tables_report(show_content=>1);
}
else {
   # ko
   print "Error: ", $res->status_line, "\n";
}

答案 3 :(得分:0)

my $url = "https://ohsesfire01.summit.network/reports/slices";
my $user = 'xxxxxx';
my $pass = 'xxxxxx';
my $ua = new LWP::UserAgent;
my $request = new HTTP::Request GET=> $url;
# authenticate
$request->authorization_basic($user, $pass);

my $page = $ua->request($request);