2011-12-31 97 views
5

有一個登錄表單頁面通常可以用如何下載登錄後重定向的頁面?

wget --no-check-certificate --save-cookies cookies --keep-session-cookies \ 
    --post-data="username=example&password=example" \ 
    "https://example.com/index.php?title=Special:Userlogin&returntotitle=" 

wget --no-check-certificate --load-cookies=cookies \ 
    --no-parent -r --level=2 -nc -E \ 
    https://example.com/Special:Sitemap 

下載,但在DekiWiki網站的情況下,如果需要登錄這不起作用。在man wget

注被描述

問題縫線:如果wget重定向POST請求完成後,它不會 POST數據發送到重定向的URL。這是因爲處理POST的URL通常會響應 ,並重定向到不需要或接受POST的常規頁面。這不是 完全清楚,這種行爲是最佳的;如果不能解決問題,可能會在將來更改 。

問題

可以這樣使用Perl例如完成也許HTML::TreeBuilder 3HTML::TokeParserMechanize或任何其他Perl模塊?

回答

4

某些需要登錄的網站不會將cookie發回給迴應。

相反,他們發送重定向響應(302對象移動),大多數瀏覽器會自動遵循該響應,然後在該重定向頁面的響應中發送Cookie。

我使用curl通過啓用curl_opt FOLLOW_LOCATION來執行此操作,對於使用-location選項的命令行工具。這是一個像wget這樣的免費工具。

curl --cookie cookie.txt --cookie-jar cookie.txt \ 
    --data-urlencode "username=example&password=example" \ 
    --insecure --location https://example.com/index.php?title=Special:Userlogin&returntotitle= -o downloadedfile.html https://example.com/Special:Sitemap 

http://curl.haxx.se/download.html

此外,有時一個登錄表單預計的多部分/格式數據後,而不是僅僅一個應用程序/ x-WWW窗體-urlencoded交。爲了讓curl做一個多部分/表單數據的post轉換,他將--data-urlencode改爲-F。

+0

非常有趣。是否也可以鏡像該網站?在我的例子中,我使用wget的'--no-parent -r --level = 2'。 – 2011-12-31 18:36:16

+1

您的意思是遞歸下載從原始頁面指向的所有頁面?不,curl的no -r --level = 2等效,但是,API接口libcurl可以很容易地編程來解析html頁面,並下載該頁面中的所有鏈接。 Libcurl具有以下語言(以及更多)的綁定: @Motes,「-cookie-jar」C++,Java,Lisp,.NET,Object-Pascal,Pascal,Perl,PHP,Python,Ruby,Visual Basic – Motes 2012-01-02 03:28:18

+0

@需要改成「--cookie-jar」,對吧? – Sathish 2012-05-26 03:25:45