by 梁凯

今天我想给大家分享几个python脚本,分别是: 1.公司访问外网认证脚本(最初有同事写过,我优化了一下)。 2.统计周报系统所有同事的最近一篇周报。 3.统计测试技术分享里指定一个月所有同事的文章数量。 4.统计bugzilla系统里所有的quips。 这几个小脚本都是利用空闲时间,经过多次修改完成的。技术含量也不是特别高,主要是学以致用,因为光说不练假把式,只有在实践当中才能够真正的掌握知识点。实践是检验真理的唯一标准。 一、公司访问外网认证 在公司访问外网得需要认证,有时候不一定能够接触到浏览器,所以利用脚本认证上网还是很方便的。 优化功能: 1. 登录成功会有提示信息 2. 登录失败也会有提示信息,就是说可以捕捉异常 3. 有时候输入中文名字不方便,所以可以把名字提前输入脚本 4. 输入密码屏幕不可见,先前同事写的脚本是明文密码

#!/usr/bin/env python
#coding:utf-8

####################
#公司访问外网认证脚本
#update by kai.liang@i-soft.com.cn
###################

import urllib, urllib2, getpass

#name = raw_input('请输入用户名:')
name = '梁凯' # 在本行输入您的名字
url = 'http://172.16.1.3/webAuth/index.htm'

def auth():
	page = 0
	parameters = {'password':passwd,'pwd':passwd,'secret':'true','username':name} 
	#提交的数据参数
	data = urllib.urlencode(parameters)  #对参数进行编码
	req = urllib2.Request(url, data) #形成url请求
	try:
		response = urllib2.urlopen(req) #发送请求
		response = urllib2.urlopen(req) #发送请求
		page = response.read() #读取返回的页面
	except Exception, e:
		print '登录失败,请重新登录!' #修复HTTPError错误
	if page:
		if "认证成功" in page or "该IP已登录" in page:
			print '恭喜您,登录成功,您现在可以访问外网了!'
		else:
			print '账号或密码错误,请重新登录!'

if __name__ == '__main__':
	print "####################################"
	print "#公司访问外网认证脚本              #"
	print "#初次使用请将脚本12行替换为您的名字#"
	print "####################################"
	print '用户名:%s' %name
	passwd = getpass.getpass('请输入密码:')
	auth()

二、统计周报系统所有同事的最近一篇周报 本脚本可以把所有同事最近发布的一篇周报标题给抓取出来,这样可以知道哪些同事有没有更新周报了,嘿嘿。 这其实属于爬虫类型的脚本,使用urllib2模块抓取特定网页,然后使用re正则表达式模块进行过滤字符,把需要的信息给抓取出来。利用爬虫还可以批量下载图片。 上源码:

#!/usr/bin/python
#coding:utf-8

####################
#本文档爬取周报系统所有同事的最近一篇周报
#powered by: kai.liang@i-soft.com.cn
#date:20170224
#version:1.0
######################

import urllib2
import re                  #载入所需模块


class Bloglist():
    url='http://tfs.i-soft.com.cn/drupal/?q=blog/'  #周报系统日志网址的前缀

    def __init__(self, userid):
        self.url=Bloglist.url+str(userid)          #网址=网址前缀+用户id
    def getHtml(self):                             #获取网页内容
        try:
            html = urllib2.urlopen(self.url).read()
            return html
        except Exception, e:
            print 'url error!!'


    def getTitle(self):                          #应用正则表达式提取网页中的日志标题
	html=self.getHtml()
        reg = r'node/\d+">(.*\d{6}.*)'
        titlere = re.compile(reg)
        lines = html.split()
        m = re.search(titlere, html)
        titles = m.groups()
        title = ''.join(titles)
        return title
def main():
    """
    zhaopanpan:7
    lixiaoshuang:21
    huangjun:22
    wangjue:23
    liuke:24
    lipeng:28
    hanjingjing:30
    lixingfeng:41
    liuhui:42
    liangkai:43
    liulu:44
    zhaolili:45
    yaoxiangchuang:46
    liuchang:47
    liuchunyuan:48
    lufei:49
    liuyang:50
    chijianping:51
    
    """                  #每位用户的id
    users = [7,21,22,23,24,28,30,41,42,43,44,45,46,47,48,49,50,51]
    print '----------------------------'
    print '测试中心成员最近一篇周报'
    print '----------------------------'
    for i in users:
        userBlog = Bloglist(i)         #对象初始化
        title = userBlog.getTitle()    #使用对象方法
        print title  
    print '----------------------------'
  

