亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
12下一頁
最近訪問板塊 發(fā)新帖
查看: 8346 | 回復(fù): 14
打印 上一主題 下一主題

介紹一下Mojolicious的DOM選擇器Mojo::DOM和它的Mojo::UserAgent(比較Web::Scraper) [復(fù)制鏈接]

論壇徽章:
1
2015年辭舊歲徽章
日期:2015-03-03 16:54:15
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2013-11-14 08:22 |只看該作者 |倒序瀏覽
本帖最后由 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)的方式遍歷。
  1. my $dom = Mojo::DOM->new($html_string);
  2. $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整合的很好。比如:
  1. my $ua = Mojo::UserAgent->new;
  2. 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了。
  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. };
復(fù)制代碼
上面的這個可以。下面的這個就不行了。
  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. };
復(fù)制代碼

論壇徽章:
13
雙魚座
日期:2013-10-23 09:30:05數(shù)據(jù)庫技術(shù)版塊每日發(fā)帖之星
日期:2016-04-20 06:20:00程序設(shè)計版塊每日發(fā)帖之星
日期:2016-03-09 06:20:002015亞冠之塔什干火車頭
日期:2015-11-02 10:07:452015亞冠之德黑蘭石油
日期:2015-08-30 10:07:07數(shù)據(jù)庫技術(shù)版塊每日發(fā)帖之星
日期:2015-08-28 06:20:00數(shù)據(jù)庫技術(shù)版塊每日發(fā)帖之星
日期: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
2 [報告]
發(fā)表于 2013-11-14 09:43 |只看該作者
學(xué)習(xí)了~分析html dom時支持Xpath確實方便不少

論壇徽章:
0
3 [報告]
發(fā)表于 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
4 [報告]
發(fā)表于 2013-11-19 11:14 |只看該作者
你不是一直說這是不傳之秘嗎。。。。

論壇徽章:
1
雙子座
日期:2013-11-06 17:18:01
5 [報告]
發(fā)表于 2013-11-19 11:57 |只看該作者
回復(fù) 1# py


    也支持非阻塞get網(wǎng)頁
》能簡單說明一下,什么叫非阻塞GET網(wǎng)頁?

論壇徽章:
1
雙子座
日期:2013-11-06 17:18:01
6 [報告]
發(fā)表于 2013-11-19 12:03 |只看該作者
回復(fù) 1# py


    同時,LZ能否給我們新手講解一下AE下所謂有事件編程,因為我簡單查看入門資料后發(fā)現(xiàn)AE好像也會是“阻塞”的,比如程序控制權(quán)交給 AnyEvent LOOP時,如果沒有期待的事件發(fā)生,就會一直阻塞在哪。

論壇徽章:
1
2015年辭舊歲徽章
日期:2015-03-03 16:54:15
7 [報告]
發(fā)表于 2013-11-19 12:08 |只看該作者
quanpai 發(fā)表于 2013-11-19 11:11
請問用什么工具找xpath。

沒明白你說的“用什么工具找”是什么意思

根據(jù)想要信息,你寫出對應(yīng)的xpath路徑,然后扔給XML::LibXML,得到結(jié)果。

論壇徽章:
1
2015年辭舊歲徽章
日期:2015-03-03 16:54:15
8 [報告]
發(fā)表于 2013-11-19 12:09 |只看該作者
墨跡哥 發(fā)表于 2013-11-19 11:14
你不是一直說這是不傳之秘嗎。。。。

辟謠。我哪那么說過啊。。。
技術(shù)上的東西,哪有什么“不能說的秘密”

論壇徽章:
1
2015年辭舊歲徽章
日期:2015-03-03 16:54:15
9 [報告]
發(fā)表于 2013-11-19 12:34 |只看該作者
回復(fù) 5# seufy88

你沒理解這個“非阻塞”的意思。就像我們說Coro::AnyEvent::sleep是非阻塞的,而sleep是阻塞的。這兩個sleep都會阻塞當(dāng)前的block,但如果一段程序中有多個這樣的block的時候,前者會阻塞當(dāng)前block,但會放棄cpu允許其他的block繼續(xù)運行,即非阻塞。后者不但在阻塞當(dāng)前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;
復(fù)制代碼
由于是非阻塞的sleep,所以程序5秒后退出。

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

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

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

“事件編程”是實現(xiàn)非阻塞的一個手段。如果還不明白就寫代碼多試試,也許在某個時刻就恍然大悟了。
   

論壇徽章:
3
未羊
日期:2013-11-18 15:17:06酉雞
日期:2013-12-06 17:07:16天蝎座
日期:2014-06-11 12:37:07
10 [報告]
發(fā)表于 2013-11-19 13:57 |只看該作者
回復(fù) 8# py


    這不是跟爬蟲有關(guān)嘛。。只要跟爬蟲有關(guān)基本上都是不傳的秘密。。。

    你都多次把這事要么忽略。。要么就是說這東西說出來就爛了。。。不就是說這是不能說的秘密嗎。。。{:3_185:}
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP