[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 勾起來,
再讓表單送出,這樣就能將連線全部記錄下來:
送出表單成功登入後,可以看一下 Network 的第一筆記錄,這就是送出表單的那個 HTTP 請求。
從 Form Data 那邊可以看到送出的表單資料,按一下 view source 可以看到原始送出的資料,
通常是像 username=aaa&password=bbb&data=ccc 這樣的格式,
這個資料待會在 wget 中送出表單時會送到:
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?