文章标签 » python

一个python版的开源web截图工具:python-webkit2png

http://github.com/AdamN/python-webkit2png/
一个使用pyqt4里的QtWebkit实现的命令行的web截图软件,可用于服务器端的web截图
貌似是个比较新的项目,以前找过类似的工具,没有多好用的,但是这个真的很好用,看一下参数就知道了

Creates a screenshot of a website using QtWebkit.This program comes with
ABSOLUTELY NO WARRANTY. This is free software, and you are welcome to
redistribute it under the terms of the GNU General Public License v2.

Options:
  --version             show program's version number and exit
  -h, --help            show this help message and exit
  -x WIDTH HEIGHT, --xvfb=WIDTH HEIGHT
                        Start an 'xvfb' instance with the given desktop size.
  -g WIDTH HEIGHT, --geometry=WIDTH HEIGHT
                        Geometry of the virtual browser window (0 means
                        'autodetect') [default: (0, 0)].
  -o FILE, --output=FILE
                        Write output to FILE instead of STDOUT.
  -f FORMAT, --format=FORMAT
                        Output image format [default: png]
  --scale=WIDTH HEIGHT  Scale the image to this size
  --aspect-ratio=RATIO  One of 'ignore', 'keep', 'crop' or 'expand' [default:
                        none]
  -F FEATURE, --feature=FEATURE
                        Enable additional Webkit features ('javascript',
                        'plugins')
  -w SECONDS, --wait=SECONDS
                        Time to wait after loading before the screenshot is
                        taken [default: 0]
  -t SECONDS, --timeout=SECONDS
                        Time before the request will be canceled [default: 0]
  -W, --window          Grab whole window instead of frame (may be required
                        for plugins)
  --style=STYLE         Change the Qt look and feel to STYLE (e.G. 'windows').
  -d DISPLAY, --display=DISPLAY
                        Connect to X server at DISPLAY.
  --debug               Show debugging information.
  --log=LOGFILE         Select the log output file

使用举例:
使用之前安装依赖的包

sudo apt-get install python-qt4

OK,可以用了,假如在用ubuntu桌面版的话就很简单了

#加上运行权限 
chmod +x ./webkit2png.py
#高度设置为0,就可以获得整个页面的截图了
./webkit2png.py -g 1024 0 https://bluehua.org -o test.png

假如运行在服务器上,没有x环境,则需要安装一些额外的依赖包

#安装xvfb用于虚拟X环境
apt-get install xvfb
#安装中文字体
apt-get install xfonts-wqy
#配置字体
fontconfig-voodoo -f -s zh_CN

运行时需要加额外的参数

#x选项用于指定虚拟出来的X桌面的尺寸
./webkit2png.py -x 1024 768 -g 1024 0 https://bluehua.org -o test.png

恩,其实我找这个东西的目的是想在服务器端获取一个页面的实际渲染宽度,目的达成~

———–
post by gmail~

多线程使用pycurl时出现段错误(segmentation fault)

http://www.python-forum.org/pythonforum/viewtopic.php?f=5&t=9395

只需要加一个选项

client.setopt(pycurl.NOSIGNAL, 1)

文档的解释

Pass a long. If it is 1, libcurl will not use any functions that install signal handlers or any functions that cause signals to be sent to the process. This option is mainly here to allow multi-threaded unix applications to still set/use all timeout options etc, without risking getting signals. (Added in 7.10)

If this option is set and libcurl has been built with the standard name resolver, timeouts will not occur while the name resolve takes place. Consider building libcurl with c-ares support to enable asynchronous DNS lookups, which enables nice timeouts for name resolves without signals.

一个支持url变量的压力测试工具pywebbench

可能是我的本子配置不行,服务器上连接数可以上1000

./pywebbench.py -c 1000 -t 10 http://172.16.0.38/test.php

1000 clients, running 10 sec, timeout setting 2.
Requests: 7387 total ,7385 susceed, average 99%.
2 fail:
timeout:1
connect refused:1
not 2xx status:0

————————————-
2010.7.14更新 可以输出更多信息,svn版本7

100 clients, running 10 sec, timeout setting 2.
Requests: 1361 total ,1027 susceed, average 75%.
334 fail:
timeout:254
connect refused:80
not 2xx status:0

—————————–
测试需要,特别是测试缓存,逮住一个url压没什么用,所以写了一个pywebbench满足需求

#url中的id会顺序变化
pywebbench.py -c 100 -t 10 http://test.com/xx.php?id={10000,12000000}
#url中的id随机变化
pywebbench.py -c 100 -t 10 http://test.com/xx.php?id={10000,12000000#random}

实际数据

#这是pywebbench跑的数据,curl这么牛逼吗,远远把webbench落在后面。。。
$python ~/bin/pywebbench.py -c 300 -t 10 http://localhost/

