這一章介紹使用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,不過目前不懂。
留言列表