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是网址列表。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.empty():
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()
if __name__=="__main__":
main()
程序描述如下:
1、创建一个Queue.Queue() 的实例,将domain.txt里的网站列表存入到该队列中
2、for循环生成10个线程并发
3、将队列实例传递给线程类Webshot,后者是通过继承 threading.Thread 的方式创建的
4、每次从队列中取出一个项目,并使用该线程中的数据和 run 方法以执行相应的工作
5、在完成这项工作之后,使用 queue.task_done() 函数向任务已经完成的队列发送一个信号
荒野乱斗国际版 (BrawlStars)最新版本v56.274
下载一波超人内置修改器菜单版 安卓版v1.0.2
下载敢达决战官方正版 安卓版v6.7.9
下载敢达决战 安卓版v6.7.9
下载继承了一座戏园子无限声望铜钱版 内置菜单最新版v1.7
继承了一座戏园子折相思版是游戏的破解版本,在该版本中为玩家提
山河半世橙光清软金手指版 无限鲜花v3.24
山河半世是一款超级好玩的橙光恋爱游戏,在游戏中玩家们需要扮演
蓬莱手游折相思版 安卓版v1.0.0
蓬莱免广告版是游戏的修改版本,在该版本中为玩家去除了广告,玩
当红影后橙光游戏破解版2025 最新版v1.0
当红影后橙光破解版是一款超级好玩的娱乐圈题材的橙光游戏,在这
忽然成了万人迷清软完结版 无限鲜花版v12.15
忽然成了万人迷破解版是一款非常好玩的男性向橙光游戏,在有一天