這一章介紹使用LWP, TreeBuilder (模組)來

抓取html 網頁的資料。

 

use LWP::Simple;
use HTML::TreeBuilder;

$html=get("http://www.wretch.cc");
$i=0;
while($html=~/src=\"(.*?\.(jpg|png))\"/g)
{
        print "$1 \n";
        print "$2 \n";
        $req = getstore($1,"$i.$2");
        die unless is_success($req);
        $i++;
}



上面是去無名小站抓取首頁的所有jpg、png 檔。

get 函式,給它url ,$html 裡面存的是給定url 的源始碼。

我們從source code 知道,有圖片的地方

可能會有<img src="...." .... >

所以只要去抓src="AAA"就可以了。

那麼知道圖檔的url 後,使用另一個函式getstore (S,T)

S:url

T:要存的位置。

$req 是的內容是結果的status。

 

另外還有其他方法可以使用

我們可以傳送GET, POST,也可以得到 header 的資料

利用UserAgent

 

use LWP::UserAgent;

my $browser = LWP::UserAgent->new();

$url = 'http://www.guardian.co.uk/';
my $response = $browser->get($url);

print $response->status_line();
print $response->is_success();
print "$response->content_type() \n";
my $content = $response->content();

status_line 印出server 傳回的代碼例如200 , 504 ,等等

is_success 就是有沒有get 成功。

content_type 例如text/html

content 則是內文。

我們可以利用pattern matching 去挖content我們想要的資料。

如果要利用GET、POST傳送資料給server

GET 就是在url 後面自己加東西就可以了。

POST 則看下面的代碼。

$request=LWP::UserAgent->new();
$response=$request->post($url,['db'=>"pubmed", 'term'=>$query]);

傳送name: db , value="pubmed" ... 給server。

 

要得到header 的資料也可以

$value = $response->header(header_name);

 

接下來介紹HTML::TreeBuilder

use LWP::Simple;
use HTML::TreeBuilder;
$html=get("http://www.apress.com");
my $tree=HTML::TreeBuilder->new;
$tree->parse($html);
$tree->eof;
@pnodes=$tree->find_by_tag_name('p');
foreach node(@pnodes){
$node->dump;
}
$tree->delete;

TreeBuilder 是在做parse 的動作,它會將html 代碼做level 分級

<html>0

<head> 0.1 

</head>

</html>

類似上面這樣。

代碼先用get 得到html source ,接下來呼叫parse

然後呼叫eof 代表parse 結束。

我們可以利用下面4個函式得到parse 後有用的結果。

find_by_tag_name

use LWP::Simple;
use HTML::TreeBuilder;

my $html = get("http://www.oreilly.com/");
my $root = HTML::TreeBuilder->new_from_content($html);
my %images;

foreach my $node($root->find_by_tag_name('img'))
{
        $images{$node->attr('src')}++;
}
foreach my $pic(sort keys %images)
{
        print "$pic \n";
}
先得到img tag ,然後裡面有src 屬性,得到src 的值。

另外直接透過attribute 就如下。

@pnodes=$tree->find_by_attribute("align", "left");


其他還有look_down, look_up,不過目前不懂。

 

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 lettice0913 的頭像
    lettice0913

    斑的家

    lettice0913 發表在 痞客邦 留言(0) 人氣()