- 论坛徽章:
- 1
|
本帖最后由 py 于 2013-11-14 10:41 编辑
最近正好又需要做页面分析,以前全是用AnyEvent::HTTP和Web::Scraper。这次试了试Mojo::DOM和Mojo::UserAgent。
先说结论,我的试用结论是:如果程序不和web沾边,只是个页面分析或文件处理程序,那还是前者好。否则的话可以考虑Mojo.
先说Mojo::DOM和Mojo::UserAgent的优点:
Mojo::DOM做的这个dom选择器在一些时候是非常方便的
读入HTML以后可以精确定位需要的元素或是用回调的方式遍历。- my $dom = Mojo::DOM->new($html_string);
- $dom->find('p[id]')->each(sub { say shift->{id} });
复制代码 在配合Mojo::UserAgent使用的时候就更方便了。Mojo::UserAgent有丰富的功能,但如果你不想用那些,你可以就把它当成一个wget(http client)用。它不但支持同步get也支持非阻塞get网页。而且和Mojo::DOM整合的很好。比如:- my $ua = Mojo::UserAgent->new;
- my $title = $tx->res->dom->at('head title')->text;
复制代码 当把这一切放到Mojolicious web框架里的时候就更美好了,因为都是一个作者写的,整合性就非常好。以前要兴师动众的工作现在2,3行代码就完成了。
以上看着都很美好了,我说些在我看来的缺点。
1. 不支持XPATH。
我很熟悉XPATH,但很不幸,不支持XPATH。虽然很多东西都可以用mojo的方式实现,但我还是能说出一些我常用但没实现的东西。并且我猜测因为此,效率也会差很多。由于Web::Scraper是用xpath,并且可以用XML::LibXML来解析html/xml,XML::LibXML是目前所有DOM方式中最快的(libxml2 > expat)。所以我认为一个纯perl写的非xpath方式的DOM选择器的效率是不足以做大规模数据分析的。(仅是猜测)
2. 可能是我的使用习惯,页面复杂的时候我还是更喜欢用Web::Scraper
用过Web::Scraper的人都知道,你需要先用xpath写一个符合某类页面的统一规则,然后用这一整套规则去分析一类页面。页面信息复杂的时候这一套规则可能几十甚至上百行。而用Mojo::DOM就只能用好多find->each和perl回调函数裹在一起,不方便调试,写页面分析规则的人还必须得会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;
- };
复制代码 上面的这个可以。下面的这个就不行了。- 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";
- };
复制代码 |
|