Python的requests模块是一个简单好用的HTTP库,用来向网站发送各种请求。相比Python自带的urllib库,requests用起来更加方便直观。
首先需要安装requests模块。在命令行中输入:
pip install requests安装完成后,在Python代码中导入:
import requests每次调用 requests 请求之后,会返回一个 response 对象,该对象包含了具体的响应信息,如状态码、响应头、响应内容等:
print(response.status_code) # 获取响应状态码
print(response.headers) # 获取响应头
print(response.content) # 获取响应内容更多响应信息如下:
| 属性或方法 | 说明 |
|---|---|
| apparent_encoding | 编码方式 |
| close() | 关闭与服务器的连接 |
| content | 返回响应的内容,以字节为单位 |
| cookies | 返回一个 CookieJar 对象,包含了从服务器发回的 cookie |
| elapsed | 返回一个 timedelta 对象,包含了从发送请求到响应到达之间经过的时间量,可以用于测试响应速度。比如 r.elapsed.microseconds 表示响应到达需要多少微秒。 |
| encoding | 解码 r.text 的编码方式 |
| headers | 返回响应头,字典格式 |
| history | 返回包含请求历史的响应对象列表(url) |
| is_permanent_redirect | 如果响应是永久重定向的 url,则返回 True,否则返回 False |
| is_redirect | 如果响应被重定向,则返回 True,否则返回 False |
| iter_content() | 迭代响应 |
| iter_lines() | 迭代响应的行 |
| json() | 返回结果的 JSON 对象 (结果需要以 JSON 格式编写的,否则会引发错误) |
| links | 返回响应的解析头链接 |
| next | 返回重定向链中下一个请求的 PreparedRequest 对象 |
| ok | 检查 "status_code" 的值,如果小于400,则返回 True,如果不小于 400,则返回 False |
| raise_for_status() | 如果发生错误,方法返回一个 HTTPError 对象 |
| reason | 响应状态的描述,比如 "Not Found" 或 "OK" |
| request | 返回请求此响应的请求对象 |
| status_code | 返回 http 的状态码,比如 404 和 200(200 是 OK,404 是 Not Found) |
| text | 返回响应的内容,unicode 类型数据 |
| url | 返回响应的 URL |
requests 方法如下表:
| 方法 | 描述 |
|---|---|
| delete(url, args) | 发送 DELETE 请求到指定 url |
| get(url, params, args) | 发送 GET 请求到指定 url |
| head(url, args) | 发送 HEAD 请求到指定 url |
| patch(url, data, args) | 发送 PATCH 请求到指定 url |
| post(url, data, json, args) | 发送 POST 请求到指定 url |
| put(url, data, args) | 发送 PUT 请求到指定 url |
| request(method, url, args) | 向指定的 url 发送指定的请求方法 |
GET请求是最常用的请求类型,用于获取网页内容。
import requests
# 发送GET请求
response = requests.get('https://www.fly63.com/')
# 显示网页内容
print(response.text)这段代码会获取fly63网站的首页内容并显示出来。
每次发送请求后,都会返回一个response对象,包含服务器的响应信息。
import requests
response = requests.get('https://www.fly63.com/')
# 状态码
print("状态码:", response.status_code)
# 响应头信息
print("响应头:", response.headers)
# 网页内容
print("网页内容:", response.text[:200]) # 只显示前200个字符
# 编码方式
print("编码:", response.encoding)
# 请求的URL
print("请求URL:", response.url)response对象有很多有用的属性和方法:
status_code - HTTP状态码(200表示成功,404表示找不到页面)
text - 网页的文本内容
content - 网页的二进制内容
headers - 服务器的响应头
cookies - 服务器返回的cookies
url - 实际请求的URL地址
encoding - 网页的编码方式
elapsed - 请求花费的时间
很多网站接口返回JSON格式的数据,requests可以自动解析:
import requests
# 请求JSON数据
response = requests.get('https://api.fly63.com/data.json')
# 直接获取JSON对象
data = response.json()
print("网站名称:", data.get('name'))
print("网站数量:", data.get('num'))在请求中传递参数有两种方式:
import requests
# 方法1:直接拼接URL
response = requests.get('https://www.fly63.com/search?q=python')
# 方法2:使用params参数(推荐)
params = {'q': 'python', 'page': 1}
response = requests.get('https://www.fly63.com/search', params=params)
print("实际请求的URL:", response.url)有些网站会检查请求头信息,需要模拟浏览器访问:
import requests
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (Khtml, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'
}
response = requests.get('https://www.fly63.com/', headers=headers)
print(response.status_code)POST请求用于向服务器提交数据:
import requests
# 简单的POST请求
response = requests.post('https://www.fly63.com/login')
print(response.text)向网站提交表单数据:
import requests
# 表单数据
form_data = {
'username': 'testuser',
'password': 'testpass',
'remember': '1'
}
response = requests.post('https://www.fly63.com/login', data=form_data)
if response.status_code == 200:
print("登录成功")
else:
print("登录失败")向API接口发送JSON数据:
import requests
import json
json_data = {
'title': '测试文章',
'content': '这是文章内容',
'author': '张三'
}
headers = {'Content-Type': 'application/json'}
response = requests.post('https://api.fly63.com/articles',
json=json_data,
headers=headers)
print("响应状态:", response.status_code)
print("响应内容:", response.text)获取和使用cookies:
import requests
# 发送请求获取cookies
response = requests.get('https://www.fly63.com/')
print("Cookies:", response.cookies)
# 使用cookies发送后续请求
cookies = response.cookies
new_response = requests.get('https://www.fly63.com/user', cookies=cookies)避免请求长时间等待:
import requests
try:
# 设置3秒超时
response = requests.get('https://www.fly63.com/', timeout=3)
print("请求成功")
except requests.exceptions.Timeout:
print("请求超时")
except requests.exceptions.RequestException as e:
print("请求错误:", e)完善的错误处理让程序更健壮:
import requests
try:
response = requests.get('https://www.fly63.com/notfound')
response.raise_for_status() # 如果状态码不是200,抛出异常
except requests.exceptions.HTTPError as err:
print(f"HTTP错误: {err}")
except requests.exceptions.ConnectionError as err:
print(f"连接错误: {err}")
except requests.exceptions.Timeout as err:
print(f"超时错误: {err}")
except requests.exceptions.RequestException as err:
print(f"其他错误: {err}")使用requests上传文件:
import requests
# 上传文件
files = {'file': open('example.txt', 'rb')}
response = requests.post('https://www.fly63.com/upload', files=files)
print("上传状态:", response.status_code)下载网络文件到本地:
import requests
url = 'https://www.fly63.com/images/logo.png'
response = requests.get(url)
# 保存文件
with open('logo.png', 'wb') as f:
f.write(response.content)
print("文件下载完成")带进度显示的文件下载:
import requests
def download_file(url, filename):
response = requests.get(url, stream=True)
total_size = int(response.headers.get('content-length', 0))
with open(filename, 'wb') as f:
downloaded = 0
for chunk in response.iter_content(chunk_size=8192):
if chunk:
f.write(chunk)
downloaded += len(chunk)
if total_size > 0:
percent = (downloaded / total_size) * 100
print(f"下载进度: {percent:.1f}%", end='\r')
print(f"\n文件已保存: {filename}")
# 使用示例
download_file('https://www.fly63.com/file.zip', 'downloaded_file.zip')使用Session对象保持会话状态:
import requests
# 创建会话
session = requests.Session()
# 登录
login_data = {'username': 'user', 'password': 'pass'}
session.post('https://www.fly63.com/login', data=login_data)
# 后续请求会自动携带cookies
profile = session.get('https://www.fly63.com/profile')
settings = session.get('https://www.fly63.com/settings')
print("登录状态保持成功")通过代理服务器发送请求:
import requests
proxies = {
'http': 'http://10.10.1.10:3128',
'https': 'http://10.10.1.10:1080',
}
response = requests.get('https://www.fly63.com/', proxies=proxies)
print("通过代理请求成功")除了GET和POST,还支持其他HTTP方法:
import requests
url = 'https://api.fly63.com/users/123'
# PUT请求 - 更新资源
response = requests.put(url, data={'name': '新名字'})
# DELETE请求 - 删除资源
response = requests.delete(url)
# HEAD请求 - 只获取头部信息
response = requests.head(url)
print("内容类型:", response.headers.get('Content-Type'))
# OPTIONS请求 - 获取服务器支持的通信选项
response = requests.options(url)import requests
import time
def monitor_website(url, keyword):
"""监控网页内容变化"""
previous_content = ""
while True:
try:
response = requests.get(url)
current_content = response.text
if previous_content and current_content != previous_content:
print("网页内容已更新!")
if keyword in current_content:
print(f"找到关键词: {keyword}")
previous_content = current_content
time.sleep(300) # 每5分钟检查一次
except Exception as e:
print(f"监控错误: {e}")
time.sleep(60)
# 开始监控
# monitor_website('https://www.fly63.com/', 'Python')import requests
import json
def get_weather(city):
"""获取天气信息(示例)"""
# 这里使用示例URL,实际使用时替换为真实API
url = f'https://api.example.com/weather/{city}'
try:
response = requests.get(url)
response.raise_for_status()
weather_data = response.json()
return weather_data
except requests.exceptions.RequestException as e:
print(f"获取天气信息失败: {e}")
return None
# 使用示例
weather = get_weather('beijing')
if weather:
print("当前天气:", weather)使用连接池:requests自动保持连接,重复请求同一网站时速度更快
设置超时:避免程序长时间等待
使用流式下载:大文件下载时使用stream=True
合理使用Session:多次请求同一网站时使用Session对象
requests模块让HTTP请求变得非常简单。主要特点:
语法简洁直观
自动处理编码问题
支持各种HTTP方法
提供完善的错误处理
支持会话保持和cookies管理
对于网页抓取、API调用、自动化测试等任务,requests都是很好的选择。掌握这个模块能够大大提高开发效率。
本文内容仅供个人学习/研究/参考使用,不构成任何决策建议或专业指导。分享/转载时请标明原文来源,同时请勿将内容用于商业售卖、虚假宣传等非学习用途哦~感谢您的理解与支持!