1

HTML::TableExtract を使用してサイトのテーブルからデータを取得するための perl スクリプトを作成しました。

セキュリティで保護されていないサイト (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 のサイトは単なる例です..これらは実際に私が抽出しているサイトではありませんが、実際にスクレイピングしようとしているサイトと同じように機能します.

私が推測する1つのオプションは、最初にperlを使用してページをローカルにダウンロードし、そこから抽出することですが、これを行う簡単な方法がある場合は、そうしません(助けてくれる人は、狂った量を費やさないでください)複雑な解決策を考え出す時が来ました!)。

4

4 に答える 4

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";
}
于 2016-10-15T07:29:57.377 に答える
0

最終的に、Miguel と Chankey の回答を組み合わせることで、解決策が得られました。Miguel が私のコードの大部分を構成していたので、それを答えとして選択しましたが、これが私の「最終」コードです (やるべきことはたくさんありますが、これだけではわかりませんでした..残りは問題ないはずです)。

Miguel/Chankey が言及したもののどちらもうまく機能させることができませんでしたが、99% うまくいきました..次に、「証明書の検証に失敗しました」というエラーを回避する方法を見つけなければなりませんでした。ミゲルの方法ですぐにその答えを見つけたので、最終的にはほとんど彼のコードを使用しましたが、両方の応答は素晴らしかったです!

#!/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";
}
于 2016-10-15T16:55:42.310 に答える