會員中心 | iThome online | iT邦部落格 | 小7聚樂部

載入中...

lalelee

IT邦初學者
10級

[求教] 用Perl 抓取網頁Link 的一個疑問?
標籤:perl

use LWP::Simple;
use HTML::Parse;
use HTML::Element;

$url ="http://靜態網頁";
$html = get($url);

$parsed_html = parse_html($html);
for (@{ $parsed_html->extract_links() })
{
        $link = $_->[0];
        print "$link\n";
}

若url 換成動態網頁

ex: http://www.softking.com.tw/soft/download.asp?fid3=23516

這個時候就沒有效果了

請IT幫幫忙 !

謝謝



發佈到:發佈到Facebook 發佈到噗浪 發佈到twitter
解決時間:2009-05-28 21:38:42
發問時間:2009-05-27 18:27:24
▼ ADVERTISEMENT ▼

最佳解答(發問者自選)
7

回答:twtw ( IT邦好手4級 )

時間:2009-05-28 20:50:41

根據討論中的結論,再改寫原來的程式碼為:
#use LWP::Simple;
use HTML::Parse;
use HTML::Element;
use LWP::UserAgent;

$ua = LWP::UserAgent->new;
$url ="http://www.softking.com.tw/soft/download.asp?fid3=23516";
$req = HTTP::Request->new(GET => $url);
$req->header(Cookie => 'download=download');

#$html = get($url);
$html = $ua->request($req);
#print $html->content, "\n";
$parsed_html = parse_html($html->content);
for (@{ $parsed_html->extract_links() })
{
        $link = $_->[0];
        print "$link\n";
}

就可以做到想要的結果了。
[求教] 用Perl 抓取網頁Link 的一個疑問?
回答:pcboy( IT邦高手1級 )
時間:2009-05-27 18:52:52
7
您的 $html 應該抓到下面部分


<SCRIPT LANGUAGE = "JavaScript">
<!--
{
alert("■ 網頁提示 ■\n\n◆您瀏覽器的功能 Cookies 未開啟,或您不可直接由此進入網頁\n\n◆將帶您回到該軟體的說明網頁,您再進入此網頁\n\n◆若您再進入網頁仍看到此訊息,表示您的 Cookies 功能真的該打開了");
window.parent.location.href="/soft/clickcount.asp?fid3=23516";
}
//-->
</Script>

parse_html 是否有能力抓出 /soft/clickcount.asp?fid3=23516 就很難說了

這是 parser 程式寫的好壞和功力的問題
經過測試
Teleport Pro 1.56 有能力剖析出該網址
wget 1.5.3.1 (免費軟體) 無能 parser 出該網址2009-05-27 18:57:20 補充
去換新版的 Perl 看看分析網頁中網址能力是否有強化2009-05-27 20:11:41 補充
以新版 WGet 實驗

WGET for Windows (win32) - current version: 1.11.4
http://users.ugent.be/~bpuype/wget/

測試 mirror抓十層
wget -m --level=10 http://www.softking.com.tw/soft/download.asp?fid3=23516

只能抓到 download.asp@fid3=23516 檔案而已2009-05-28 08:32:13 補充
回答:powerop( IT邦初學者6級 )
時間:2009-05-28 01:15:26
9
我用 wget 1.11.4 試出來了,請參考 用 Wget.exe 1.11.4 下載用 referer 跟 cookie 把關保護的網頁

參考資料:http://snippets.dzone.com/posts/show/3937

[-隱藏]

回應 powerop

1

pcboy 說:

實驗不對,發問者是說下面網址無效果
http://www.softking.com.tw/soft/download.asp?fid3=23516

結果實驗卻去直接測試它剖析不出來的網址
/soft/clickcount.asp?fid3=23516

2009-05-28 08:18:26

2

pcboy 說:

修正網址,測試 mirror抓十層

測試(a)
wget -m --level=10 --cookies=on --keep-session-cookies --save-cookies=cookie.txt http://www.softking.com.tw/soft/download.asp?fid3=23516

測試(b)
wget -m --level=10 --referer=http://www.softking.com.tw/soft/download.asp?fid3=23516 --cookies=on --load-cookies=cookie.txt --keep-session-cookies --save-cookies=cookie.txt http://www.softking.com.tw/soft/download.asp?fid3=2351

只能抓到 download.asp@fid3=23516 檔案而已,表示無法從 download.asp?fid3=23516 中剖析出 clickcount.asp?fid3=23516" 繼續抓下去

2009-05-28 08:34:54

3

lalelee 說:

謝謝您的費心實驗,我跟您一樣唯二的兩個程式語言工具就是sh and perl ,呵呵~

其實我的QBQ是這樣的,我在玩LWP::SIMPLE這個Package
我想試著寫出一個程式是類似wget可以抓取某網頁上所有的檔案,LWP裡面的getstore()已經可以將link存檔了,所以我只要能將網頁上的link通通parse出來就好了,只是沒想到會碰到http refer跟cookies的保護,您提供的方法可以讓我將下載的網頁抓出來,我做個實驗應該可以用RE將所有http link列出來

謝謝 保持聯絡

msn: lale.lee@msa.hinet.net

2009-05-28 10:48:01

4

lalelee 說:

$req->header(Cookie => 'download=download');

這段不太了解,請問為何知道Cookie 該設'download=download' ??

謝謝

2009-05-28 22:10:42

5

twtw 說:

參閱 http://ithelp.ithome.com.tw/question/10021692?tab=opinion&oid=85801#85801
當清空 softking cookie後,點 download.asp 多兩個值,無效;而再點 clickcount.asp 又多了兩個值,才有效;就試這兩個值之中,哪一個有效,就找到了。

2009-05-28 22:56:17

6

powerop 說:

iT邦 這邊大家的回應都很精彩,我又 拋磚引玉 囉 :D
(嗚嗚,哪天才能拼到下一題最佳解答啊 XD)

2009-05-31 00:13:25

回應

請填寫您的回應,長度限為1,000個字,回應不計點數,也不限使用次數



 

檢舉違規

違規事項:

*補充檢舉理由(可省略),字數不可超過100字

推薦

推薦理由:


*給回答者的鼓勵(可不填),字數不可超過100字

▼ ADVERTISEMENT ▼

廠商來幫忙

Openfind
Intel
   infobox
savemore
nssit

關於「廠商來幫忙」>>

邦友收藏動態

最新收藏最多人推最多人收

新增收藏

安裝「收藏快捷鍵」

安裝「收藏快捷鍵」,可以讓邦友直接透過Google工具列上的按扭,快速收藏站內、站外的網頁。

訂閱每日摘要

iT邦幫忙即日起提供「每日摘要」給尚未註冊的邦友,只要輸入您的E-mail,每日就可以收到最新的發問與分享