if __name__== '__main__':
    main()

使用方法:./weekpaper-spider.py

[root@server49 pytest_20170309]# ./weekpaper-spider.py
----------------------------
测试中心成员最近一篇周报
----------------------------
测试个人周报20170331-赵盼盼
测试个人周报-20170331-李小双
测试个人周报-20170331-黄俊
测试个人周报-20170331-王珏
测试个人周报-20170331-刘柯
测试个人周报20170331-李鹏
测试个人周报20170331-韩晶晶
测试个人周报20170331-李兴峰
测试个人周报-20170331-刘辉
测试个人周报-20170331-梁凯
测试个人周报-20170331-刘璐
测试个人周报-20170331-赵丽丽
测试个人周报-20170331-姚翔川
测试个人周报-20170331-刘畅
测试个人周报-20170331-刘春媛
测试个人周报20170331-路斐
测试个人周报-20170407-刘杨
测试个人周报-20170331-迟健平
----------------------------

三、统计测试技术分享里指定一个月所有同事的文章数量 本脚本可以统计测试技术分享里指定一个月所有同事的文章数量,包括每位同事发布文章数量,转载和原创各自数量。还有总文章数量以及总转载和总原创数量。辨别是不是转载主要是看标题有没有“转载”或“转”的关键词,如果同事不写这个关键词的话只能认为是原创了。 最开始可以显示作者标题,看着乱我给去掉了。现在是直接屏幕输出,其实可以写入文本文件,或者制作成excel文件,当然得使用第三方模块才可以。 源码:

#!/usr/bin/python
#coding:utf-8

##################
#爬取测试技术分享里指定某一月所有同事的文章发布数量
#powered by: kai.liang@i-soft.com.cn
#date: 20170307
#version: 1.0
#################

import urllib2
import re
import sys    #载入网络、正则、系统的模块

try:
    month = sys.argv[1]      #运行脚本时传递的参数
except Exception as e:
    print '请输入参数,例如:'
    print '查询3月份的文章请输入:python blog-spider.py 03'
    exit() 
year = 2017                 #默认年份为2017,可以此处修改

class Bloglist():           #定义类,脚本的核心
    total_zhuan=0
    total_yuan=0
    total = 0
    urlHead = 'http://192.168.32.3/blog/?author=%s&&m=%s'
    def __init__(self, author, date='201703'):        #初始化参数
        self.url = self.urlHead %(author,date)
        self.zhuan = 0
        self.yuan = 0
    def getHtml(self):                             #获取网页文本
        html = urllib2.urlopen(self.url).read()
        return html
    def getTitle(self):                            #获取网页中某一作者的文章标题
        reg = r'"bookmark">(.*)'
        titlere = re.compile(reg)
        title = re.findall(titlere, self.getHtml())
        return title
    def count(self):                  #计算作者的文章数量,本打算输出文章标题
                                      #看着乱,就给注释掉了
	#print "文章标题:"
	#print "-----------------------------"
        for line in self.getTitle():
           # if '转载' or '(转)' in line:
            if '转载' in line or line[0:9]== '(转)':
                self.zhuan += 1
            else:
                self.yuan += 1
            #print line
	#print "-----------------------------"
	print "发布文章:" + str(self.zhuan+self.yuan) + "篇 ",
	print "转载:"+ str(self.zhuan) + "篇 " + "原创:" + str(self.yuan) + "篇"
	Bloglist.total_zhuan = Bloglist.total_zhuan + self.zhuan
	Bloglist.total_yuan = Bloglist.total_yuan + self.yuan
	Bloglist.total = Bloglist.total_zhuan + Bloglist.total_yuan