300 clients, running 10 sec.
Requests: 20430 total 19318 susceed, 1112 failed.

#这是webbench跑的数据
$webbench -c 300 -t 10 http://localhost/
Webbench - Simple Web Benchmark 1.5
Copyright (c) Radim Kolar 1997-2004, GPL Open Source Software.

Benchmarking: GET http://localhost/
300 clients, running 10 sec.

Speed=56964 pages/min, 3997446 bytes/sec.
Requests: 9494 susceed, 0 failed.

已知问题:
python的线程貌似开不多,-c 500 开不了。。

下载:
http://code-of-emptyhua.googlecode.com/svn/trunk/pywebbench.py
需要安装pycurl:sudo apt-get install python-pycurl

替换js中的字符串常量为变量

最近需要把整站js中的域名替成变量,awk查资料写了大半天也没整出个啥,话说我的正则还是太初级,话说我买的正则书也不知跑到哪去了,话说好书还是要放到家里

于是还是用python,没有用正则,但是好像跑起来真的比awk快~

脚本下载:replace_keyword.zip

效果:

//替换之前
var s = '';
//替换之后
var s = '';

使用方法:
首要要修改脚本里要替换的关键词

config['keyword'] = 'abc.com'
config['vname'] = 'siteDomain'

然后

python replace_keyword.py ./myscript.js > /tmp/ooxx
mv /tmp/ooxx ./myscript.js

批量替换的话就需要写个简单的shell:replace_keyword.sh

#!/bin/sh
python replace_keyword.py $1 > /tmp/ooxx
mv /tmp/ooxx $1

批量替换整个目录

find ./ -name "*.js" | xargs -i sh replace_keyword.sh {}

最后任务远没有结束,这个脚本还不够强大,它只会替换字符串中的关键字,作为对象属性名称的字符串不会替换,正则中的关键字无法替换,像下面:

var config = {
    'blog.abc.com' : 1,
    'game.abc.com' : 2
}
//需要手工替换为
var config = {};
config['blog' + siteDomain] = 1;
config['game' + siteDomain] = 2;

if ( /abc\.com/.test(str) ){}
//需要手工替换为
if ( new RegExp( siteDomain.replace('.','\.') ).test(str) ){}

所以运行完脚本之后还需要检查未替换的地方,手工完成

find ./ -name "*.js" | xargs grep 'abc\\\?\.com'

Gmail to wordpress:通过mail更新wordpress

个人比较习惯用email更新博客,写日记用的blogger一直是手机写邮件更新,于是打算这个工作blog也要这么搞

wordpress自身有个通过邮件更新的功能,但是很弱,不支持附件.所以俺再次拿python做练习

实现方式:

发布blog时只要写信给somebody+xxoo@gmail.com

脚本会定时检查somebody@gmail邮箱,

取出收信人是somebody+xxoo@gmail.com的未读邮件(加xxoo为了防止垃圾邮件),然后将邮件正文中引用的图片取出,上传到blog或着picasa,将返回的地址作为图片的新地址,然后通过wordpress的metaWeblog api 发布到wordpress

实现特性:

  • 可以通过添加"[[tag:t1,t2,t3]]"设定文章的标签
  • 可以通过添加"[[cat:c1,c2]]"设定文章分类
  • 可以添加"[[end]]"标记文章结尾,标记后面的字符将被忽略
  • 可以添加[[html]][[/html]]块发布纯html代码块
  • 可以将邮件中的图片提取,并上传到picasa或者wp
(备注:"[["实际使用用时要用三个,即"[[[xxxx]]]"这里用两个是因为本文也是通过这个脚本发布的)

运行环境:
python2.6(ubuntu)(其他版本未测),gdata库

部分代码:

def after_publish( self, mid ):

        self.mail.read( mid )


#实例化一个Gmail2Blog,参数依次为:gmail帐号,gmail密码,wp帐号,wp密码,blog的xmlrpc地址
myG2B = Gmail2Blog( 'somebody@gmail.com', 'xxxx', 'admin', 'xxxx', 'http://xxoo.com/xmlrpc.php' )



#将处理完的邮件标记为已读
myG2B.publish_callback = after_publish

#设置图片的上传方式,'picasa':上传到账户的picasa相册,'wp':上传到blog
myG2B.upload2 = 'picasa'
    
while True:
    #将收件箱中发送给'somebody+blog@gmail.com'的未读邮件发送到blog


    myG2B.publish_mail( 'INBOX' , '(UNSEEN) (TO \"somebody+blog@gmail.com\")' )
    #每隔十分钟检查一次
    time.sleep( 60 * 10 )

源码下载:
非常不靠谱版本(等靠谱了就放到vps上长期运行)

gmail2blog-sbeta.tar.gz

Gmail撰写截图:

screenshot_016.png