2016-10-15 4 views
1

私は、HTML :: TableExtractを使用してサイトのテーブルからデータをスクラップするperlスクリプトを作成しました。HTML :: TableExtract HTTPSサイト

セキュリティで保護されていないサイト(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"; 

サイトは単なる例です。これらは本当に私が抽出てるサイトはありませんが、ちょうど私が本当にこすりしようとしているサイトのように動作します。

1つのオプションは、ページをローカルで最初にダウンロードしてそこから抽出するためのものだと思いますが、これを行う簡単な方法があれば、私はむしろそうしないでしょう(誰でも助けてください複雑な解決策が出てくるのに夢中になってしまいます!)。

答えて

1

問題は、そのサイトで停止しているLWP :: Simpleが使用するユーザーエージェントに関連しています。最後に

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"; 
} 
+0

お返事ありがとうございます!これは – ChrisS

+0

申し訳ありません。私はStackOverflowを初めて使用しています。これはほとんど働いた。私は 'my $ ua = LWP :: UserAgent-> new( ssl_opts => {verify_hostname => 0)、 )に変更する必要がありました。私はこの解決策をChankeyの解析と組み合わせました。私は下の最終コードを投稿しようとします。 – ChrisS

+1

実際に読んだあと、 'ssl_opts => {SSL_verify_mode => 'SSL_VERIFY_PEER'}'を使うことをお勧めしました。これに関するセキュリティ上の問題があるかどうかはわかりませんが、私はここのセキュリティには興味がありません。公的なサイトの統計情報を取得しようとしています。 – ChrisS

0

datatables.netLWP::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', '[email protected]'); 
$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; 
} 
+0

あなたChankeyをありがとう!あなたの答えはMiguelのものと同じように働いていました。試してみると「証明書の検証に失敗しました」というエラーが出ました。おそらく私は、これが動作するために私がミゲルの答えを求めてグーグルグーグルのように旗を立てなければならなかった。結局のところ、私は自分のコードの大部分が今のように見えたので、答えとしてマークしました。しかし、私は2つの答えを選ぶことができれば、私もあなたのものを選ぶだろう。とにかくアップアップされましたが、私はそれがここに示すのは新しいです。私はあなたの大きな助けに感謝します! – ChrisS

0

、ミゲルとChankeyさんの組み合わせは、私の解決策を提供する。このように、LWP::UserAgentを使用し、許可されたユーザエージェントを設定します。 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"; 
} 
+0

あなたのコードでそのモジュールを使用していないので 'use LWP :: RobotUA'行を削除してください。 –

+0

おっと、そうです、私はそれがまだそこにあったことに気づいていませんでした。ありがとう。 – ChrisS

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); 
関連する問題