2016-10-15 2 views
1

Я создал скрипт perl для использования HTML :: TableExtract для очистки данных из таблиц на сайте.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"; 

Упомянутые выше $ содержание сайтов только примеры .. это действительно не сайты я добывающие, но они работают так же, как сайт я действительно пытается царапать.

Один вариант, я думаю, для меня использовать perl, чтобы сначала загрузить страницу локально и извлечь из нее, но я бы предпочел, если есть более простой способ сделать это (кто поможет, пожалуйста, не тратьте любое безумное количество времени, приходящее со сложным решением!).

ответ

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

Спасибо за ответ! Это – ChrisS

+0

Извините, я новичок в StackOverflow и слишком быстро вступаю в игру. Это почти сработало.Мне пришлось изменить одну часть на 'my $ ua = LWP :: UserAgent-> new ( ssl_opts => {verify_hostname => 0}, );' или я всегда получаю сообщение об ошибке подтверждения сертификата. Я объединил это решение с разбором Чейки. Я попытаюсь опубликовать свой последний код ниже. – ChrisS

+1

На самом деле, после прочтения, кажется, что более рекомендуется использовать 'ssl_opts => {SSL_verify_mode => 'SSL_VERIFY_PEER'},', так вот что я сделал. Не уверен, есть ли вообще проблемы с безопасностью, но меня здесь не интересует безопасность, просто пытаясь вытащить некоторые статистические данные из публичного сайта. – ChrisS

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', '[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! Ваш ответ сработал так же, как и у Мигеля ... он дал мне ошибку «проверка сертификата не удалось», когда я попробовал. Предположительно, я должен был установить флаг, как будто я искал ответ Мигеля, чтобы он работал. В конце концов, я отметил его как ответ, потому что именно так выглядел большинство моего кода. Но если бы я мог выбрать два ответа, я бы выбрал и твое. Во всяком случае, в любом случае, но я слишком новичок, чтобы показать это. Я ценю вашу большую помощь !!! – ChrisS

0

В конце концов, сочетание Мигель и ответов Chankey поданного мое решения. Miguel составлял большую часть моего кода, поэтому я выбрал это как ответ, но вот мой «окончательный» код (получить гораздо больше, чтобы сделать, но это все, что я не мог понять .. остальное не должно быть проблемой).

Я не мог получить ни одного упоминания Мигеля/Чанки, но они получили мне 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);