2013-09-27 3 views
1

Я использую 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 .= ' 

Есть ли что-нибудь, что я могу сделать, чтобы улучшить скорость?

+0

Выполняете ли вы что-нибудь еще в коде? Возможно, было бы лучше, если бы вы опубликовали образец кода, который люди могут также посмотреть и, возможно, отладить с вами, чтобы узнать, что может быть проблемой. Не забудьте измерить время avg с 'you <> сайта', что также может означать медленность наряду с другими вещами. – Prix

+0

Я добавил код, и я не делаю ничего сложного. Использование WWW: Механизировать для входа на сайт, вводить данные в форму, используя Web :: Scaper, чтобы принимать данные и преобразовывать их в локальную форму. –

+0

Я бы посмотрел селен для веб-поиска. .. его довольно удивительный – qwwqwwq

ответ

1

Вы можете использовать NYTProf, чтобы найти точное медленное место в вашей программе или библиотеках. Как только вы увидите, что медленно, вы можете улучшить его.

http://www.slideshare.net/Tim.Bunce/develnytprof-200907

# profile code and write database to ./nytprof.out 
perl -d:NYTProf some_perl.pl 

# convert database into a set of html files, e.g., ./nytprof/index.html 
# and open a web browser on the nytprof/index.html file 
nytprofhtml --open 
4

Может быть, вы посмотрите на HTML::TreeBuilder::LibXML может. Документация модуля говорит о том, что HTML::TreeBuilder::XPath является медленным для больших документов, и это реализует «достаточные методы ... поэтому такие модули, как Web :: Scraper» работают. Тест на странице документации показывает, что вариант libxml примерно на 1600% быстрее, чем версия pure-perl.

Смежные вопросы