国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Linux > 正文

linux多線程網頁截圖 python與shell方法

2024-08-27 23:59:49
字體:
來源:轉載
供稿:網友

多線程功能是linux中非常成熟的一個功能了,下面我們介紹linux多線程網頁截圖功能,下面有兩個例子,一個是python另一個是shell,具體我們來看看吧.

shell多線程網頁截

linux的兩個截圖工具cutycapt和phantomjs,經過測試,cutycapt截圖較慢,但比較穩定,phantomjs截圖速度較快,但時有出現進程假死的狀態,權衡利弊,決定使用cutycapt+shell腳本的方式截圖.

  1. webshot.sh 
  2.  
  3. #/bin/bash 
  4. #webhsot 
  5. #by caishzh 2013 
  6.  
  7. WEBSHOTDIR="/data/webshot" 
  8. mkdir -p $WEBSHOTDIR 
  9.  
  10. while read LINE 
  11. do 
  12.      DISPLAY=:0 cutycapt --url=http://$LINE --max-wait=90000 --out=$WEBSHOTDIR/$LINE.jpg >/dev/null 2>&1 
  13. done<domain.txt 

腳本很簡單,就不注釋了,domain.txt是網址列表,cutycapt的安裝和使用參照這里,執行腳本,可以正常截圖,圖片質量也很高,但另一個問題出現了,對幾萬個網站截圖,時間周期太長,估算需要半個月左右.

時間太長,耗不起,需要優化下腳本,找了下資料,決定使用多線程截圖,其實shell無法實現多線程,只是將多個進程放入后臺執行而已.

  1. multiwebshot.sh 
  2.  
  3. #/bin/bash 
  4. #Multithreading webshot 
  5. #by caishzh 2013 
  6.  
  7. WEBSHOTDIR="/data/webshot" 
  8. mkdir -p $WEBSHOTDIR 
  9.  
  10. #將domain.txt分割成10個文件(x開頭),每個文件5000行 
  11. split -l 5000 domain.txt 
  12.  
  13.  
  14. for i in `ls x*`;do 
  15.     for j in `cat $i`;do 
  16.             DISPLAY=:0 cutycapt --url=http://$j --max-wait=90000 --out=$WEBSHOTDIR/$j.jpg >/dev/null 2>&1 
  17.     done 
  18. }& 
  19. done 
  20. wait 
  21.  
  22. #刪除由spilt分割出的臨時文件 
  23. rm x* -f 

腳本說明:先使用split將domain.txt分割成多個個文件,每個文件5000行,再使用兩個嵌套的for循環實現多進程截圖,第一個for是列出由split分割的的文件名,第二個for對這些文件里的網站截圖,注意大括號后面的&,&的作用是將大括號里的腳本代碼放到后臺執行,這就模擬處理“多線程”的效果,實際則是多進程,wait是等待前面的后臺任務全部完成才往下執行.

使用該腳本大大提高了截圖的是速度,在兩天左右的時間里完成所有網站的截圖,效果顯著,需要注意的是,cutycapt截圖是需要占用較大的網絡帶寬和cpu資源,在配置較差的機器上不要開太多的cutycapt“線程”,以免造成機器死機.

python多線程網頁截

剛好最近在學習python,而python可以很方便的支持多線程,找了些資料,使用threading+queue的方式實現了“能者多勞”的多線程截圖方式.

  1. #coding:utf-8 
  2. import threading,urllib2 
  3. import datetime,time 
  4. import Queue 
  5. import os 
  6.  
  7. class Webshot(threading.Thread): 
  8.         def __init__(self,queue): 
  9.                 threading.Thread.__init__(self) 
  10.                 self.queue=queue 
  11.  
  12.         def run(self): 
  13.                 while True: 
  14.                        #如果隊列為空,則退出,否則從隊列中取出一條網址數據,并截圖 
  15.                         if self.queue.emptyempty(): 
  16.                                 break 
  17.                         host=self.queue.get().strip('/n'
  18.                         shotcmd="DISPLAY=:0 cutycapt --url=http://"+host+" --max-wait=90000 --out="+host+".jpg" 
  19.                         os.system(shotcmd) 
  20.                         self.queue.task_done() 
  21.                         time.sleep(1) 
  22.  
  23. def main(): 
  24.         queue=Queue.Queue() 
  25.         f=file('domain.txt','r'
  26.  
  27.      #往隊列中填充數據 
  28.         while True: 
  29.                 line=f.readline() 
  30.                 if len(line)==0: 
  31.                         break 
  32.                 queue.put(line) 
  33.  
  34.       #生成一個 threads pool, 并把隊列傳遞給thread函數進行處理,這里開啟10個線程并發 
  35.         for i in range(0,10): 
  36.                 shot=Webshot(queue) 
  37.                 shot.start()  //Vevb.com 
  38.  
  39. if __name__=="__main__"
  40.         main() 

程序描述如下:

1、創建一個Queue.Queue() 的實例,將domain.txt里的網站列表存入到該隊列中.

2、for循環生成10個線程并發.

3、將隊列實例傳遞給線程類Webshot,后者是通過繼承 threading.Thread 的方式創建的.

4、每次從隊列中取出一個項目,并使用該線程中的數據和 run 方法以執行相應的工作

5、在完成這項工作之后,使用 queue.task_done() 函數向任務已經完成的隊列發送一個信號.

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 大新县| 江都市| 时尚| 周宁县| 五大连池市| 墨玉县| 潜江市| 丹江口市| 县级市| 乌鲁木齐市| 新沂市| 枞阳县| 津南区| 河源市| 濮阳县| 伊通| 洮南市| 靖安县| 莆田市| 长春市| 同仁县| 天祝| 遂平县| 石阡县| 大竹县| 郸城县| 武乡县| 饶阳县| 西乡县| 京山县| 鄱阳县| 龙里县| 工布江达县| 资中县| 岳池县| 崇义县| 科技| 石台县| 金堂县| 沧源| 保山市|