由於requests是http類介面的核心,因此封裝前考慮問題比較多:
1.對多種介面型別的支援;
2.連線異常時能夠重連;
3.併發處理的選擇;
4.使用方便,容易維護;
當前並未全部實現,後期會不斷完善。重點提一下併發處理的選擇:python的併發處理機制由於存在gil的原因,實現起來並不是很理想,綜合考慮多程序、多執行緒、協程,在不考慮大併發效能測試的前提下使用了多執行緒-執行緒池的形式實現。使用的是
concurrent.futures模組。當前僅方便支援webservice介面。
# -*- coding:utf-8 -*-
import requests
from concurrent.futures import threadpoolexecutor
from tools.config import config # 配置檔案讀取
from tools.log import log # 日誌管理
from tools.tools import decolog # 日誌裝飾
''' 功能: requests類
使用方法:
更新內容:
'''class requests(object):
def __init__(self):
self.session = requests.session()
self.header = {}
# url預設**於配置檔案,方便不同測試環境的切換,也可以動態設定
self.url = config().geturl()
# 預設60s,可以動態設定
self.timeout = 60
#http連線異常的場合,重新連線的次數,預設為3,可以動態設定
self.iretrynum = 3
self.errormsg = ""
# 內容 =
self.responses = {}
# 內容 =
self.reserr={}
# 原始post使用保留
# bodydata: request's data
@decolog
def post(self, bodydata):
response = none
self.errormsg = ""
try:
response = self.session.post(self.url, data=bodydata.encode('utf-8'), headers=self.header, timeout=self.timeout)
response.raise_for_status()
except exception as e:
self.errormsg = str(e)
log().logger.error("http請求異常,異常資訊:%s" % self.errormsg)
return response
# 複數請求併發處理,採用執行緒池的形式,用例數》執行緒池的容量:執行緒池的容量為併發數,否則,用例數為併發數
# dicdatas:
@decolog
def req_all(self, dicdatas, ithreadnum=5):
if len(dict(dicdatas)) < 1:
log().logger.error("沒有測試物件,請確認後再嘗試。。。")
return self.responses.clear()
# 請求用例集合轉換(用例編號,用例資料)
seed = [i for i in dicdatas.items()]
self.responses.clear()
# 執行緒池併發執行,ithreadnum為併發數
with threadpoolexecutor(ithreadnum) as executor:
executor.map(self.req_single,seed)
# 返回所有請求的響應資訊(),http連線異常:對應none
return self.responses
# 用於單用例提交,http連線失敗可以重新連線,最大重新連線數可以動態設定
def req_single(self, listdata, reqtype="post", iloop=1):
response = none
# 如果達到最大重連次數,連線後提交結束
if iloop == self.iretrynum:
if reqtype == "post":
try:
response = requests.post(self.url, data=listdata[1].encode('utf-8'), headers=self.header,
timeout=self.timeout)
response.raise_for_status()
except exception as e:
# 異常資訊儲存只在最大連線次數時進行,未達到最大連線次數,異常資訊為空
self.reserr[listdata[0]] = str(e)
log().logger.error("http請求異常,異常資訊:%s【%d】" % (str(e), iloop))
self.responses[listdata[0]] = response
else:
# for future: other request method expand
pass
# 未達到最大連線數,如果出現異常,則重新連線嘗試
else:
if reqtype == "post":
try:
response = requests.post(self.url, data=listdata[1].encode('utf-8'), headers=self.header,
timeout=self.timeout)
response.raise_for_status()
except exception as e:
log().logger.error("http請求異常,異常資訊:%s【%d】" % (str(e), iloop))
# 重連次數遞增
iloop += 1
# 進行重新連線
self.req_single(listdata, reqtype, iloop)
# 當前連線終止
return none
self.responses[listdata[0]] = response
else:
# for future: other request method expand
pass
# 設定soapaction, 快捷完成webservice介面header設定
def setsoapaction(self, soapaction):
self.header["soapaction"] = soapaction
self.header["content-type"] = "text/xml;charset=utf-8"
self.header["connection"] = "keep-alive"
self.header["user-agent"] = "inte***ceautotest-run"
Python爬蟲 Request模組
文章說明了request模組的意義,且強調了request模組使用更加方便。接下來介紹幾種常用的request操作,並且會在後續補充說明一些特定用法。匯入檔案 import requests一 請求 右邊為請求語句,返回值為response回應 r requests.get r requests.p...
python爬蟲利器 request庫
request庫比urllib2庫更為高階,因為其功能更強大,更易於使用。使用該庫可以十分方便我們的抓取。基本請求 r requests.get r requests.post r requests.put r requests.delete r requests.head r requests.o...
Python 使用request傳送http請求
requests.get headers response requests.post login headers headers,data data response requests.post login allow redirects false 注 若不禁止重定向,則當響應是302時,req...