Thread Web::Scraper unendlich langsam (?) (3 answers)
Opened by DanielH at 2008-04-29 17:17

DanielH
 2008-04-29 17:17
#109003 #109003
User since
2007-11-15
54 Artikel
BenutzerIn
[default_avatar]
Hallo,

gestern hab ich mir mal das Modul Web::Scraper* angesehen.
An sich ist die Art Daten zu extrahieren extrem geil.

( * http://search.cpan.org/~miyagawa/Web-Scraper-0.24/... )

Genau so extrem ist allerdings auch die Geschwindigkeit (im negativen Sinn).

Ich hab ein Benchmark laufen gelassen, bei dem ich Regex gegen Web::Scraper mit CSS Selektion und XPath getestet habe.

Laut meinem Test braucht Web::Scraper ca. 120 wallclock Sekunden um die Links aus einem Google-Suchergebniss 1000 mal zu filtern. Die Regex-Variante braucht ca. 120 wallclock Sekunden für 10_000_000 Filterungen.


Jetzt hab ich ein paar Fragen dazu:

1. Hab ich irgendwas falsch gemacht, oder ist XPath echt so langsam (weiter unten poste ich mein benchmark script)
2. Gibt es eventuell ein XPath Module, das in C implementiert ist? Ich konnte leider nichts finden. <edit> ich hab jetzt XML::LibXML gedunden, was ein Interface für libxml2 ist, mit welchem man auch XPath zum parsen von HTML verwenden kann. Andere Module, die C libs verwenden interessieren mich aber trotzdem noch </edit>
3. Für Spider, die viele requests machen, ist Web::Scraper doch schon fast nicht zu gebrauchen, wegen der Langsamkeit (?). Ich will mir z. B. einen Bot bauen, der ebay nach bestimmten Kriterien durchforstet. Ich hab ausgerechnet, dass ich alleine für das parsen von 50.000 Seiten mindestens 92 Minuten brauchen würde (mit Regex in paar Sekunden). Was sagt ihr dazu; würdet ihr Regex oder doch Web::Scraper verwenden?


Das benchmark Ergebniss:

Benchmark:
timing 1000 iterations of
Regex, WebScraper - XPath, WebScraper - css
...

Regex: 0 wallclock secs ( 0.01 usr + 0.00 sys = 0.01 CPU) @ 100000.00/s (n=1000)

(warning: too few iterations for a reliable count)

WebScraper - XPath: 111 wallclock secs (110.18 usr + 0.01 sys = 110.19 CPU) @ 9.08/s (n=1000)

WebScraper - css: 114 wallclock secs (113.16 usr + 0.00 sys = 113.16 CPU) @ 8.84/s (n=1000)


Das benchmark script:

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#!/usr/bin/perl

use strict;
use warnings;

use Benchmark::Forking qw( timethis timethese cmpthese );
use Web::Scraper;

$| = 1;
$\ = "\n";

# hier fehlt der HTML-Code von einem Google-Suchergebniss,
# den ich entfernen musste, weil er über 25000 Zeichen lang war 
# pro Post sind ja nur maximal 10000 Zeichen erlaubt
# (" und @ muss im HTML-Code entsprechend ersetzt werden)

my $resp_body = "";



timethese(1000, {
        'Regex' => sub {

                my @URLs = $resp_body =~ /<h2 class=r><a href="(.*?)" class=l>/g;       
        },
        'WebScraper - css' => sub {

                my $google = scraper{

                        process 'a.l' => 'Links[]' => '@href'
                };

                my $res = $google->scrape( \$resp_body );
        },
        'WebScraper - XPath' => sub {

                my $google = scraper{

                        process '//a[@class="l"]' => 'Links[]' => '@href'
                };

                my $res = $google->scrape( \$resp_body );
        },
});



edit: in der Überschrift hätte ich wohlbesser "Thema: Web::Scraper / XPath unendlich langsam (?)" wählen sollen...

View full thread Web::Scraper unendlich langsam (?)