《LinuxShell腳本攻略》筆記竟宋,Chap-5: 一團(tuán)亂麻提完?沒(méi)這回事
入門
本章會(huì)研究一些用于解析網(wǎng)站內(nèi)容、下載數(shù)據(jù)丘侠、發(fā)送數(shù)據(jù)表單以及網(wǎng)站頗為任務(wù)自動(dòng)化之類的實(shí)例徒欣。我們可以僅用幾行腳本就將很多原本需要通過(guò)瀏覽器交互進(jìn)行的活動(dòng)管理自動(dòng)化。通過(guò)命令行工具利用HTTP協(xié)議所提供的功能蜗字,我們可以用腳本解決大部分Web自動(dòng)化的問(wèn)題帚称。
網(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)開(kāi)始下載
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í)間新的文件
#訪問(wèn)需要認(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
#打開(kāi)本地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可以通過(guò)指定一個(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操作過(guò)程中使用到的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
從命令行訪問(wèn)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"