加入收藏 | 设为首页 | 会员中心 | 我要投稿 PHP编程网 - 黄冈站长网 (http://www.0713zz.com/)- 数据应用、建站、人体识别、智能机器人、语音技术!
当前位置: 首页 > 教程 > 正文

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

发布时间:2022-06-15 10:23:27 所属栏目:教程 来源:互联网
导读:多线程功能是linux中非常成熟的一个功能了,下面我们介绍linux多线程网页截图功能,下面有两个例子,一个是python另一个是shell,具体我们来看看吧. shell多线程网页截 linux的两个截图工具cutycapt和phantomjs,经过测试,cutycapt截图较慢,但比较稳定,phantomj
  多线程功能是linux中非常成熟的一个功能了,下面我们介绍linux多线程网页截图功能,下面有两个例子,一个是python另一个是shell,具体我们来看看吧.
 
  shell多线程网页截
 
  linux的两个截图工具cutycapt和phantomjs,经过测试,cutycapt截图较慢,但比较稳定,phantomjs截图速度较快,但时有出现进程假死的状态,权衡利弊,决定使用cutycapt+shell脚本的方式截图.
 
  webshot.sh
  
  #/bin/bash
  #webhsot
  #by caishzh 2013
  
  WEBSHOTDIR="/data/webshot"
  mkdir -p $WEBSHOTDIR
  
  while read LINE
  do
       DISPLAY=:0 cutycapt --url=http://$LINE --max-wait=90000 --out=$WEBSHOTDIR/$LINE.jpg >/dev/null 2>&1
  done<domain.txt
  脚本很简单,就不注释了,domain.txt是网址列表,cutycapt的安装和使用参照这里,执行脚本,可以正常截图,图片质量也很高,但另一个问题出现了,对几万个网站截图,时间周期太长,估算需要半个月左右.
 
  时间太长,耗不起,需要优化下脚本,找了下资料,决定使用多线程截图,其实shell无法实现多线程,只是将多个进程放入后台执行而已.
 
  multiwebshot.sh
  
  #/bin/bash
  #Multithreading webshot
  #by caishzh 2013
  
  WEBSHOTDIR="/data/webshot"
  mkdir -p $WEBSHOTDIR
  
  #将domain.txt分割成10个文件(x开头),每个文件5000行
  split -l 5000 domain.txt
  
  
  for i in `ls x*`;do
  {
      for j in `cat $i`;do
              DISPLAY=:0 cutycapt --url=http://$j --max-wait=90000 --out=$WEBSHOTDIR/$j.jpg >/dev/null 2>&1
      done
  }&
  done
  wait
  
  #删除由spilt分割出的临时文件
  rm x* -f
  脚本说明:先使用split将domain.txt分割成多个个文件,每个文件5000行,再使用两个嵌套的for循环实现多进程截图,第一个for是列出由split分割的的文件名,第二个for对这些文件里的网站截图,注意大括号后面的&,&的作用是将大括号里的脚本代码放到后台执行,这就模拟处理“多线程”的效果,实际则是多进程,wait是等待前面的后台任务全部完成才往下执行.
 
  使用该脚本大大提高了截图的是速度,在两天左右的时间里完成所有网站的截图,效果显著,需要注意的是,cutycapt截图是需要占用较大的网络带宽和cpu资源,在配置较差的机器上不要开太多的cutycapt“线程”,以免造成机器死机.
 
  python多线程网页截
 
  刚好最近在学习python,而python可以很方便的支持多线程,找了些资料,使用threading+queue的方式实现了“能者多劳”的多线程截图方式.
 
  #coding:utf-8
  import threading,urllib2
  import datetime,time
  import Queue
  import os
  
  class Webshot(threading.Thread):
          def __init__(self,queue):
                  threading.Thread.__init__(self)
                  self.queue=queue
  
          def run(self):
                  while True:
                         #如果队列为空,则退出,否则从队列中取出一条网址数据,并截图
                          if self.queue.emptyempty():
                                  break
                          host=self.queue.get().strip('n')
                          shotcmd="DISPLAY=:0 cutycapt --url=http://"+host+" --max-wait=90000 --out="+host+".jpg"
                          os.system(shotcmd)
                          self.queue.task_done()
                          time.sleep(1)
  def main():
          queue=Queue.Queue()
          f=file('domain.txt','r')
  
       #往队列中填充数据
          while True:
                  line=f.readline()
                  if len(line)==0:
                          break
                  queue.put(line)
  
        #生成一个 threads pool, 并把队列传递给thread函数进行处理,这里开启10个线程并发
          for i in range(0,10):
                  shot=Webshot(queue)
                  shot.start()  //phpfensi.com
  
  if __name__=="__main__":
          main()
  程序描述如下:
 
  1、创建一个Queue.Queue() 的实例,将domain.txt里的网站列表存入到该队列中.
 
  2、for循环生成10个线程并发.
 
  3、将队列实例传递给线程类Webshot,后者是通过继承 threading.Thread 的方式创建的.
 
  4、每次从队列中取出一个项目,并使用该线程中的数据和 run 方法以执行相应的工作
 
  5、在完成这项工作之后,使用 queue.task_done() 函数向任务已经完成的队列发送一个信号.

(编辑:PHP编程网 - 黄冈站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读