- 論壇徽章:
- 1
|
本帖最后由 py 于 2013-11-14 10:41 編輯
最近正好又需要做頁面分析,以前全是用AnyEvent::HTTP和Web::Scraper。這次試了試Mojo::DOM和Mojo::UserAgent。
先說結(jié)論,我的試用結(jié)論是:如果程序不和web沾邊,只是個頁面分析或文件處理程序,那還是前者好。否則的話可以考慮Mojo.
先說Mojo::DOM和Mojo::UserAgent的優(yōu)點:
Mojo::DOM做的這個dom選擇器在一些時候是非常方便的
讀入HTML以后可以精確定位需要的元素或是用回調(diào)的方式遍歷。- my $dom = Mojo::DOM->new($html_string);
- $dom->find('p[id]')->each(sub { say shift->{id} });
復(fù)制代碼 在配合Mojo::UserAgent使用的時候就更方便了。Mojo::UserAgent有豐富的功能,但如果你不想用那些,你可以就把它當(dāng)成一個wget(http client)用。它不但支持同步get也支持非阻塞get網(wǎng)頁。而且和Mojo::DOM整合的很好。比如:- my $ua = Mojo::UserAgent->new;
- my $title = $tx->res->dom->at('head title')->text;
復(fù)制代碼 當(dāng)把這一切放到Mojolicious web框架里的時候就更美好了,因為都是一個作者寫的,整合性就非常好。以前要興師動眾的工作現(xiàn)在2,3行代碼就完成了。
以上看著都很美好了,我說些在我看來的缺點。
1. 不支持XPATH。
我很熟悉XPATH,但很不幸,不支持XPATH。雖然很多東西都可以用mojo的方式實現(xiàn),但我還是能說出一些我常用但沒實現(xiàn)的東西。并且我猜測因為此,效率也會差很多。由于Web::Scraper是用xpath,并且可以用XML::LibXML來解析html/xml,XML::LibXML是目前所有DOM方式中最快的(libxml2 > expat)。所以我認(rèn)為一個純perl寫的非xpath方式的DOM選擇器的效率是不足以做大規(guī)模數(shù)據(jù)分析的。(僅是猜測)
2. 可能是我的使用習(xí)慣,頁面復(fù)雜的時候我還是更喜歡用Web::Scraper
用過Web::Scraper的人都知道,你需要先用xpath寫一個符合某類頁面的統(tǒng)一規(guī)則,然后用這一整套規(guī)則去分析一類頁面。頁面信息復(fù)雜的時候這一套規(guī)則可能幾十甚至上百行。而用Mojo::DOM就只能用好多find->each和perl回調(diào)函數(shù)裹在一起,不方便調(diào)試,寫頁面分析規(guī)則的人還必須得會perl。
3. 沒法用Coro::rouse_cb和Coro::rouse_wait了。- my $coro = async {
- http_get "http://www.example.com/", Coro::rouse_cb;
- my ($data, $header) = Coro::rouse_wait;
- print Dumper $header;
- };
復(fù)制代碼 上面的這個可以。下面的這個就不行了。- my $coro = async {
- my $ua = Mojo::UserAgent->new;
- $ua->get('http://www.example.com/' => Coro::rouse_cb);
- my ($ua2, $tx) = Coro::rouse_wait;
- my $title = $tx->res->dom->at('head title')->text;
- print "$title\n";
- };
復(fù)制代碼 |
|