def author():
    date = str(year) + str(month)
    user = {2:'李  鹏', 3:'王  珏', 5:'黄  俊',6:'韩晶晶', 7:'李小双', 8:'赵盼盼', \
10:'刘  珂',11:'刘  辉', 12:'刘春媛', 13:'路  斐', 14:'梁  凯', 15:'李兴峰', 16:'刘  璐',\
 17:'姚翔川',18:'刘  畅', 19:'刘  杨', 20:'赵丽丽', 21:'迟建平'}
    #测试成员对应的id
    print "-------------------------------------------"
    print "2017年%s月份测试中心成员发布文章情况" %month
    print "-------------------------------------------"
    for i in user.keys():
        userPaper = Bloglist(i, date)     #成员对象的实例化
        print '%s' %user[i],
        userPaper.count()
    print "总计:%s篇,转载:%s篇,原创:%s篇" %(Bloglist.total, Bloglist.total_zhuan, Bloglist.total_yuan)
    print "-------------------------------------------"
    
if __name__ == '__main__':
    author()

使用方法:

./blog-spider.py 03 脚本后面加入月份,默认是年份是2017。
[root@server49 pytest_20170309]# ./blog-spider.py 03
-------------------------------------------
2017年03月份测试中心成员发布文章情况
-------------------------------------------
李  鹏 发布文章:3篇  转载:1篇 原创:2篇
王  珏 发布文章:2篇  转载:0篇 原创:2篇
黄  俊 发布文章:2篇  转载:1篇 原创:1篇
韩晶晶 发布文章:2篇  转载:1篇 原创:1篇
李小双 发布文章:1篇  转载:0篇 原创:1篇
赵盼盼 发布文章:3篇  转载:2篇 原创:1篇
刘  珂 发布文章:3篇  转载:0篇 原创:3篇
刘  辉 发布文章:3篇  转载:2篇 原创:1篇
刘春媛 发布文章:3篇  转载:2篇 原创:1篇
路  斐 发布文章:2篇  转载:1篇 原创:1篇
梁  凯 发布文章:3篇  转载:2篇 原创:1篇
李兴峰 发布文章:3篇  转载:1篇 原创:2篇
刘  璐 发布文章:3篇  转载:2篇 原创:1篇
姚翔川 发布文章:3篇  转载:2篇 原创:1篇
刘  畅 发布文章:3篇  转载:2篇 原创:1篇
刘  杨 发布文章:3篇  转载:2篇 原创:1篇
赵丽丽 发布文章:3篇  转载:1篇 原创:2篇
迟建平 发布文章:3篇  转载:2篇 原创:1篇
总计:48篇,转载:24篇,原创:24篇
-------------------------------------------

四、统计bugzilla系统里所有的quips 大家访问bugzilla时会看到很多好玩的句子,可是你有没有想过一共有多少个quips呢,如果是都抓取下来该如何去做呢?好,大家先不要参考下面的代码,自己去写写,然后跟我的对比一下,看看你到底比我强多少。

此处需等待10分钟……………………………………

好,相信大家都写完了。我们来分析一下,首先应该使用一个可以看到quips的地址,这个地址bug数量越少越好,减少载入时间呀。然后把所以网页内容抓取下来,分析quips的关键词,使用re模块的正则表达式过滤quips。因为每次显示的quips都是随机的,所以你得抓取足够多的次数才可以遍历整个quips的数据库,而且还会有重复,你得把重复的去掉。我选择获取100次quips,执行一遍可能不能遍历所有的数据,得运行几遍才可以。 我得到的结果是一共含有48个quips。 上源码:

#!/usr/bin/python
#coding:utf-8
import urllib2
import re
import os

#查看quips所使用的网址
url = "http://192.168.32.3/buglist.cgi?query_format=advanced&list_id=81057&short_desc=123&short_desc_type=allwordssubstr&product=smb_DEV"

def getquip():
	html = urllib2.urlopen(url).read()  #读取网页内容
	rules = r'"quips.cgi">(.*)'
	reg = re.compile(rules)
	quip = re.findall(reg,html)         #使用正则表达式提取quips字符
	quip = ''.join(quip) 
	#print quip
	q = open('quips.txt', 'r+')
	quips = q.read()
	q.close()                               #读取文件内容
	if quip not in quips:                   #如果获取的quip不在quips.txt文件里则写入文件
		f = open('quips.txt', 'a')
		f.write(quip)
		f.write('\n')
		f.close()
