简介
python实现http get post download
使用requests, 加上重试机制,超时机制.
GET 请求
- 定义和用途:
GET 请求用于从指定的资源获取数据。它是最常见的 HTTP 请求方法之一,通常用于获取网页内容、查询数据库、获取 API 数据等。
例如,当你在浏览器中输入一个网址时,浏览器会发送一个 GET 请求到服务器,以获取该网页的内容。 - 特点:
GET 请求是安全的,即它不会对服务器上的资源进行修改。它也是幂等的,意味着多次发送相同的 GET 请求应该产生相同的结果。
GET 请求的参数通常附加在 URL 的末尾,以 “?” 分隔,多个参数之间用 “&” 连接。例如:https://www.example.com/api?param1=value1¶m2=value2。
POST 请求
- 定义和用途:
POST 请求用于向指定的资源提交数据,通常用于创建新的资源、提交表单数据、上传文件等。
例如,当你在网站上注册用户时,你的浏览器会发送一个 POST 请求到服务器,包含你的注册信息。 - 特点:
POST 请求不是安全的,也不是幂等的,因为它可能会对服务器上的资源进行修改。
POST 请求的参数通常包含在请求体中,可以是表单数据、JSON 数据等。
文件下载
- 定义和用途:
文件下载是从服务器获取文件并保存到本地设备的过程。可以通过 HTTP GET 请求来实现文件下载,通常用于下载软件安装包、文档、图片、视频等。
实现方法介绍
- http get
使用requests.request('get’方法向指定的 URL 发送了一个 GET 请求,并获取了响应。可以通过response.status_code检查请求是否成功,通过response.text获取响应的文本内容。 - http post
使用requests.post方法发送了一个 POST 请求 - http download
首先发送一个 GET 请求并下载文件内容。
使用requests库可以方便地进行 HTTP 请求和文件下载操作,但在实际应用中可能需要处理各种异常情况、设置请求头、进行身份验证等,
具体实现代码
#!/usr/bin/python3
# -*- coding: UTF-8 -*-
import requests
import sys
import json
import os
import logging
import time
def httpGet(urlStr, headers = None, params = None, data = None, isRaiseNone200=False):
print('url:' + urlStr)
print('params:', params)
MAX_RETRY_COUT = 5
# 加个重试次数,可根据需要定制哪些情况下进行重试,如果不重试就把raise的注释去掉
for retTryPos in range(MAX_RETRY_COUT):
try:
# 这里timeout要加,设置连接与访问超时时间,否则可能遇到http卡死挂住的情况
res = requests.request('get', urlStr, params=params, headers=headers, data=data, timeout=(15, 20))
content = res.text
print(content)
if res.status_code != 200:
if isRaiseNone200:
raise ValueError('http不是200')
else:
print('重试')
time.sleep(5)
continue
else:
return content
except requests.exceptions.ConnectionError as e:
logging.error('网络连接异常: ', e)
print('重试')
time.sleep(5)
#raise
except requests.exceptions.Timeout as e:
logging.error('连接超时: ', e)
print('重试')
time.sleep(5)
#raise
except requests.exceptions.RequestException as e:
logging.error('请求异常: ', e)
time.sleep(5)
#raise
except requests.exceptions.HTTPError as e:
logging.error(f'HTTP错误, 状态码: {e.response.status_code}, {e}')
time.sleep(5)
#raise
except ValueError as e:
logging.error('响应解析异常: ', e)
print('重试')
time.sleep(5)
#raise
raise ValueError('超出重试次数')
def httpDownload(urlStr, saveFile):
print('download url:' + urlStr)
savePath = os.path.dirname(saveFile)
if not os.path.exists(savePath):
print('mkdir:', savePath)
os.makedirs(str(savePath))
r = requests.get(urlStr, timeout=(15, 30))
if r.status_code != 200:
print('http返回:', r.content)
print('http code:', r.status_code)
raise ValueError('code不是200')
tmpFile = saveFile + '.tmp'
with open(tmpFile, 'wb') as f:
f.write(r.content)
f.close()
os.rename(tmpFile, saveFile)
def httpPost(urlStr, headers, postData):
print('url:' + urlStr)
try:
token = getToken()
datas = json.dumps(postData)
rc = requests.post(url=urlStr, data=datas, headers=headers, timeout=(8, 20))
print('post:' + str(datas))
content = (rc.text)
print(content)
if rc.status_code != 200:
raise ValueError('code不是200')
return content
except requests.exceptions.ConnectionError as e:
logging.error('网络连接异常: ', e)
time.sleep(5)
#raise
except requests.exceptions.Timeout as e:
logging.error('连接超时: ', e)
time.sleep(5)
#raise
except requests.exceptions.RequestException as e:
logging.error('请求异常: ', e)
time.sleep(5)
#raise
except requests.exceptions.HTTPError as e:
logging.error(f'HTTP错误, 状态码: {e.response.status_code}, {e}')
time.sleep(5)
#raise
except ValueError as e:
logging.error('响应解析异常: ', e)
time.sleep(5)
#raise
raise ValueError('超出重试次数')
if __name__ == '__main__':
httpGet('http://www.baidu.com')
作者:帅得不敢出门 csdn原创谢绝转载收录