一、什么是requests
requests包是一个使用Python编写的HTTP请求库,使得发送HTTP请求和处理HTTP响应变得更加简单。以下是对requests包的详细介绍:
-
用途:
- requests包主要用于与HTTP交互,能够发送HTTP请求和处理HTTP响应。它支持处理HTTP响应的内容,如JSON和XML数据。
-
主要特点和功能:
- 简单易用:requests包提供了简洁的API,使得发送HTTP请求变得直观且容易上手。
- 丰富的请求方法:支持GET、POST、PUT、DELETE等多种HTTP请求方法,可以满足不同的网络交互需求。
- 自动处理Cookies和会话:requests包可以自动处理Cookies,并且支持会话保持,便于进行需要登录或身份验证的网络操作。
- 定制性强:提供了丰富的选项和参数,可以定制请求头、请求体、超时时间等,以满足特定的网络请求需求。
- 支持多种协议:除了HTTP,还支持HTTPS、FTP等多种协议,方便访问不同类型的网络资源。
-
高级功能:
- SSL证书验证:在进行HTTPS请求时,requests包可以处理SSL证书验证,确保通信的安全性。如果遇到SSL证书验证失败的情况,可以选择关闭验证。
- 代理设置:支持通过proxies参数轻松设置代理,以便在需要时隐藏真实IP地址或绕过网络限制。
- 流式传输:支持流式传输,允许在处理大文件下载或上传时节省内存。
- 会话对象:通过Session对象可以跨多个请求保持某些参数,如Cookies,使得多个相关请求之间可以共享状态。
-
性能优化:
- 当向同一个主机发送多个请求时,requests包会重用底层的TCP连接,这可以显著提高性能,尤其是在进行大量网络请求时。
-
错误处理和日志记录:
- requests包提供了强大的错误处理机制,可以方便地捕获和处理网络请求过程中可能出现的异常。
- 同时,它还支持详细的日志记录功能,有助于调试和跟踪网络请求的过程。
总的来说,requests包是一个功能强大、易用性高的Python HTTP请求库,适用于各种网络编程场景,无论是简单的数据抓取还是复杂的网络交互任务都能轻松应对。
二、使用方法
以下是一个使用requests
库发送HTTP请求的详细例子,包括GET请求、POST请求、设置请求头、处理Cookies和异常处理等:
import requests# 发送GET请求
def get_request_example(url):try:response = requests.get(url)response.raise_for_status() # 检查请求是否成功print(f"GET请求成功,状态码:{response.status_code}")print(f"响应内容:{response.text}")except requests.exceptions.RequestException as e:print(f"GET请求失败:{e}")# 发送POST请求
def post_request_example(url, data):try:response = requests.post(url, data=data)response.raise_for_status() # 检查请求是否成功print(f"POST请求成功,状态码:{response.status_code}")print(f"响应内容:{response.text}")except requests.exceptions.RequestException as e:print(f"POST请求失败:{e}")# 设置请求头
def custom_headers_example(url):headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3','Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8','Accept-Language': 'en-US,en;q=0.5',}try:response = requests.get(url, headers=headers)response.raise_for_status() # 检查请求是否成功print(f"自定义请求头成功,状态码:{response.status_code}")print(f"响应内容:{response.text}")except requests.exceptions.RequestException as e:print(f"请求失败:{e}")# 处理Cookies
def cookies_example(url):cookies = {'session_id': '123456'} # 假设的Cookie值try:response = requests.get(url, cookies=cookies)response.raise_for_status() # 检查请求是否成功print(f"携带Cookies请求成功,状态码:{response.status_code}")print(f"响应内容:{response.text}")except requests.exceptions.RequestException as e:print(f"请求失败:{e}")# 使用示例:
get_url = "https://api.example.com/data" # 替换为实际的GET请求URL
post_url = "https://api.example.com/submit" # 替换为实际的POST请求URL
post_data = {'key1': 'value1', 'key2': 'value2'} # 替换为实际的POST数据
custom_headers_url = "https://www.example.com" # 替换为实际的需要自定义请求头的URL
cookies_url = "https://www.example.com" # 替换为实际的需要携带Cookies的URL# 调用示例函数进行测试
get_request_example(get_url)
post_request_example(post_url, post_data)
custom_headers_example(custom_headers_url)
cookies_example(cookies_url)
请注意,上述代码中的URL和数据需要根据实际情况进行替换。此外,对于需要身份验证或特殊权限的API,可能还需要在请求中添加相应的认证信息或令牌。
三、示例(获取json数据存入mysql)
下面是一个简单的例子,演示如何使用requests库从API获取JSON数据,并使用pymysql库将数据存入MySQL数据库。
首先,你需要安装必要的库(如果还没有安装的话):
pip install requests pymysql
然后,你可以使用以下Python脚本来实现这个过程:
import requests
import pymysql# 连接MySQL数据库的参数
db_config = {'host': 'localhost','user': 'root','password': 'password','database': 'user','charset': 'utf8mb4','cursorclass': pymysql.cursors.DictCursor
}# 使用requests从API获取JSON数据
url = 'https://movie.douban.com/j/chart/top_list'
data = {'type': '24','interval_id': '100:90','action': '','start': '0','limit': '20'
}
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36'
}
response = requests.post(url=url, data=data, headers=headers)
response.raise_for_status() # 检查请求是否成功
data = response.json() # 解析JSON响应
# 下面是实际返回的数据格式
'''
{'rating': ['8.9', '45'], 'rank': 20, 'cover_url': 'https://img2.doubanio.com/view/photo/s_ratio_poster/public/p2531065411.jpg','is_playable': True, 'id': '27060077', 'types': ['剧情', '喜剧', '传记', '音乐'],'regions': ['美国', '中国大陆'], 'title': '绿皮书','url': 'https://movie.douban.com/subject/27060077/','release_date': '2019-03-01', 'actor_count': 44, 'vote_count': 1730968,'score': '8.9', 'is_watched': False}
'''
# 连接到MySQL数据库
connection = pymysql.connect(**db_config)
try:with connection.cursor() as cursor:# 创建表(如果表已存在,则忽略此步骤)create_table_query = ''' CREATE TABLE IF NOT EXISTS my_data ( id INT AUTO_INCREMENT PRIMARY KEY, title VARCHAR(255), cover_url VARCHAR(255), types VARCHAR(255), score decimal(10,2), vote_count int, release_date datetime, -- 添加其他需要的字段 created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ) '''cursor.execute(create_table_query)# 插入数据到MySQL数据库for item in data:insert_query = ''' INSERT INTO my_data (id,title, cover_url, types, score, vote_count, release_date) VALUES (%s, %s, %s, %s, %s, %s, %s) ''' # 根据你的数据结构调整字段和占位符values = (item['id'], item['title'], item['cover_url'], str(item['types']), item['score'], item['vote_count'],item['release_date']) # 提取需要插入的数据,根据实际情况调整cursor.execute(insert_query, values)# 提交事务connection.commit()
finally:connection.close() # 关闭数据库连接
存入数据库结果示例图
四、示例(采集网页数据存储html文件)
下面例子演示根据手动输入的关键字从搜狐搜索相关内容,然后把搜索结果html内容以文件形式存储在本地。
import requestsif __name__ == '__main__':headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36'}url = 'https://www.sogou.com/web'kw = input('请输入关键字:')params = {'query': kw}response = requests.get(url=url, params=params, headers=headers)page_text = response.textfile_name = kw + '.html'with open(file_name, 'w', encoding='utf-8') as fp:fp.write(page_text)print(file_name, '保存成功')
运行代码,输入想要搜索的关键字,将返回的整个网页存储在本地