[Mac/Linux] 用 wget 下載需要登入後才能瀏覽的網頁

[Mac/Linux] 用 wget 下載需要登入後才能瀏覽的網頁

最近有個麻煩的差事…

之前我們將 wiki 從 moinmoin 搬到 Jira 上,上面的文章也都一併搬了過去,

但文章裡有許多連結/圖片還是指向舊的 moinmoin,

這次的任務是把這些文章找出來換掉…

 

如果 Jira 是我們自己管理的話,應該是有辦法直接從資料庫/HTML 裡面搜尋到我們要的,

但 Jira 不是我們管的 (是公司 IT 管理的),我只能看到網頁,

因此可以入手的點就是從 Jira 上下載整個專案的所有文章,

再用 grep 來找有無用到舊的 moinmoin 的 IP/host name…

 

正好之前有學到 使用 wget -r 下載整個網站目錄,因此這次也想如法泡製,

不過因為 Jira 是需要登入後才能瀏覽的,因此我們得讓 wget 也能登入網站才行,

否則 wget 就只會抓下一堆要求我們登入的網頁…

如果是一般 HTTP 認證的話,wget 有選項可以使用

(或是用 http://username:password@site 之類的 URL),

但如果是網站使用表單 (form) 來登入的話,就得先讓 wget 送出表單,

將登入後的 cookie 內容存起來,給接下來的連線使用~

 

1. 使用 Chrome 送出登入表單,取得送出表單所需的資料

要讓 wget 登入表單,得先拿到要送出的表單的相關資料,

最簡單的方式還是用 Chrome 打開登入網頁,同時把 Developer tools 打開,

切到 Network 頁面,先把 Preserve log 勾起來,

再讓表單送出,這樣就能將連線全部記錄下來:

Screen Shot 2016-12-05 at 5.09.25 PM

 

送出表單成功登入後,可以看一下 Network 的第一筆記錄,這就是送出表單的那個 HTTP 請求。

從 Form Data 那邊可以看到送出的表單資料,按一下 view source 可以看到原始送出的資料,

通常是像 username=aaa&password=bbb&data=ccc 這樣的格式,

這個資料待會在 wget 中送出表單時會送到:

Screen Shot 2016-12-05 at 5.11.10 PM  

 

2. 使用 wget 送出登入表單的資料,產生登入後的 cookie

讓 wget 用 –post-data 後面帶剛剛的表單資料,wget 就也能登入網頁了,

同時加上 –save-cookies 和 –keep-session-cookies 選項,

好讓登入後的 cookies 可以被儲存下來,例如:

wget --save-cookies cookies.txt --keep-session-cookies --post-data 'os_username=testuser&os_password=testpass&os_cookie=true&login=Log+in&os_destination=%2Findex.action' https://wiki.jarvis.corp.com/UTS/index.html

 

儲存下來的 cookies.txt 是個純文字檔,格式像下面這樣:

# HTTP cookie file.
# Generated by Wget on 2016-12-05 17:02:08.
# Edit at your own risk.
wiki.jarvis.corp.com  FALSE  /  TRUE  1512464525  seraph.confluence   1111222233334444224f941968e2219af7a59163d05dcdb78
wiki.jarvis.corp.com  FALSE  /  TRUE  0  JSESSIONID  1234567890577022D9F72634014178D3

 

3. 使用 wget 搭配 cookies 瀏覽網站

只要加上 –load-cookies 選項,wget 就能使用剛剛儲存的 cookies,

來自由瀏覽網站,不會再被要求要登入了~

再搭配 -r –no-parent 選項,就能完整的將整個網站下載回來囉:

wget --load-cookies cookies.txt -r --no-parent https://wiki.jarvis.corp.com/display/UTS/index.html

 

參考資料:How to get past the login page with Wget?

 

(本頁面已被瀏覽過 1,057 次)

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料