wget、cURL網(wǎng)站相關(guān)

《LinuxShell腳本攻略》筆記,Chap-5: 一團(tuán)亂麻?沒這回事



入門

本章會(huì)研究一些用于解析網(wǎng)站內(nèi)容、下載數(shù)據(jù)、發(fā)送數(shù)據(jù)表單以及網(wǎng)站頗為任務(wù)自動(dòng)化之類的實(shí)例。我們可以僅用幾行腳本就將很多原本需要通過瀏覽器交互進(jìn)行的活動(dòng)管理自動(dòng)化。通過命令行工具利用HTTP協(xié)議所提供的功能,我們可以用腳本解決大部分Web自動(dòng)化的問題。


網(wǎng)站下載

使用一些命令行下載工具,從給定的URL中下載文件或網(wǎng)頁(yè)。
wget是一個(gè)用于文件下載的命令行工具,選項(xiàng)多且用法靈活。

#Wget - The non-interactive(非交互式) network downloader

wget URL1 URL2...
wget http://xxx.com/nginx-1.12.0.tag.gz
wget https://xxx/a.rpm http://xxxx/bb.rpm

#指定文件名,指定信息輸出(wget默認(rèn)是stdout)
wget http://mirrors.aliyun.com/repo/Centos-7.repo -O aliyun.repo -o ./wget.log
wget URL -t 5   #-t,重試次數(shù)

#下載限速
wget --limit-rate=10m URL   #下載限速
wget -Q 100m URL    #指定下載配額

#端點(diǎn)續(xù)傳
#wget進(jìn)行的下載在完成前被中斷,從斷點(diǎn)開始下載
wget -c URL

#用cURL下載
#cURL是一個(gè)比wget更強(qiáng)大的高級(jí)命令工具
#和wget不同,curl并不將下載數(shù)據(jù)寫入文件,而是寫入stdout,因此必須重定向到文件

#復(fù)制或鏡像整個(gè)網(wǎng)站
#wget有一個(gè)選項(xiàng)可以使其像爬蟲一樣以遞歸方式手機(jī)網(wǎng)頁(yè)上所有URL鏈接,并逐個(gè)下載
#這樣一來(lái)就可以下載一個(gè)網(wǎng)站的所有頁(yè)面
wget --mirror URL
#-m(--mirror) -N -r -l inf --no-remove-listing 的縮寫形式。
或 wget -r -N -l DEPTH URL
#-r遞歸下載,-l指定遞歸深度,-N(timestamp)只獲取比本地時(shí)間新的文件

#訪問需要認(rèn)證的HTTP或FTP頁(yè)面
wget --user "username" --password "pass" URL
#如未在命令行內(nèi)輸入密碼,則會(huì)由網(wǎng)頁(yè)提示手動(dòng)輸入


以格式化純文本下載網(wǎng)頁(yè)

網(wǎng)頁(yè)其實(shí)就是包含HTML標(biāo)記和其他諸如Javascript,CSS等元素的HTML頁(yè)面。HTML標(biāo)記是網(wǎng)頁(yè)的基礎(chǔ),也許需要解析網(wǎng)頁(yè)來(lái)查找特定的內(nèi)容。

links,是一個(gè)基于命令行的Web瀏覽器

#links - lynx-like alternative character mode WWW browser

#在命令行中瀏覽一個(gè)網(wǎng)頁(yè)
links www.baidu.com

#以ASCII形式下載網(wǎng)頁(yè)
links --dump URL > URL.txt

#打開本地html文件
links 1.html


cURL入門

cURL支持包括HTTP、HTTPS、FTP在內(nèi)的眾多協(xié)議。它還支持POST、cookie、認(rèn)證、從指定偏移處下載部分文件、參照頁(yè)(referer)、用戶代理字符串、擴(kuò)展頭部(extra header)、限速、文件大小限制、進(jìn)度條等特性。

#curl - transfer a URL
#cURL通常將下載文件輸出到stdout,將進(jìn)度信息輸出到stderr
#要想避免顯示進(jìn)度信息,可使用--silent
#curl可用來(lái)下載、發(fā)送各種HTTP請(qǐng)求、指定HTTP頭部等操作

curl URL --silent   #輸出到stdout

#-O寫入文件,文件名從URL中解析
curl http://www.baidu.com/index.html -O --silent    #創(chuàng)建index.html

#-o將數(shù)據(jù)寫入指定文件
curl URL -o baidu.html --progress   #--progress顯示進(jìn)度條
links baidu.html

#端點(diǎn)續(xù)傳
#和wget不同,cURL包含更高級(jí)的下載恢復(fù)特性,能夠從特定的文件偏移處繼續(xù)下載
#curl可以通過指定一個(gè)偏移量來(lái)下載部分文件
手動(dòng):curl URL/file -C offset  #偏移量以Byte為單位的整數(shù)
自動(dòng):curl -C -URL #自動(dòng)續(xù)傳

