Как я могу скачать файл, используя WWW :: Mechanize или любой другой модуль Perl? - PullRequest
2 голосов
/ 15 февраля 2010

Есть ли способ в WWW :: Mechanize или любом модуле Perl для чтения файла после доступа к веб-сайту. Например, я нажал кнопку «Получить» , и появится файл (.txt), содержащий сообщение. Как я смогу читать контент? Ответы очень ценятся. Я работал над этим в течение нескольких дней. Кроме того, я перепробовал все возможности. Кто-нибудь может помочь? Можете ли вы дать мне идею, пожалуйста? :)

Вот часть моего кода:

...

my $username = "admin";<br>
my $password = "12345";<br>

my $url = "http://...do_gsm_sms.cgi";

my $mech = WWW::Mechanize->new(autocheck => 1, quiet => 0, agent_alias =>$login_agent, cookie_jar => $cookie_jar);

$mech->credentials($username, $password);<br>
$mech->get($url);

$mech->success() or die "Can't fetch the Requested page";<br>

print "OK! \n"; #This works <br> 

$mech->form_number(1);

$mech->click()

;

После этого появится диалоговое окно «Загрузки», чтобы я мог сохранить файл (но я также могу установить по умолчанию, чтобы он открывался немедленно вместо сохранения). Вопрос, как я могу прочитать содержимое этого файла?

..

Ответы [ 6 ]

4 голосов
/ 15 февраля 2010

Я полагаю, вы имеете в виду, что веб-сайт отвечает на отправку формы, возвращая ответ не в формате HTML (например, текстовый файл), который вы хотите сохранить.

Я верю, что ты хочешь $mech->save_content( $filename )

Добавлено:

Сначала вам нужно отправить WWW: отправка формы меха, прежде чем сохранять полученный (текстовый) файл. click предназначен для нажатия кнопки , тогда как вы хотите отправить форму, используя $mech->submit() или $mech->submit_form( ... ).

#!/usr/bin/perl

use strict;
use warnings;

use WWW::Mechanize;

my $username = "admin";
my $password = "12345";
my $login_agent = 'WWW::Mechanize login-agent';
my $cookie_jar;

#my $url = "http://localhost/cgi-bin/form_mech.pl";
my $url = "http://localhost/form_mech.html";

my $mech = WWW::Mechanize->new(autocheck => 1, quiet => 0, 
               agent_alias => $login_agent, cookie_jar => $cookie_jar
           );

$mech->credentials($username, $password);
$mech->get($url);

$mech->success() or die "Can't fetch the Requested page";

print "OK! \n"; #This works

$mech->submit_form(
   form_number => 1,
);
die "Submit failed" unless $mech->success;

$mech->save_content('out.txt');
2 голосов
/ 15 февраля 2010

После щелчка (при условии, что он делает то, что должен), возвращенные данные должны быть сохранены в вашем объекте $ mech. Вы должны быть в состоянии получить данные файла с $mech->content(), возможно, после проверки успеха с $mech->status() и типа ответа с $mech->content_type().

Вам может быть полезно помнить, что WWW :: Mechanize заменяет браузер; все, что бы сделал браузер, например, вывести окно загрузки и сохранить файл, на самом деле не происходит, но вся информация, которую имел бы браузер, доступна через методы WWW :: Mechanize.

1 голос
/ 26 февраля 2010

Для подобных проблем вам часто приходится исследовать всю цепочку событий, которые обрабатывает браузер. Используйте инструмент HTTP сниффер, чтобы увидеть все, что делает браузер, пока не дойдет до файла. Затем вы должны сделать то же самое в мехе.

1 голос
/ 16 февраля 2010

Я делаю это все время с LWP, но я уверен, что это одинаково возможно с мехом

Я думаю, что, возможно, вы ошибаетесь, используя Mech для запроса страницы, на которой есть кнопка, когда вы действительно хотите запросить содержимое со страницы, которую кнопка вызывает для отправки в браузер при нажатии.

Что вам нужно сделать, это просмотреть исходный HTML-код страницы с помощью кнопки, которая инициирует загрузку, и посмотреть, что представляет собой действие, связанное с кнопкой. Скорее всего, это будет POST с некоторыми скрытыми полями или URL для выполнения GET.

Целевой URL клика содержит то, что вы действительно хотите получить, а не URL страницы с кнопкой на нем.

1 голос
/ 15 февраля 2010

Откройте файл (не окно «Загрузки»), как если бы вы просматривали его в своем браузере; Вы можете сохранить его позже с помощью нескольких строк кода.

Если у вас установлено HTML::TreeBuilder:

my $textFile = $mech->content(format => "text");

должен получить текст открывающегося окна.

Затем откройте дескриптор файла, чтобы записать свои результаты в:

open my $fileHandle, ">", "results.txt";
print $fileHandle $textFile;
close $fileHandle;
1 голос
/ 15 февраля 2010

Смею спросить ... Вы пробовали это?

my $content = $mech->content();
...