分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > 教程案例

asyncio + pycurl + BytesIO 异步批量调用url请求

发布时间:2023-09-06 02:36责任编辑:傅花花关键词:url
import asyncio
import pycurl
from io import BytesIO
import json

def fetch_api(url, method, header=None, data=None):
"""
url: 获取api的url
method: 请求方法
header: 请求头
data: 请求参数
"""

if method == "get": ???_Curl = pycurl.Curl() ???buf = BytesIO() ???_Curl.setopt(pycurl.WRITEFUNCTION,buf.write) ???_Curl.setopt(pycurl.URL, url) ???_Curl.setopt(pycurl.HTTPHEADER, header) ???_Curl.perform() ???result = buf.getvalue().decode("utf-8") ???http_code = _Curl.getinfo(_Curl.HTTP_CODE) ???dns_time = _Curl.getinfo(_Curl.NAMELOOKUP_TIME) * 1000 # DNS解析时间 ???connect_time = _Curl.getinfo(_Curl.CONNECT_TIME) * 1000 # 建连时间 ???pretransafe_time = _Curl.getinfo(_Curl.PRETRANSFER_TIME) * 1000 # 连接上后到开始传输时的时间 ???starttransafe_time =_Curl.getinfo(_Curl.STARTTRANSFER_TIME) * 1000 # 接收到第一个字节的时间 ???redirect_time = _Curl.getinfo(_Curl.REDIRECT_TIME) * 1000 # 重定向时间 ???total_time = _Curl.getinfo(_Curl.TOTAL_TIME) * 1000 # 请求总时间 ???download_size = _Curl.getinfo(_Curl.SIZE_DOWNLOAD) # 下载数据包大小 ???download_speed = _Curl.getinfo(_Curl.SPEED_DOWNLOAD) # 下载速度 ???buf.close() ???print(result) ???print(http_code,dns_time,connect_time,pretransafe_time,starttransafe_time,redirect_time,total_time,download_size,download_speed) ???_Curl.close()else: ???_Curl = pycurl.Curl() ???_Curl.setopt(pycurl.HTTPHEADER, header) ???buf = BytesIO() ???_Curl.setopt(pycurl.WRITEFUNCTION, buf.write) ???_Curl.setopt(pycurl.URL, url) ???_Curl.setopt(_Curl.POSTFIELDS, data) ???_Curl.perform() ???result = buf.getvalue().decode("utf-8") ???http_code = _Curl.getinfo(_Curl.HTTP_CODE) ???dns_time = _Curl.getinfo(_Curl.NAMELOOKUP_TIME) * 1000 ?# DNS解析时间 ???connect_time = _Curl.getinfo(_Curl.CONNECT_TIME) * 1000 ?# 建连时间 ???pretransafe_time = _Curl.getinfo(_Curl.PRETRANSFER_TIME) * 1000 ?# 连接上后到开始传输时的时间 ???starttransafe_time = _Curl.getinfo(_Curl.STARTTRANSFER_TIME) * 1000 ?# 接收到第一个字节的时间 ???redirect_time = _Curl.getinfo(_Curl.REDIRECT_TIME) * 1000 ?# 重定向时间 ???total_time = _Curl.getinfo(_Curl.TOTAL_TIME) * 1000 # 请求总时间 毫秒 ???download_size = _Curl.getinfo(_Curl.SIZE_DOWNLOAD) ?# 下载数据包大小 ???download_speed = _Curl.getinfo(_Curl.SPEED_DOWNLOAD) ?# 下载速度 ???buf.close() ???print(result) ???print(http_code, dns_time, connect_time, pretransafe_time, starttransafe_time, redirect_time, total_time, ?????????download_size, download_speed) ???_Curl.close()

"""
get请求测试
header = [
‘Content-Type:application/json; charset=utf-8‘
]

fetch_api(‘http://xxxx‘, ‘get‘, header)

post请求测试
header = [

‘Content-Type:application/json; charset=utf-8‘

]

data = {"userid":"%s","nickname":"zxpp","sex":"1","birthday":"2015-01-01"}
json_data = json.dumps(data)
fetch_api(‘http://xxxx‘, ‘post‘, header=header,data=json_data)

"""

@asyncio.coroutine
def fetch_async(func, url, method, header=None, data=None):
loop = asyncio.get_event_loop()
future = loop.run_in_executor(None, func, url, method,header,data)
#response = yield from future ?# 因为 func 函数未返回数据,所以可以不用返回值
yield from future

header = [

‘Content-Type:application/json; charset=utf-8‘

]

data = {"userid":"%s","nickname":"zxpp","sex":"1","birthday":"2015-01-01"}
json_data = json.dumps(data)

tasks = [
fetch_async(fetch_api, url=‘http://xxxx‘, method=‘get‘,header=header),
fetch_async(fetch_api, url=‘http://xxxx‘, method=‘post‘, header=header,data=json_data)
]

loop = asyncio.get_event_loop()
results = loop.run_until_complete(asyncio.gather(*tasks))
loop.close()

asyncio + pycurl + BytesIO 异步批量调用url请求

原文地址:https://blog.51cto.com/haoyonghui/2370145

知识推荐

我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved