python對於requests的封裝

2021-08-15 20:12:00 字數 3684 閱讀 1370

由於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...