linux網頁截圖-shell
摘要: 老大臨時安排任務,要定期對大量(萬為單位)的網站截圖並歸檔保存。最早使用的是window下的一個解決方案:webshotcmd.exe+批處理。 運行了一段時間,發現經常彈出webshotcmd.exe程序未響應的窗口,需要人工點擊確定後才能繼續截圖,而且webshocmd未注冊版本截出的 圖是灰色的,不方便查看。 google了下,發現了linux的兩個截圖工具cutycapt和phantomjs,經過測試,cutycapt截圖較慢,但比較穩定,phantomjs截圖速度較快,但時有出現進程假死的狀態。權衡利弊,決定使用cutycapt+shell腳本的方式截圖
老大臨時安排任務,要定期對大量(萬為單位)的網站截圖並歸檔保存。最早使用的是window下的一個解決方案:webshotcmd.exe+批處理。 運行了一段時間,發現經常彈出webshotcmd.exe程序未響應的窗口,需要人工點擊確定後才能繼續截圖,而且webshocmd未注冊版本截出的 圖是灰色的,不方便查看。
google了下,發現了linux的兩個截圖工具cutycapt和phantomjs,經過測試,cutycapt截圖較慢,但比較穩定,phantomjs截圖速度較快,但時有出現進程假死的狀態。權衡利弊,決定使用cutycapt+shell腳本的方式截圖:
webshot.sh
01
#/bin/bash
02
#webhsot
03
#by caishzh 2013
04
05
WEBSHOTDIR="/data/webshot"
06
mkdir -p $WEBSHOTDIR
07
08
while read LINE
09
do
10
DISPLAY=:0 cutycapt --url=http://$LINE --max-wait=90000 --out=$WEBSHOTDIR/$LINE.jpg >/dev/null 2>&1
11
done<domain.txt
腳本很簡單,就不注釋了,domain.txt是網址列表。cutycapt的安裝和使用參照這裡。
執行腳本,可以正常截圖,圖片質量也很高。但另一個問題出現了,對幾萬個網站截圖,時間周期太長,估算需要半個月左右。
時間太長,耗不起,需要優化下腳本。找了下資料,決定使用多線程截圖。其實shell無法實現多線程,只是將多個進程放入後台執行而已。
multiwebshot.sh
01
#/bin/bash
02
#Multithreading webshot
03
#by caishzh 2013
04
05
WEBSHOTDIR="/data/webshot"
06
mkdir -p $WEBSHOTDIR
07
08
#將domain.txt分割成10個文件(x開頭),每個文件5000行
09
split -l 5000 domain.txt
10
11
12
for i in `ls x*`;do
13
{
14
for j in `cat $i`;do
15
DISPLAY=:0 cutycapt --url=http://$j --max-wait=90000 --out=$WEBSHOTDIR/$j.jpg >/dev/null 2>&1
16
done
17
}&
18
done
19
wait
20
#刪除由spilt分割出的臨時文件
21
rm x* -f
腳本說明:
先使用split將domain.txt分割成多個個文件,每個文件5000行,再使用兩個嵌套的for循環實現多進程截圖。第一個for是列出由 split分割的的文件名,第二個for對這些文件裡的網站截圖,注意大括號後面的&,&的作用是將大括號裡的腳本代碼放到後台執行,這 就模擬處理“多線程”的效果,實際則是多進程。wait是等待前面的後台任務全部完成才往下執行。
使用該腳本大大提高了截圖的是速度,在兩天左右的時間裡完成所有網站的截圖,效果顯著。需要注意的是,cutycapt截圖是需要占用較大的網絡帶寬和cpu資源,在配置較差的機器上不要開太多的cutycapt“線程”,以免造成機器死機。