def isquips():
	if not os.path.isfile('quips.txt'):
		a = os.system('touch quips.txt')    #判断quips.txt是否存在,不存在就创建
if __name__ == "__main__":
	print "Getting quips, please waiting....."	
	isquips()
	for i in range(100):    #获取100个quips
		getquip()
	print "Getting quips completed, please look over the quips.txt."

使用方法:./bugQuips.py

[root@server49 pytest_20170309]# ./bugQuips.py
Getting quips, please waiting.....
Getting quips completed, please look over the quips.txt.
[root@server49 pytest]# cat quips.txt
水深火热~
骂程序员职业的人大都自己就是程序员。因为高水平的人不屑于骂,低水平的人不知道怎么骂
……于浩歌狂热之际中寒;于天上看见深渊。于一切眼中看见无所有;于无所希望中得救。……
质量即生命,责任重泰山
程序员都是好男人,因为他们一整天都在扪心自问:我到底错在哪了,让我知道,我一定改...
Fear can hold you prisoner. Hope can set you free.
再见,罗纳尔多!
过少的测试是一种不负责任,过多的测试是一种犯罪!
你是我们加班的罪魁祸首,坚决消灭你!!!!!!!!!!
很多程序员不知道格子衫有一个隐藏属性:穿上后遇到BUG的概率减少5%!
问君能有几多愁,恰似调完bug改需求!!!
平均每三个“屌丝”拥有一个女友(男友)
我们有理由相信计算机的世界没有诡异的事情,一定是自己犯了某个傻X的错误
"hello world" 就是罪魁祸首。不编程,何来bug!?!?
原谅我一生不羁放纵爱自由
若是黄艺博不娶林妙可,我就再也不相信爱情了……
一切罪恶BUG的根源都是“Hello,word!”
一切Bug都是纸老虎!你强他就弱!你弱他就强!在战略上藐视bug,在战术上重视bug!有木有?
北京人说,推开窗,咱就能闻到烟。上海人讲,这有啥,呵呵,打开自来水,咱就能喝到排骨汤。
所有的程序都有逻辑,所有的事物都有因果。
人生一梦,白云苍狗
the quieter you become,the more you are able to hear
爱他,就给他提bug;恨他,也给他提bug
神马bug,都是浮云
抗bug战争,漫长而艰难
谁也无法改变现状,唯有无数程序员血洒大地,才能使项目重建天日~
Jobs教主去了,改变世界的事就交给我们吧
^如今但愿关门睡,一任梅花任雪飞^
你若不离不弃,我必死无疑
人生三恨:一恨海棠无香,二恨鲥鱼多刺,三恨红楼梦未完
轻轻地我走了,正如我悄悄的来;我挥一挥衣袖,fix一片bug……
你若安好,便是晴天。
人生如梦亦如幻,朝如晨露暮如霞。
一个程序员看到bug后,如果第一反应是,这是硬件、库的问题,那么说看程序员入门
片云归洞非有意,我造Bug本无心
恨你在心口难开
满纸心酸泪。
不管你有多少经验,BUG一直跟着你
生命不息,测试不止
天下风云出我辈,一入江湖岁月催
成也bug,败也bug
皇图霸业谈笑中,不胜人生一场醉
不生不灭,不垢不净,不增不减
未来姗姗来迟,现在如箭飞逝
知识就是力量,一种让别人觉得自己很笨的力量。。。。
菩提本无树,明镜亦非台,本来无一物,何处惹尘埃。
道,生一一,生二二,生三三,生万物万物,附阴而抱阳,冲气以为和。

结语 直接复制网页的源码由于格式问题可能不能执行,建议wordpress上装个代码高亮显示的插件,那样查看代码就方便了。需要的童鞋去github上下载吧。 纸上得来终觉浅,觉知此事要躬行。看十行代码不如实实在在的敲一行代码。当你敲出来时才可以发现一些细节问题,才可以体会代码的精妙之处。很多同学都在学习编程,我认为还是应该多把书上的代码自己敲一遍,可能的话把学到的知识用于解决工作和生活中的问题。毕竟技术可以改变生活。学习——工作——再学习——再工作——能力提升。

“Life is short, you need python”