免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 7859 | 回复: 14

介绍一下Mojolicious的DOM选择器Mojo::DOM和它的Mojo::UserAgent(比较Web::Scraper) [复制链接]

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
发表于 2013-11-14 08:22 |显示全部楼层
本帖最后由 py 于 2013-11-14 10:41 编辑

最近正好又需要做页面分析,以前全是用AnyEvent::HTTP和Web::Scraper。这次试了试Mojo::DOM和Mojo::UserAgent。
先说结论,我的试用结论是:如果程序不和web沾边,只是个页面分析或文件处理程序,那还是前者好。否则的话可以考虑Mojo.

先说Mojo::DOM和Mojo::UserAgent的优点:
Mojo::DOM做的这个dom选择器在一些时候是非常方便的
读入HTML以后可以精确定位需要的元素或是用回调的方式遍历。
  1. my $dom = Mojo::DOM->new($html_string);
  2. $dom->find('p[id]')->each(sub { say shift->{id} });
复制代码
在配合Mojo::UserAgent使用的时候就更方便了。Mojo::UserAgent有丰富的功能,但如果你不想用那些,你可以就把它当成一个wget(http client)用。它不但支持同步get也支持非阻塞get网页。而且和Mojo::DOM整合的很好。比如:
  1. my $ua = Mojo::UserAgent->new;
  2. 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了。
  1. my $coro = async {
  2.     http_get "http://www.example.com/", Coro::rouse_cb;
  3.     my ($data, $header) = Coro::rouse_wait;
  4.     print Dumper $header;
  5. };
复制代码
上面的这个可以。下面的这个就不行了。
  1. my $coro = async {
  2.     my $ua = Mojo::UserAgent->new;
  3.     $ua->get('http://www.example.com/' => Coro::rouse_cb);
  4.     my ($ua2, $tx) = Coro::rouse_wait;
  5.     my $title = $tx->res->dom->at('head title')->text;
  6.     print "$title\n";
  7. };
复制代码

论坛徽章:
13
双鱼座
日期:2013-10-23 09:30:05数据库技术版块每日发帖之星
日期:2016-04-20 06:20:00程序设计版块每日发帖之星
日期:2016-03-09 06:20:002015亚冠之塔什干火车头
日期:2015-11-02 10:07:452015亚冠之德黑兰石油
日期:2015-08-30 10:07:07数据库技术版块每日发帖之星
日期:2015-08-28 06:20:00数据库技术版块每日发帖之星
日期:2015-08-05 06:20:002015年迎新春徽章
日期:2015-03-04 09:57:09辰龙
日期:2014-12-03 14:45:52酉鸡
日期:2014-07-23 09:46:23亥猪
日期:2014-03-13 08:46:22金牛座
日期:2014-02-11 09:36:21
发表于 2013-11-14 09:43 |显示全部楼层
学习了~分析html dom时支持Xpath确实方便不少

论坛徽章:
0
发表于 2013-11-19 11:11 |显示全部楼层
请问用什么工具找xpath。

论坛徽章:
3
未羊
日期:2013-11-18 15:17:06酉鸡
日期:2013-12-06 17:07:16天蝎座
日期:2014-06-11 12:37:07
发表于 2013-11-19 11:14 |显示全部楼层
你不是一直说这是不传之秘吗。。。。

论坛徽章:
1
双子座
日期:2013-11-06 17:18:01
发表于 2013-11-19 11:57 |显示全部楼层
回复 1# py


    也支持非阻塞get网页
》能简单说明一下,什么叫非阻塞GET网页?

论坛徽章:
1
双子座
日期:2013-11-06 17:18:01
发表于 2013-11-19 12:03 |显示全部楼层
回复 1# py


    同时,LZ能否给我们新手讲解一下AE下所谓有事件编程,因为我简单查看入门资料后发现AE好像也会是“阻塞”的,比如程序控制权交给 AnyEvent LOOP时,如果没有期待的事件发生,就会一直阻塞在哪。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
发表于 2013-11-19 12:08 |显示全部楼层
quanpai 发表于 2013-11-19 11:11
请问用什么工具找xpath。

没明白你说的“用什么工具找”是什么意思

根据想要信息,你写出对应的xpath路径,然后扔给XML::LibXML,得到结果。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
发表于 2013-11-19 12:09 |显示全部楼层
墨迹哥 发表于 2013-11-19 11:14
你不是一直说这是不传之秘吗。。。。

辟谣。我哪那么说过啊。。。
技术上的东西,哪有什么“不能说的秘密”

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
发表于 2013-11-19 12:34 |显示全部楼层
回复 5# seufy88

你没理解这个“非阻塞”的意思。就像我们说Coro::AnyEvent::sleep是非阻塞的,而sleep是阻塞的。这两个sleep都会阻塞当前的block,但如果一段程序中有多个这样的block的时候,前者会阻塞当前block,但会放弃cpu允许其他的block继续运行,即非阻塞。后者不但在阻塞当前block的同时不放弃cpu,这样一来,程序中其他的block在阻塞期间也无法运行,即阻塞。

例如:
  1. my $block1 = async {
  2.     Coro::AnyEvent::sleep 5;
  3. };

  4. my $block2 = async {
  5.     Coro::AnyEvent::sleep 5;
  6. };

  7. $block1->join;
  8. $block2->join;
复制代码
由于是非阻塞的sleep,所以程序5秒后退出。

例如:
  1. my $block1 = async {
  2.     sleep 5;
  3. };

  4. my $block2 = async {
  5.     sleep 5;
  6. };

  7. $block1->join;
  8. $block2->join;
复制代码
由于是阻塞的sleep,所以程序需要10秒后才能退出。

“事件编程”是实现非阻塞的一个手段。如果还不明白就写代码多试试,也许在某个时刻就恍然大悟了。
   

论坛徽章:
3
未羊
日期:2013-11-18 15:17:06酉鸡
日期:2013-12-06 17:07:16天蝎座
日期:2014-06-11 12:37:07
发表于 2013-11-19 13:57 |显示全部楼层
回复 8# py


    这不是跟爬虫有关嘛。。只要跟爬虫有关基本上都是不传的秘密。。。

    你都多次把这事要么忽略。。要么就是说这东西说出来就烂了。。。不就是说这是不能说的秘密吗。。。{:3_185:}
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP