本文主要記錄在自動化腳本調試過程中對於Python某些庫的或者用法進行學習記錄。
注:本次調試是基於Python 2.x,因此以下功能是基於2.x。
首先記錄的是re庫
re庫
關於re庫部分知識
import re
re.search(pattern, string, flags=0) ,掃描第二個參數字符串,匹配失敗返回none
re.match() 總是從字符串“開頭”去匹配,並返回匹配的字符串的match對象,匹配失敗返回none
返回的是對象,可以調用group方法來獲取字符串
re.findall(pattern, string, flags=0) 返回所有匹配的字符列表
正則表達式部分知識:
re.findall(r"ss",str,0) r標識後面是正則表達式
re.findall(r"^ss","ssddd",0) ^表示匹配以ss開頭的字符串,返回爲匹配的字符串
re.findall(r"html$","https://docs.python.org/3/whatsnew/3.6.html") $符號表示以html結尾的字符串返回
re.findall(r"[t,w]h","https://docs.python.org/3/whatsnew/3.6.html") [...]匹配括號中的其中一個字符
re.findall(r\d","https://docs.python.org/3/whatsnew/3.6.html") “d”是正則語法規則用來匹配0到9之間的數返回列表
re.findall(r"\w","https://docs.python.org/3/whatsnew/3.6.html") “w”在正則裏面代表匹配從小寫a到z,大寫A到Z,數字0到9
a = "123abc456"
print re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(0) #123abc456,返回整體
print re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(1) #123
print re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(2) #abc
print re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(3) #456
json
關於json庫
json.dumps()函數是將一個Python數據類型列表進行json格式的編碼(可以這麼理解,json.dumps()函數是將字典轉化爲字符串)
json.loads()函數是將json格式數據轉換爲字典
urllib2/urllib/cookielib
作用:
urllib2:主要是對於htpp/https請求,對於頭部進行修改。
urllib:主要是對於請求的數據進行轉換。
cookielib:配合urllib2進行使用,存儲會話cookie
關於摘要/基礎認證相關代碼
# -*- coding: utf-8 -*-
import httplib,urllib,urllib2
import base64
#定義url
url="http://ip:port/xx/xx/x/x"
#實例化摘要認證
auth=urllib2.HTTPDigestAuthHandler()
#若需要基礎認證則 改爲auth=urllib2.HTTPBasicAuthHandler()
##添加用戶名和密碼 第一個參數請求的域名,請求URL,用戶名,密碼
auth.add_password("請求的域名", url, "用戶名", "密碼")
opener = urllib2.build_opener(auth)
urllib2.install_opener(opener)
res_data = opener.open(url) # 此方法也可以用 urllib2.urlopen(url) 代替 ,
'''
# res_data = urllib2.Request(url)
# rsp=urllib2.urlopen(res_data)
代替 res_data = opener.open(url)也可以
'''
# res_data = urllib2.Request(url)
# rsp=urllib2.urlopen(res_data)
#返回值.read() 將實例對象轉換爲字符串
res = res_data.read()
print res
#關於摘要認證中的域名如何獲取?
#使用httplib庫,代碼如下
# -*- coding: utf-8 -*-
import httplib,urllib,urllib2
import base64
def http_get_digest_realm(url="",hostname="",port=""):
iHttpPort = int(port)
#創建一個HTTP類型請求連接,返回一個HTTPConnect對象 hostname參數不需要帶http,
httpClient = httplib.HTTPConnection(hostname, iHttpPort)
#第一個參數請求方法 URL 第二個 請求網頁路徑 第三個body請求體 第四個 請求頭部,無返回值相當於向服務器發送數據
httpClient.request('GET', url, '', {})
#後去請求的值
response = httpClient.getresponse()
#返回值轉換爲字符串
msg = str(response.msg)
print msg
#獲取realm值
realm = msg.split('realm="')[1].split('"')[0]
httpClient.close()
return realm
print http_get_digest_realm("http://xx/xx/x/,"IP","80")
urlopeny原型,可以看出來可以傳輸data
用於打開一個URL,URL可以是一個字符串也可以是一個請求對象,data 用於指定要發送到服務器的額外數據的字符串,timeout 用於設置打開URL的超時時間 ,此方法不支持cookie
def urlopen(url, data=None, timeout=socket._GLOBAL_DEFAULT_TIMEOUT,
cafile=None, capath=None, cadefault=False, context=None):
global _opener
if cafile or capath or cadefault:
if context is not None:
raise ValueError(
"You can't pass both context and any of cafile, capath, and "
"cadefault"
)
if not _have_ssl:
raise ValueError('SSL support not available')
context = ssl.create_default_context(purpose=ssl.Purpose.SERVER_AUTH,
cafile=cafile,
capath=capath)
https_handler = HTTPSHandler(context=context)
opener = build_opener(https_handler)
elif context:
https_handler = HTTPSHandler(context=context)
opener = build_opener(https_handler)
elif _opener is None:
_opener = opener = build_opener()
else:
opener = _opener
return opener.open(url, data, timeout)
使用cookie訪問示例步驟如下:
import httplib,urllib,urllib2
import cookielib
cookie= cookielib.LWPCookieJar()#創建cookie存儲對象 Python2.x 使用的方法
handler=urllib2.HTTPCookieProcessor(cookie)#將cookie傳入至 HTTPcookie處理器對象中,該方法返回cookie頭部 cookie=cookielib.CookieJar()#創建cookie存儲對象 Python3 使用的方法
opener=urllib2.build_opener(handler)#將cookie設置加入HTTP構造器 返回對象值
#opener.open()和urllibe.urlopen()用法一致,都是可以打開對象或者URL
#返回的對象可以增加頭部
opener.addheaders = [('User-agent', 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)')]
opener.addheaders = [('Accept', 'application/json, text/plain, */*')]
opener.addheaders = [('Content-Type', 'application/json;charset=UTF-8')]
urllib2.install_opener(opener)#將頭部設置或者安裝到調用urllib2的py文件中,若只寫請求則可以在初始化方法中寫 (啓動構造器)
#然後可以用三種編寫方式
#1.
# res_data = urllib2.Request(url)
# rsp=urllib2.urlopen(res_data)
#res = rsp.read()
#2.
# res_data = urllib2.Request(url)
#還可以進行修改頭部 res_data.add_header("connection":"keep-live")
# rsp=urllib2.urlopen(res_data)
#res = rsp.read()
#3.
#rsp=urllib2.urlopen(url)
#res = rsp.read()
#說明
# urllib2.urlopen(url, data=None, timeout=<object object>) :用於打開一個URL,URL可以是一個字符串也可以是一個請求對象,data 用於指定要發送到服務器的額外數據的字符串,timeout 用於設置打開URL的超時時間 ,此方法不支持cookie
#urllib2.Request(url, data, headers) :用於構造一個請求對象,然後用 urllib2.urlopen() 來打開這個請求對象,data 用於指定要發送到服務器的額外數據的字符串
#build_opener ()返回的對象具有open()方法,與urlopen()函數的功能相同
**關於Requset部分原函數**
可以看出來此函數支持POST、PUT、GET三種方法
class Request(url_request.Request):
"""
Extends the url_request.Request to support all HTTP request types.
"""
def __init__(self, url, data=None, method=None):
"""
Initialise a new HTTP request.
:Args:
- url - String for the URL to send the request to.
- data - Data to send with the request.
"""
if method is None:
method = data is not None and 'POST' or 'GET'
elif method != 'POST' and method != 'PUT':
data = None
self._method = method
url_request.Request.__init__(self, url, data=data)
def get_method(self):
"""
Returns the HTTP method used by this request.
"""
return self._method
Request庫
request庫認證如下:
# -*- coding: utf-8 -*-
基礎認證
import requests
from requests.auth import HTTPDigestAuth
respones = requests.get(url, headers=header, auth=(username, password))
摘要認證
respones = requests.get(url, headers=header, HTTPDigestAuth=(username, password))
傳遞參數:
respones = requests.post(self.url, data=data,headers=self.header, auth=HTTPDigestAuth(username, password))
session使用:
在進行接口測試的時候,我們會調用多個接口發出多個請求,在這些請求中有時候需要保持一些共用的數據,例如cookies信息。
1、requests庫的session對象能夠幫我們跨請求保持某些參數,也會在同一個session實例發出的所有請求之間保持cookies。
s = requests.session()
# req_param = '{"belongId": "300001312","userName": "alitestss003","password":"pxkj88","captcha":"pxpx","captchaKey":"59675w1v8kdbpxv"}'
# res = s.post('http://test.e.fanxiaojian.cn/metis-in-web/auth/login', json=json.loads(req_param))
# # res1 = s.get("http://test.e.fanxiaojian.cn/eos--web/analysis/briefing")
# print(res.cookies.values()) 獲取登陸的所有session
2、requests庫的session對象還能爲我們提供請求方法的缺省數據,通過設置session對象的屬性來實現
eg:
# 創建一個session對象
s = requests.Session()
# 設置session對象的auth屬性,用來作爲請求的默認參數
s.auth = ('user', 'pass')
# 設置session的headers屬性,通過update方法,將其餘請求方法中的headers屬性合併起來作爲最終的請求方法的headers
s.headers.update({'x-test': 'true'})
# 發送請求,這裏沒有設置auth會默認使用session對象的auth屬性,這裏的headers屬性會與session對象的headers屬性合併
r = s.get('http://httpbin.org/headers', headers={'x-test2': 'true'})
#s.cookie=cookie 可以進行設置
上面的請求數據等於:{'Authorization': 'Basic dXNlcjpwYXNz', 'x-test': 'false'}
# 查看發送請求的請求頭
r.request.headers #打印響應中請求的所有header數據
res3 = s.get("http://pre.n.cn/irs-web/sso/login",cookies = cookie)
print(res3.request.headers.get("Cookie").split("IRSSID=")[-1])
print(type(res3.request.headers.get("Cookie").split("IRSSID=")[-1]))
print(res3.request._cookies)
cookie和session簡單介紹:
(1)cookie是由服務端生成,存儲在響應頭中,返回給客戶端,客戶端會將cookie存儲下來。接着客戶端在發送請求時,user-agent會自動獲取本地存儲的cookie,將cookie信息存儲在請求頭中,發送給服務端。cookie的過期時間可以任意設置,如果不主動清除,在很長一段時間裏都可以保留,即使電腦關機。
(2)session是由服務端生成,存儲在服務器端的內存、緩存、數據庫等地方。客戶端給服務端發送請求後,服務端會根據請求信息生成session,同時生成一個session_id,通過cookie返回給客戶端,以便今後每次請求時都可以分辨你是誰;客戶端再次向服務端發送請求時,會通過cookie將這個session_id發送給服務端
由於Seesion使用不多:此博主提供了思路https://blog.csdn.net/hpulfc/article/details/80084398