Einf¨hrung
u
Mojo::UserAgent
HTML/JSON-Verarbeitung
auf der Kommandozeile
Mojo::UserAgent
parallele HTTP-Anfragen, Kommandozeilen-Verwendung
Uwe V¨lker
o
XING AG
05.03.2012
Uwe V¨lker
o Mojo::UserAgent
Einf¨hrung
u
Mojo::UserAgent
HTML/JSON-Verarbeitung
auf der Kommandozeile
1 Einf¨hrung
u
2 Mojo::UserAgent
3 HTML/JSON-Verarbeitung
4 auf der Kommandozeile
Uwe V¨lker
o Mojo::UserAgent
Einf¨hrung
u
HTTP-Requests in Perl?
Mojo::UserAgent
parallele HTTP-Requests
HTML/JSON-Verarbeitung
Mojo::UserAgent
auf der Kommandozeile
1 Einf¨hrung
u
HTTP-Requests in Perl?
parallele HTTP-Requests
Mojo::UserAgent
2 Mojo::UserAgent
3 HTML/JSON-Verarbeitung
4 auf der Kommandozeile
Uwe V¨lker
o Mojo::UserAgent
Einf¨hrung
u
HTTP-Requests in Perl?
Mojo::UserAgent
parallele HTTP-Requests
HTML/JSON-Verarbeitung
Mojo::UserAgent
auf der Kommandozeile
HTTP-Requests in Perl?
LWP::UserAgent
LWP::Simple
Uwe V¨lker
o Mojo::UserAgent
Einf¨hrung
u
HTTP-Requests in Perl?
Mojo::UserAgent
parallele HTTP-Requests
HTML/JSON-Verarbeitung
Mojo::UserAgent
auf der Kommandozeile
HTTP-Requests in Perl?
LWP::UserAgent
LWP::Simple
HTTP::Lite
HTTP::Client (nur GET!)
Uwe V¨lker
o Mojo::UserAgent
Einf¨hrung
u
HTTP-Requests in Perl?
Mojo::UserAgent
parallele HTTP-Requests
HTML/JSON-Verarbeitung
Mojo::UserAgent
auf der Kommandozeile
parallele HTTP-Requests
LWP::Parallel::UserAgent (sehr alt - 2004)
HTTP::Async
AnyEvent::HTTP, POE::Component::Client::HTTP
WWW::Curl::Multi
Uwe V¨lker
o Mojo::UserAgent
Einf¨hrung
u
HTTP-Requests in Perl?
Mojo::UserAgent
parallele HTTP-Requests
HTML/JSON-Verarbeitung
Mojo::UserAgent
auf der Kommandozeile
Mojo::UserAgent
Wer sich nicht daran st¨rt, Mojolicious zu installieren, bekommt
o
einen m¨chtigen HTTP-Klienten:
a
asynchron
HTTP 1.1
WebSocket-Unterst¨tzung
u
Uwe V¨lker
o Mojo::UserAgent
Einf¨hrung
u ¨
Uberblick
Mojo::UserAgent
non-blocking
HTML/JSON-Verarbeitung
parallele Anfragen
auf der Kommandozeile
1 Einf¨hrung
u
2 Mojo::UserAgent
¨
Uberblick
non-blocking
parallele Anfragen
3 HTML/JSON-Verarbeitung
4 auf der Kommandozeile
Uwe V¨lker
o Mojo::UserAgent
Einf¨hrung
u ¨
Uberblick
Mojo::UserAgent
non-blocking
HTML/JSON-Verarbeitung
parallele Anfragen
auf der Kommandozeile
¨
Uberblick
#! / u s r / b i n / p e r l
use s t r i c t ;
use w a r n i n g s ;
use Mojo : : U s e r A g e n t ;
my $ua=Mojo : : UserAgent −>new ( m a x r e d i r e c t s =>5);
my $ t x=$ua−>g e t ( ’ h t t p : / /www. p e r l w o r k s h o p . de / ’ ) ;
p r i n t $tx −>r e s −>body ;
Uwe V¨lker
o Mojo::UserAgent
Einf¨hrung
u ¨
Uberblick
Mojo::UserAgent
non-blocking
HTML/JSON-Verarbeitung
parallele Anfragen
auf der Kommandozeile
HTTP-Methoden
get
post, post form
put
delete
head
Uwe V¨lker
o Mojo::UserAgent
Einf¨hrung
u ¨
Uberblick
Mojo::UserAgent
non-blocking
HTML/JSON-Verarbeitung
parallele Anfragen
auf der Kommandozeile
transaction-Objekt
req - request-Objekt
res - response-Objekt
Uwe V¨lker
o Mojo::UserAgent
Einf¨hrung
u ¨
Uberblick
Mojo::UserAgent
non-blocking
HTML/JSON-Verarbeitung
parallele Anfragen
auf der Kommandozeile
transaction-Objekt
req - request-Objekt
res - response-Objekt
local address, local port
remote address, remote port
Uwe V¨lker
o Mojo::UserAgent
Einf¨hrung
u ¨
Uberblick
Mojo::UserAgent
non-blocking
HTML/JSON-Verarbeitung
parallele Anfragen
auf der Kommandozeile
non-blocking
$ua−>g e t ( ’ h t t p : / / p e r l . o r g ’ => sub {
my ( $ua , $ t x ) = @ ;
p r i n t $tx −>r e s −>body ;
Mojo : : IOLoop−>s t o p ;
});
Mojo : : IOLoop−>s t a r t ;
Uwe V¨lker
o Mojo::UserAgent
Einf¨hrung
u ¨
Uberblick
Mojo::UserAgent
non-blocking
HTML/JSON-Verarbeitung
parallele Anfragen
auf der Kommandozeile
Mojo::IOLoop
minimalistic IO loop
building block for non-blocking TCP clients and servers
start, stop
Uwe V¨lker
o Mojo::UserAgent
Einf¨hrung
u ¨
Uberblick
Mojo::UserAgent
non-blocking
HTML/JSON-Verarbeitung
parallele Anfragen
auf der Kommandozeile
parallele Anfragen
my $ d e l a y = Mojo : : IOLoop−>d e l a y ;
f o r e a c h my $ u r l ( ’ m o j o l i c i o . u s ’ , ’ cpan . o r g ’ ) {
$ d e l a y −>b e g i n ;
$ua−>g e t ( $ u r l => sub {
my ( $ua , $ t x ) = @ ;
$ d e l a y −>end ( $tx −>r e s −>dom−>a t ( ’ t i t l e ’)−> t e x t ) ;
});
}
my @ t i t l e s = $ d e l a y −>wait ;
Uwe V¨lker
o Mojo::UserAgent
Einf¨hrung
u ¨
Uberblick
Mojo::UserAgent
non-blocking
HTML/JSON-Verarbeitung
parallele Anfragen
auf der Kommandozeile
Mojo::IOLoop::Delay
synchronize events
begin - increase event counter
end - decrease event counter (and set return values)
wait - wait for ”finish” event (and return results)
Uwe V¨lker
o Mojo::UserAgent
Einf¨hrung
u
Mojo::UserAgent Mojo::DOM
HTML/JSON-Verarbeitung Mojo::JSON::Pointer
auf der Kommandozeile
1 Einf¨hrung
u
2 Mojo::UserAgent
3 HTML/JSON-Verarbeitung
Mojo::DOM
Mojo::JSON::Pointer
4 auf der Kommandozeile
Uwe V¨lker
o Mojo::UserAgent
Einf¨hrung
u
Mojo::UserAgent Mojo::DOM
HTML/JSON-Verarbeitung Mojo::JSON::Pointer
auf der Kommandozeile
Mojo::DOM
HTML5/XML DOM-Parser
klingt wie HTML::TreeBuilder?
Uwe V¨lker
o Mojo::UserAgent
Einf¨hrung
u
Mojo::UserAgent Mojo::DOM
HTML/JSON-Verarbeitung Mojo::JSON::Pointer
auf der Kommandozeile
Mojo::DOM
HTML5/XML DOM-Parser
klingt wie HTML::TreeBuilder?
Unterst¨tzung fuer CSS3-Selektoren
u
mehr wie HTML::TreeBuilder::XPath
Uwe V¨lker
o Mojo::UserAgent
Einf¨hrung
u
Mojo::UserAgent Mojo::DOM
HTML/JSON-Verarbeitung Mojo::JSON::Pointer
auf der Kommandozeile
Mojo::DOM
use Mojo : :DOM;
my $dom = Mojo : : DOM −>new (
’<d i v i d =”a”>A</d i v ><d i v i d =”b”>B</d i v > ’ ) ;
p r i n t $dom−>a t ( ’#b ’)−> t e x t ;
$dom−>d i v −>[1]−> r e p l a c e c o n t e n t ( ’ f o o ’ ) ;
p r i n t $dom ;
# <d i v i d =”a”>A</d i v ><d i v i d =”b”>foo </d i v >
Uwe V¨lker
o Mojo::UserAgent
Einf¨hrung
u
Mojo::UserAgent Mojo::DOM
HTML/JSON-Verarbeitung Mojo::JSON::Pointer
auf der Kommandozeile
Mojo::DOM
new/parse - DOM aufbauen
Suche: at, find
Bewegung: root, children, parent, div, p (Tags)
Extraktion: attr, text
Manipulation: append, prepend, replace
Uwe V¨lker
o Mojo::UserAgent
Einf¨hrung
u
Mojo::UserAgent Mojo::DOM
HTML/JSON-Verarbeitung Mojo::JSON::Pointer
auf der Kommandozeile
Mojo::JSON::Pointer
use Mojo : : JSON : : P o i n t e r ;
my $p = Mojo : : JSON : : P o i n t e r −>new ;
s a y $p−>g e t ( { f o o => [ 2 3 , ’ b a r ’ ] } , ’ / f o o /1 ’ ) ;
i f ( $p−>c o n t a i n s ( { f o o => [ 2 3 , ’ b a r ’ ] } , ’ / f o o ’ ) ) {
s a y ’ C o n t a i n s ”/ f o o ” . ’ ;
}
Uwe V¨lker
o Mojo::UserAgent
Einf¨hrung
u
Mojo::UserAgent Mojo::DOM
HTML/JSON-Verarbeitung Mojo::JSON::Pointer
auf der Kommandozeile
Mojo::JSON::Pointer
http://tools.ietf.org/html/
draft-pbryan-zyp-json-pointer-02
get - extract parts of the data structure
contains - check if a sub structure is present
Uwe V¨lker
o Mojo::UserAgent
Einf¨hrung
u
mojo get
Mojo::UserAgent
CSS-Selektoren
HTML/JSON-Verarbeitung
JSON-Pointer
auf der Kommandozeile
1 Einf¨hrung
u
2 Mojo::UserAgent
3 HTML/JSON-Verarbeitung
4 auf der Kommandozeile
mojo get
CSS-Selektoren
JSON-Pointer
Uwe V¨lker
o Mojo::UserAgent
Einf¨hrung
u
mojo get
Mojo::UserAgent
CSS-Selektoren
HTML/JSON-Verarbeitung
JSON-Pointer
auf der Kommandozeile
mojo get
mojo get -r perl.org
mojo get -M POST -c body example.org
mojo get -r perl.org ’#short lists .list p a’ 0
mojo get http://search.twitter.com/search.json /error
Uwe V¨lker
o Mojo::UserAgent
Einf¨hrung
u
mojo get
Mojo::UserAgent
CSS-Selektoren
HTML/JSON-Verarbeitung
JSON-Pointer
auf der Kommandozeile
CSS-Selektoren
zusaetzliche Parameter nach der URL
Selektor(en)
Kommandos (text, all, attr, id)
Uwe V¨lker
o Mojo::UserAgent
Einf¨hrung
u
mojo get
Mojo::UserAgent
CSS-Selektoren
HTML/JSON-Verarbeitung
JSON-Pointer
auf der Kommandozeile
JSON-Pointer
Content-Type muss JSON sein
/ ... / ...
Hash-Key oder Array-Index
Uwe V¨lker
o Mojo::UserAgent
Einf¨hrung
u
mojo get
Mojo::UserAgent
CSS-Selektoren
HTML/JSON-Verarbeitung
JSON-Pointer
auf der Kommandozeile
Mojo::UserAgent
Fragen?
http://groups.google.com/group/mojolicious
#mojo on irc.perl.org
Einfach ausprobieren!
Uwe V¨lker
o Mojo::UserAgent