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幫幫忙 !
謝謝
根據討論中的結論,再改寫原來的程式碼為:
<pre class="c" name="code">
#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";
}
就可以做到想要的結果了。
您的 $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 程式寫的好壞和功力的問題
我用 wget 1.11.4 試出來了,請參考 用 Wget.exe 1.11.4 下載用 referer 跟 cookie 把關保護的網頁
實驗不對,發問者是說下面網址無效果
http://www.softking.com.tw/soft/download.asp?fid3=23516
結果實驗卻去直接測試它剖析不出來的網址
/soft/clickcount.asp?fid3=23516
修正網址,測試 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" 繼續抓下去
謝謝您的費心實驗,我跟您一樣唯二的兩個程式語言工具就是sh and perl ,呵呵~
其實我的QBQ是這樣的,我在玩LWP::SIMPLE這個Package
我想試著寫出一個程式是類似wget可以抓取某網頁上所有的檔案,LWP裡面的getstore()已經可以將link存檔了,所以我只要能將網頁上的link通通parse出來就好了,只是沒想到會碰到http refer跟cookies的保護,您提供的方法可以讓我將下載的網頁抓出來,我做個實驗應該可以用RE將所有http link列出來
謝謝 保持聯絡
$req->header(Cookie => 'download=download');
這段不太了解,請問為何知道Cookie 該設'download=download' ??
謝謝
參閱 http://ithelp.ithome.com.tw/question/10021692?tab=opinion&oid=85801#85801
當清空 softking cookie後,點 download.asp 多兩個值,無效;而再點 clickcount.asp 又多了兩個值,才有效;就試這兩個值之中,哪一個有效,就找到了。
iT邦 這邊大家的回應都很精彩,我又 拋磚引玉 囉 :D
(嗚嗚,哪天才能拼到下一題最佳解答啊 XD)
Great post! I really enjoyed reading your insights and the way you presented your ideas was clear and engaging. Thank you for sharing your knowledge and perspective with us.Lean Six Sigma Black Belt certification