Я использую Web :: Scraper, чтобы вырвать некоторые данные из очень простой таблицы и преобразовать ее в мои потребности. Я также использую WWW :: Mechanize для отправки формы, что совсем не медленно.Почему Web :: Scraper так медленно?
Как только я начал использовать Web :: Scraper, я заметил, что для возврата данных со страницы требуется очень много времени. Профилирование показывает следующее:
6299228 13.7s line XML/XPathEngine/Step.pm
7335 10.9s line Net/HTTP/Methods.pm
3990690 10.4s line XML/XPathEngine/NodeSet.pm
2690467 7.72s line HTML/TreeBuilder/XPath.pm
2047085 5.70s line XML/XPathEngine/Function.pm
978212 3.37s line XML/XPathEngine/Literal.pm
1791592 3.29s line HTML/Element.pm
661985 3.15s line XML/XPathEngine.pm
1997421 2.52s line XML/XPathEngine/Expr.pm
Запуск его на консоли приводит к следующему:
real 0m28.042s
user 0m11.312s
sys 0m0.121s
Используя форму веб-браузер строительство (отладки) я только видя 3,5 секунды с помощью пользовательского запроса, так что я он сузил его до Web :: Скребок не торопился.
Вот некоторые из кода веб-скребка, то есть:
$offers = scraper {
process 'table> tr' => 'td[]' => scraper {
process 'td.tdCallNumber > strong ' => 'tdCallNumber' => 'TEXT';
process 'td.tdDateReceived >strong ' => 'tdDateReceived' => 'TEXT';
process 'td.tdTimeReceived >strong' => 'tdTimeReceived' => 'TEXT';
process 'td.tdLocation>strong' => 'tdLocation' => 'TEXT';
process 'td.tdDesc>strong' => 'tdDesc' => 'TEXT';
process 'td > table ' => 'table' => 'TEXT';
process 'td>table>tr' => 'data[]' => scraper {
process 'td.tdUnit' => 'tdUnit' => 'TEXT',
process 'td.tdDIS' => 'tdDIS' => 'TEXT',
process 'td.tdENR' => 'tdENR' => 'TEXT',
process 'td.tdONS' => 'tdONS' => 'TEXT',
process 'td.tdLEF' => 'tdLEF' => 'TEXT',
process 'td.tdARR' => 'tdARR' => 'TEXT',
process 'td.tdBUS' => 'tdBUS' => 'TEXT',
process 'td.tdREM' => 'tdREM' => 'TEXT',
process 'td.tdCOM' => 'tdCOM' => 'TEXT',
;
};
}
};
my $D;
my $print_header = 1;
$D = $offers->scrape($text);
...
Некоторые больше из него, который превращает его в HTML вывода на основе (почти идентичные формы таблицы).
my $r;
for $r (@{ $D->{td} || [] }) {
if ($r->{tdCallNumber}) {
if ($print_header) {
$npage .= "
$r->{tdCallNumber}, $r->{tdDateReceived}, $r->{tdTimeReceived},
$r->{tdLocation}, $r->{tdDesc};
}
if ($r->{data}) {
$npage .= '
Есть ли что-нибудь, что я могу сделать, чтобы улучшить скорость?
Выполняете ли вы что-нибудь еще в коде? Возможно, было бы лучше, если бы вы опубликовали образец кода, который люди могут также посмотреть и, возможно, отладить с вами, чтобы узнать, что может быть проблемой. Не забудьте измерить время avg с 'you <> сайта', что также может означать медленность наряду с другими вещами. – Prix
Я добавил код, и я не делаю ничего сложного. Использование WWW: Механизировать для входа на сайт, вводить данные в форму, используя Web :: Scaper, чтобы принимать данные и преобразовывать их в локальную форму. –
Я бы посмотрел селен для веб-поиска. .. его довольно удивительный – qwwqwwq