当前位置:首页 > linux教程 > 列表

linux多线程网页截图 python与shell方法

发布:smiling 来源: PHP粉丝网  添加日期:2015-05-06 14:30:10 浏览: 评论:0 

多线程功能是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()  //phpfensi.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() 函数向任务已经完成的队列发送一个信号.

Tags: linux多线程 python shell

分享到: