2016-10-15 5 views
1

ich eine Perl-Skript erstellt habe HTML :: TABLEEXTRACT zu verwenden, um Daten aus Tabellen auf einer Website zu kratzen.HTML :: TABLEEXTRACT eine HTTPS-Site

Es funktioniert hervorragend, um Tabellendaten für unsichere Sites (dh HTTP-Site) auszugeben, aber wenn ich HTTPS-Sites versuche, funktioniert es nicht (die Tables_report-Zeile druckt nur leer .. es sollte eine Reihe von Tabellendaten drucken).

Wenn ich jedoch den Inhalt dieser HTTPS-Seite nehme und in einer HTML-Datei speichern und dann auf einer ungesicherten HTTP-Site veröffentlichen (und meinen Inhalt so ändern, dass er auf diese HTTP-Seite verweist), funktioniert dieses Skript wie erwartet .

Wer weiß, wie ich das HTTPS arbeiten über bekommen kann?

#!/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"; 

Die Standorte oben für $ content erwähnt sind nur einige Beispiele .. diese sind nicht wirklich die Seiten, die ich bin zu extrahieren, aber sie arbeiten genauso wie die Seite, die ich zu kratzen wirklich bin versucht.

Eine Option Ich denke, dass ich perl die Seite lokal zuerst herunterladen und daraus extrahieren soll, aber ich möchte lieber nicht, wenn es einen einfacheren Weg gibt (wer hilft, bitte nicht ausgeben jede verrückte Zeit mit einer komplizierten Lösung!).

Antwort

1

Das Problem hängt mit dem Benutzeragenten zusammen, den LWP :: Simple verwendet, der an dieser Site gestoppt wird. Verwenden Sie LWP::UserAgent und stellen einen erlaubten User-Agent, wie folgt aus:

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

Danke für die Antwort! Dies ist – ChrisS

+0

Sorry, ich bin neu in StackOverflow und drücken Sie die Eingabetaste zu früh. Das hat fast funktioniert.Ich musste einen Teil in 'my $ ua = LWP :: UserAgent-> new ( ssl_opts => {verify_hostname => 0}, ) ändern;' oder ich würde immer eine Fehlermeldung erhalten, dass die Zertifikatsüberprüfung fehlgeschlagen ist. Ich habe diese Lösung mit Chankey's Parsing kombiniert. Ich werde versuchen, meinen endgültigen Code unten zu posten. – ChrisS

+1

Eigentlich nach dem Lesen, klingt, als wäre es besser zu verwenden 'ssl_opts => {SSL_verify_mode => 'SSL_VERIFY_PEER'},', das ist, was ich stattdessen getan habe. Ich bin mir nicht sicher, ob es überhaupt Sicherheitsprobleme gibt, aber ich bin nicht an der Sicherheit hier interessiert. Ich versuche nur ein paar Statistiken von einer öffentlichen Seite zu holen. – ChrisS

0

Dies liegt daran, datatables.netLWP::Simple Anfragen blockiert. Sie können dies bestätigen, indem Sie Code verwenden:

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

Ausgang:

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

Sie versuchen LWP::RobotUA verwenden könnte. Der folgende Code funktioniert gut für mich.

#!/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

Danke Chankey! Ihre Antwort funktionierte ähnlich wie bei Miguel ... es gab mir einen Fehler von "Zertifikat bestätigen fehlgeschlagen", als ich es versuchte. Vermutlich musste ich eine Flagge setzen, wie ich für Miguels Antwort gegoogelt hatte, damit das funktioniert. Am Ende habe ich ihn als die Antwort markiert, denn so sah der Großteil meines Codes jetzt aus. Aber wenn ich zwei Antworten wählen könnte, würde ich auch deine auswählen. Upvoted sowieso, aber ich bin zu neu, um es hier zu zeigen. Ich schätze deine große Hilfe !!! – ChrisS

0

Am Ende eine Kombination von Miguel und Chankey Antworten meine Lösung zur Verfügung gestellt. Miguel hat den Großteil meines Codes gemacht, also habe ich das als Antwort ausgewählt, aber hier ist mein "finaler" Code (hat viel mehr zu tun, aber das ist alles, was ich nicht herausfinden konnte. Der Rest sollte kein Problem sein).

Ich konnte nicht wirklich von Miguel/Chankey erwähnt werden, aber sie haben mich 99% des Weges .. dann musste ich nur herausfinden, wie man den Fehler "Certificate verify failed" umgehen kann. Ich fand diese Antwort sofort mit Miguels Methode, also habe ich am Ende meistens seinen Code benutzt, aber beide Antworten waren großartig!

#!/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

Sie sollten die Zeile "use LWP :: RobotUA" entfernen, da Sie dieses Modul nicht in Ihrem Code verwenden. –

+0

Hoppla, stimmt's, ich hatte nicht bemerkt, dass ich es noch drin hatte. Vielen Dank. – 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); 
Verwandte Themen