#用cURL設(shè)置參照頁(yè)字符串, --referer
#參照頁(yè)(referer)是位于HTTP頭部中的一個(gè)字符串,用來(lái)標(biāo)識(shí)用戶從哪個(gè)頁(yè)面到達(dá)當(dāng)前頁(yè)面的
#如果用戶點(diǎn)擊網(wǎng)頁(yè)A中某個(gè)鏈接,轉(zhuǎn)到了網(wǎng)頁(yè)B。那么網(wǎng)頁(yè)B頭部的referer會(huì)包含網(wǎng)頁(yè)A的URL
curl --referer Referer_URL target_URL
curl --referer http://www.baidu.com http://jianshu.com

#用cURL設(shè)置cookie, --cookie
#可以用curl來(lái)存儲(chǔ)HTTP操作過程中使用到的cookie
#cookie用key=value形式,指定多個(gè)用 分號(hào) 分隔
curl URL --cookie "user=AAA;name=bbb"
curl URL --cookie-jar cookie.txt    #將cookie另存為

#用cURL設(shè)置用戶代理字符串, --user-agent
#如果不指定代理,一些需要用戶代理的網(wǎng)頁(yè)就無(wú)法顯示
curl URL --user-agent(-A) "Mozilla"

#用-H "頭部信息"傳遞多個(gè)頭部信息
curl -H "Host:www.haha.com" -H "Accept-language: en" URL

#限定cURL可占用的帶寬
curl URL --limit-rate 10m

#指定最大下載量
curl URL --max-filesize 大小(Bytes)

#用cURL進(jìn)行認(rèn)證,-u username:password指定用戶名和密碼
curl -u user:pass URL
curl -u user URL    #手動(dòng)輸入密碼

#只打印響應(yīng)頭部信息(無(wú)數(shù)據(jù)部分), -I
curl -I URL


從命令行訪問163郵箱

curl -u user http://mail.163.com
#手動(dòng)輸入密碼


制作圖片抓取器及下載工具

可以用腳本解析圖像文件并將圖片自動(dòng)下載下來(lái)。

curl -s URL | grep -o "<img src=[^>]*>" | sed 's/<img src=//g; s/>//g' > img.list
#匹配圖片的URL,可能還需要細(xì)化修改
#不同的URL可能有不同的規(guī)則,根據(jù)實(shí)際情況取出img的URL

#下載圖片
wget $URL 或 curl -s -O $URL


查找網(wǎng)站中的無(wú)效鏈接

將查找無(wú)效鏈接的工作自動(dòng)化,那就比純手動(dòng)厲害多了!

lynx -traversal URL #會(huì)將URL中所有鏈接生成到reject.dat文件中
sort -u reject.dat | while read link
do
    output=`curl -I $link -s | grep "HTTP/.*OK"`
    if [[ -z $output ]]
    then
        echo $link
    fi
done < links.txt


跟蹤網(wǎng)站變更

可以編寫一個(gè)定期運(yùn)行的變更跟蹤器(change tracker),一旦發(fā)生變更,跟蹤器便會(huì)發(fā)出聲音或發(fā)送提示信息。
在不同時(shí)間檢索網(wǎng)站,然后利用 diff 命令進(jìn)行比對(duì)。

curl URL --silent -o `date +%F`.html    #第一次
curl URL --silent -o `date +%F`.html    #第二次
diff -u 第一次 第二次


以POST方式發(fā)送網(wǎng)頁(yè)并讀取響應(yīng)

POST 和 GET 是HTTP協(xié)議中用于發(fā)送或檢索信息的兩種請(qǐng)求類型。
在GET請(qǐng)求方式中,利用網(wǎng)頁(yè)的URL來(lái)發(fā)送參數(shù)(“鍵-值”);而POST方式用于提交表單,如提交用戶名、密碼以及檢索登錄頁(yè)面等。

curl URL -d “postarg=AABBCC” #-d,http post data
curl URL -d "post1=key1&post2=key2&post3..."    #指定多個(gè)數(shù)據(jù)

wget URL -post-data "post1=key1"
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,597評(píng)論 19 139
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,119評(píng)論 25 708
  • 所有的起心動(dòng)念、負(fù)面情緒都是能量的消耗和浪費(fèi),節(jié)省下來(lái)的就是生命,而節(jié)省的過程就是修行。
    Looloo閱讀 234評(píng)論 0 1
  • 幼時(shí)體弱,遇涼必病,便萌生了鍛煉身體的念頭。 約七八歲的年紀(jì),看了黃元申演的《大俠霍元甲》,又有了做俠客的想法。 ...
    寧國(guó)截拳道舒擁軍閱讀 412評(píng)論 0 0
  • 陣陣疾風(fēng)掃落英 悲秋萬(wàn)里嘆曾經(jīng) 匆匆歲月一年又 片片楓紅不了情 注~~仄起首句入韻,中華新韻
    澄默時(shí)節(jié)閱讀 1,408評(píng)論 10 23

友情鏈接更多精彩內(nèi)容