2017.07.20 Python网络爬虫之Python函数和类
1.所有的程序都是由函数和类组成的,可以说任何程序里面包含的不是函数就是类
2.函数:In Python Everything is A Function,在Python中,所有的一切都是函数,典型的C语言写法,把所需的功能呢都写成一个一个函数,然后由函数调用函数
3.现在编写一个简单的程序makePasswordFileFunction.py,创建一个有针对性的专用密码字典:
# !usr/bin/env python
# -*- coding:utf-8 -*-
import os
import platform
import itertools
import time
def main():
"""主程序"""
global rawList #原始数据列表
rawList=[]
global denyList #非法单词列表
denyList=[' ','','@']
global pwList #最终的密码列表
pwList=[]
global minLen #密码的最小长度
minLen=6
global maxLen #密码的最大长度
maxLen=16
global timeout
timeout=3
global flag
flag=0
run={
'0':exit, #退出程序
'1':getRawList, #创建原始列表
'2':addDenyList, #添加不可能出现的元素
'3':clearRawList, #清空列表
'4':setRawList, #原始列表排序
'5':modifyPasswordLen, #修改最终的密码长度
'6':createPasswordList, #创建最终的字典列表
'7':showPassword, #显示密码
'8':createPasswordFile, #创建密码文件
}
while True:
mainMenu()
op=raw_input('输入选项:')
if op in map(str,range(len(run))):
run.get(op)()
else:
tipMainMenuInputError()
continue
def mainMenu():
"""主菜单"""
global denyList
global rawList
global pwList
global flag
clear()
print(u'| |')
print(u'='*40)
print(u"| |")
print(u"|| 0:退出程序")
print(u"|| 1:输入密码原始字符串")
print(u"|| 2:添加非法字符到列表")
print(u"|| 3:清空原始密码列表")
print(u"|| 4:整理原始密码列表")
print(u"|| 5:改变默认密码长度(%d-%d)" %(minLen,maxLen))
print(u"|| 6:创建密码列表")
print(u"|| 7:显示所有密码")
print(u"|| 8:创建密码文件")
print(u"||")
print(u'='*40)
print(u"||")
print(u"当前非法字符为:%s" %denyList)
print(u"当前原始密码元素为:%s" %rawList)
print(u"共有密码%d个" %len(pwList))
if flag:
print(u"已在当前目录创建密码文件dic.txt")
else:
print(u"尚未创建密码文件")
def clear():
"""清屏函数"""
OS=platform.system()
if (OS==u"Windows"):
os.system('cls')
else:
os.system('clear')
def tipMainMenuInputError():
"""错误提示"""
clear()
print(u"只能输入0-7的整数,等待%d秒后重新输入" %timeout)
time.sleep(timeout)
def getRawList():
"""获取原始数据列表"""
clear()
global denyList
global rawList
print(u"输入回车后直接退出")
print(u"当前原始密码列表为:%s" %rawList)
st=None
while not st== '':
st=raw_input("请输入密码元素字符串")
if st in denyList:
print(u"这个字符串是预先设定的非法字符串")
continue
else:
rawList.append(st)
clear()
print(u"输入回车后直接退出")
print(u"当前原始密码列表为:%s" %rawList)
def addDenyList():
"""添加非法词"""
clear()
global denyList
print(u"输入回车后直接退出")
print(u"当前非法字符为:%s" %denyList)
st=None
while not st=='':
st=raw_input("请输入需要添加的非法字符串:")
denyList.append(st)
clear()
print(u"输入回车后直接退出")
print(u"当前非法字符串列表为:%s" %denyList)
def clearRawList():
"""清空原始数据列表"""
global rawList
rawList=[]
def setRawList():
"""整理原始数据列表"""
global rawList
global denyList
a=set(rawList)
b=set(denyList)
rawList=[]
for str in set(a-b):
rawList.append(str)
def modifyPasswordLen():
"""修改默认密码的长度"""
clear()
global maxLen
global minLen
while True:
print(u"当前密码长度为%d-%d" %(minLen,maxLen))
min=raw_input("请输入密码最小长度:")
max=raw_input("请输入密码最大长度:")
try:
minLen=int(min)
maxLen=int(max)
except ValueError:
print(u"密码长度只能输入数字[6-18]")
break
if minLen not in xrange(6,19) or maxLen not in xrange(6,19):
print(u"密码长度只能输入数字[6-18]")
minLen=6
maxLen=16
continue
if minLen==maxLen:
res=raw_input("确定将密码长度设定为%d吗?(Yy/Nn)" %minLen)
if res not in list('yYnN'):
print(u"输入错误,请重新输入")
continue
elif res in list('Yy'):
print(u"好吧,你确定就好")
break
else:
print(u"给个机会,改一下把")
continue
elif minLen>maxLen:
print(u"最小长度比最大长度还大,可能吗?请重新输入")
minLen=6
maxLen=16
continue
else:
print(u"设置完毕,等待%d秒后返回主菜单" %timeout)
time.sleep(timeout)
break
def createPasswordList():
"""创建密码列表"""
global rawList
global pwList
global maxLen
global minLen
titleList=[]
swapcaseList=[]
for st in rawList:
swapcaseList.append(st.swapcase())
titleList.append(st.title())
sub1=[]
sub2=[]
for st in set(rawList+titleList+swapcaseList):
sub1.append(st)
for i in xrange(2,len(sub1)+1):
sub2+=list(itertools.permutations(sub1,i))
for tup in sub2:
PW=''
for subPW in tup:
PW+=subPW
if len(PW) in xrange(minLen,maxLen+1):
pwList.append(PW)
else:
pass
def showPassword():
"""显示创建的密码"""
global pwList
global timeout
for i in xrange(len(pwList)):
if i%4 ==0:
print("%s\n" %pwList[i])
else:
print("%s\t" %pwList[i])
print('\n')
print(u"显示%d秒,回到主菜单" %timeout)
time.sleep(timeout)
def createPasswordFile():
"""创建密码字典文件"""
global flag
global pwList
print(u"当前目录下创建字典文件:dic.txt")
time.sleep(timeout)
with open('./dic.txt','w+') as fp:
for PW in pwList:
fp.write(PW)
fp.write('\n')
flag=1
if __name__ == '__main__':
main()
重点讲解几个用到的函数:
1.map()函数:
map()是 Python 内置的高阶函数,它接收一个函数 f 和一个 list,并通过把函数 f 依次作用在 list 的每个元素上,得到一个新的 list 并返回。 例如,对于list [1, 2, 3, 4, 5, 6, 7, 8, 9] 如果希望把list的每个元素都作平方,就可以用map()函数: 因此,我们只需要传入函数f(x)=x*x,就可以利用map()函数完成这个计算: def f(x): return x*x print map(f, [1, 2, 3, 4, 5, 6, 7, 8, 9]) 输出结果: [1, 4, 9, 10, 25, 36, 49, 64, 81] 注意:map()函数不改变原有的 list,而是返回一个新的 list。 利用map()函数,可以把一个 list 转换为另一个 list,只需要传入转换函数。 由于list包含的元素可以是任何类型,因此,map() 不仅仅可以处理只包含数值的 list,事实上它可以处理包含任意类型的 list,只要传入的函数f可以处理这种数据类型。
2.platform.system()函数:
- platform.system() 获取操作系统类型,windows、linux等
- platform.platform() 获取操作系统,Darwin-9.8.0-i386-32bit
- platform.version() 获取系统版本信息 6.2.0
- platform.mac_ver()
- platform.win32_ver() ('post2008Server', '6.2.9200', '', u'Multiprocessor Free')
3.os.system('cls')函数: 在 python命令行中使用下面命令,可以清除命令行。
4.itertools.permutations()函数:itertools模块,使得排列组合的实现非常简单
有序排列:e.g., 4个数内选2个排列:
>>> print list(itertools.permutations([1,2,3,4],2))
[(1, 2), (1, 3), (1, 4), (2, 1), (2, 3), (2, 4), (3, 1), (3, 2), (3, 4), (4, 1), (4, 2), (4, 3)]
程序执行结果为:
5.类:In python Everything is A Class,这种C++的写法就是把所有相似的功能都封装到一个类中,最理想的情况是一个程序只有一个主程序,然后在主程序里实例化类
编写一个密码字典,makePasswordFileClass.py:
# !usr/bin/env python
# -*- coding:utf-8 -*-
import os
import platform
import time
import itertools
class MakePassword(object):
def __init__(self):
self.rawList=[]
self.denyList=[' ','','@']
self.pwList=[]
self.minLen=6
self.maxLen=16
self.timeout=3
self.flag=0
self.run={
'0':exit,
'1':self.getRawList,
'2':self.addDenyList,
'3':self.clearRawList,
'4':self.setRawList,
'5':self.modifyPasswordLen,
'6':self.createPasswordList,
'7':self.showPassword,
'8':self.createPasswordFile
}
self.main()
def main(self):
while True:
self.mainMenu()
op=raw_input('输入选项:')
if op in map(str,range(len(self.run))):
self.run.get(op)()
else:
self.tipMainMenuInputError()
continue
def mainMenu(self):
self.clear()
print(u'| |')
print(u'='*40)
print(u"| |")
print(u"|| 0:退出程序")
print(u"|| 1:输入密码原始字符串")
print(u"|| 2:添加非法字符到列表")
print(u"|| 3:清空原始密码列表")
print(u"|| 4:整理原始密码列表")
print(u"|| 5:改变默认密码长度(%d-%d)" %(self.minLen,self.maxLen))
print(u"|| 6:创建密码列表")
print(u"|| 7:显示所有密码")
print(u"|| 8:创建密码文件")
print(u"||")
print(u'='*40)
print(u"||")
print(u"当前非法字符为:%s" %self.denyList)
print(u"当前原始密码元素为:%s" %self.rawList)
print(u"共有密码%d个" %len(self.pwList))
if self.flag:
print(u"已在当前目录创建密码文件dic.txt")
else:
print(u"尚未创建密码文件")
def clear(self):
OS=platform.system()
if (OS ==u'Windows'):
os.system('cls')
else:
os.system('clear')
def tipMainMenuInputError(self):
self.clear()
print(u"只能输入0-7的整数,等待%d秒后重新输入" %self.timeout)
time.sleep(self.timeout)
def getRawList(self):
self.clear()
print(u"输入回车后直接退出")
print(u"当前原始密码列表为:%s" %(self.rawList))
st=None
while not st=='':
st=raw_input("请输入密码元素字符串:")
if st in self.denyList:
print(u"这个字符串是预先设定的非法字符串")
continue
else:
self.rawList.append(st)
self.clear()
print(u"输入回车后直接退出")
print(u"当前原始密码列表为:%s" %self.rawList)
def addDenyList(self):
self.clear()
print(u"输入回车后直接退出")
print(u"当前非法字符为:%s" %self.denyList)
st=None
while not st=='':
st=raw_input("请输入需要添加的非法字符串:")
self.denyList.append(st)
self.clear()
print(u"输入回车直接退出")
print(u"当前非法字符串列表是:%s" %self.denyList)
def clearRawList(self):
self.rawList=[]
def setRawList(self):
a=set(self.rawList)
b=set(self.denyList)
self.rawList=[]
for str in set(a-b):
self.rawList.append(str)
def modifyPasswordLen(self):
self.clear()
while True:
print(u"当前密码长度为%d-%d" %(self.minLen,self.maxLen))
min=raw_input("请输入密码最小长度:")
max=raw_input("请输入密码最大长度:")
try:
self.minLen=int(min)
self.maxLen=int(max)
except ValueError:
print(u"密码长度只能输入数字[6-18]")
break
if self.minLen not in xrange(6,19) or self.maxLen not in xrange(6,19):
print(u"密码长度只能输入数字[6-18]")
self.minLen=6
self.maxLen=16
continue
if self.minLen==self.maxLen:
res=raw_input("确定将密码长度设定为%d吗?(Yy/Nn)" %self.minLen)
if res not in list('yYNn'):
print(u"输入错误,请重新输入")
continue
elif res in list('Yy'):
print(u"好吧,你确定就好")
break
else:
print(u"给个机会,改一下吧")
continue
elif self.minLen>self.maxLen:
print(u"最小长度大于最大长度,可能吗?请重新输入")
self.minLen=6
self.maxLen=16
continue
else:
print(u"设置完毕,等待%d 秒后返回主菜单" %self.timeout)
time.sleep(self.timeout)
break
def createPasswordList(self):
titleList=[]
swapcaseList=[]
for st in self.rawList:
swapcaseList.append(st.swapcase())
titleList.append(st.title())
sub1=[]
sub2=[]
for st in set(self.rawList+titleList+swapcaseList):
sub1.append(st)
for i in xrange(2,len(sub1)+1):
sub2+=list(itertools.permutations(sub1,i))
for tup in sub2:
PW=''
for subPW in tup:
PW+=subPW
if len(PW) in xrange(self.minLen,self.maxLen+1):
self.pwList.append(PW)
else:
pass
def showPassword(self):
for i in xrange(len(self.pwList)):
if i%4==0:
print(u"%s\n" %self.pwList[i])
else:
print(u"%s\t" %self.pwList[i])
print('\n')
print(u"显示%d秒,回到主菜单" %self.timeout)
time.sleep(self.timeout)
def createPasswordFile(self):
print(u"当前目录下创建字典文件:dic.txt")
time.sleep(self.timeout)
with open('./dic.txt','w+') as fp:
for PW in self.pwList:
fp.write(PW)
fp.write('\n')
self.flag=1
if __name__ == '__main__':
mp=MakePassword()
、
执行结果完全一样
有些人之所以不断成长,就绝对是有一种坚持下去的力量。好读书,肯下功夫,不仅读,还做笔记。人要成长,必有原因,背后的努力与积累一定数倍于普通人。所以,关键还在于自己。