HTML::TableExtract 一个 HTTPS 站点
HTML::TableExtract an HTTPS site
我创建了一个 perl 脚本来使用 HTML::TableExtract 从网站上的 table 中抓取数据。
为不安全站点(即 HTTP 站点)转储 table 数据效果很好,但是当我尝试 HTTPS 站点时,它不起作用(tables_report 行只打印空白。 . 它应该打印一堆 table 数据)。
但是,如果我获取该 HTTPS 页面的内容,并将其保存到 html 文件,然后 post 将其保存在不安全的 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 在本地下载页面并从那里提取,但我宁愿不这样做,如果有更简单的方法来做到这一点(任何帮助的人,请不要花费任何疯狂的时间来想出一个复杂的解决方案!)。
这是因为 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@whosebug.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;
}
问题与 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";
}
最终,Miguel 和 Chankey 的回复组合提供了我的解决方案。 Miguel 编写了我的大部分代码,所以我选择了它作为答案,但这是我的 "final" 代码(还有很多事情要做,但这就是我无法弄清楚的全部......剩下的应该是没问题)。
我无法完全让 Miguel/Chankey 提到的任何一个工作,但他们让我完成了 99% 的工作.. 然后我只需要弄清楚如何解决错误 "certificate verify failed".我马上用 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";
}
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);
我创建了一个 perl 脚本来使用 HTML::TableExtract 从网站上的 table 中抓取数据。
为不安全站点(即 HTTP 站点)转储 table 数据效果很好,但是当我尝试 HTTPS 站点时,它不起作用(tables_report 行只打印空白。 . 它应该打印一堆 table 数据)。
但是,如果我获取该 HTTPS 页面的内容,并将其保存到 html 文件,然后 post 将其保存在不安全的 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 在本地下载页面并从那里提取,但我宁愿不这样做,如果有更简单的方法来做到这一点(任何帮助的人,请不要花费任何疯狂的时间来想出一个复杂的解决方案!)。
这是因为 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@whosebug.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;
}
问题与 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";
}
最终,Miguel 和 Chankey 的回复组合提供了我的解决方案。 Miguel 编写了我的大部分代码,所以我选择了它作为答案,但这是我的 "final" 代码(还有很多事情要做,但这就是我无法弄清楚的全部......剩下的应该是没问题)。
我无法完全让 Miguel/Chankey 提到的任何一个工作,但他们让我完成了 99% 的工作.. 然后我只需要弄清楚如何解决错误 "certificate verify failed".我马上用 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";
}
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);