Requests基础

掌握Python中最常用的HTTP请求库

什么是Requests?

Requests是Python中最流行的HTTP库,它让HTTP请求变得简单易用。就像浏览器访问网页一样, 我们可以用Requests获取网页内容,但它是通过编程方式实现的。

# 安装requests
pip install requests

# 基础使用
import requests
response = requests.get('https://example.com')
print(response.text) # 获取网页内容

GET请求详解

1

基础GET请求

GET请求用于从服务器获取数据,这是最常见的HTTP请求方法。 当你在浏览器中输入网址并按回车,就是发送了一个GET请求。

# 最简单的GET请求
import requests

response = requests.get('https://www.example.com')
print(f"状态码: {response.status_code}")
print(f"响应内容类型: {response.headers['content-type']}")
print(f"编码: {response.encoding}")
print(f"内容长度: {len(response.text)}字符")

# 打印前100个字符
print(response.text[:100])
2

带查询参数的GET请求

很多时候,我们需要在URL中添加查询参数来获取特定的数据。例如在搜索引擎中搜索关键词, 这些关键词通常会作为查询参数添加到URL中。

# 带查询参数的GET请求
import requests

# 方法1:直接在URL中添加参数
url1 = 'https://www.example.com/search?q=python&page=1'
response1 = requests.get(url1)

# 方法2:使用params参数(推荐)
url2 = 'https://www.example.com/search'
params = {
 'q': 'python', # 搜索关键词
 'page': 1, # 页码
 'sort': 'relevance' # 排序方式
}
response2 = requests.get(url2, params=params)

# 查看最终请求的URL
print(f"最终请求的URL: {response2.url}")
3

设置请求头

有些网站会检查请求头信息,如果发现是爬虫程序,可能会拒绝提供数据。 因此,我们通常需要设置User-Agent等请求头信息来模拟浏览器访问。

# 设置请求头
import requests

url = 'https://www.example.com'

# 构造请求头字典
headers = {
 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36',
 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8',
 'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8',
 'Referer': 'https://www.google.com/' # 模拟从Google搜索过来
}

response = requests.get(url, headers=headers)

# 查看服务器是否接收到请求头
print("请求发送成功!")
4

GET请求实际案例:天气信息获取

下面我们来看一个实际应用案例:通过和风天气API获取指定城市的天气信息。

# GET请求实际案例:获取天气信息
import requests

# 和风天气API示例(注意:实际使用需要申请API密钥)
url = 'https://devapi.qweather.com/v7/weather/now'
params = {
 'location': '101010100', # 北京的城市ID
 'key': 'YOUR_API_KEY' # 替换为你的API密钥
}

try:
 response = requests.get(url, params=params, timeout=10)

 # 检查请求是否成功
 if response.status_code == 200:
 # 解析JSON响应
 weather_data = response.json()

 # 提取关键信息
 if 'now' in weather_data:
 now = weather_data['now']
 print(f"城市:北京")
 print(f"当前温度:{now['temp']}°C")
 print(f"天气状况:{now['text']}")
 print(f"风向:{now['windDir']} {now['windScale']}级")
 print(f"湿度:{now['humidity']}%")
 else:
 print(f"请求失败,状态码:{response.status_code}")
except Exception as e:
 print(f"发生错误:{e}")

POST请求详解

1

基础POST请求

POST请求通常用于向服务器提交数据,例如提交表单、上传文件等。与GET请求不同, POST请求的数据通常放在请求体中,而不是URL中。

# 基础POST请求
import requests

url = 'https://www.example.com/login'

# 准备表单数据
form_data = {
 'username': 'test_user',
 'password': 'test_password'
}

# 发送POST请求
response = requests.post(url, data=form_data)

# 检查登录是否成功
if response.status_code == 200:
 print("登录请求发送成功!")
else:
 print(f"登录失败,状态码:{response.status_code}")
2

发送JSON数据

在现代Web应用中,特别是前后端分离的项目中,经常需要发送JSON格式的数据。 Requests库可以很方便地发送JSON数据。

# 发送JSON数据
import requests
import json

url = 'https://api.example.com/data'

# 准备JSON数据
json_data = {
 'name': '张三',
 'age': 25,
 'email': 'zhangsan@example.com',
 'hobbies': ['阅读', '编程', '运动']
}

# 方法1:使用json参数(推荐)
response1 = requests.post(url, json=json_data)

# 方法2:手动设置headers和转换数据
headers = {
 'Content-Type': 'application/json'
}
response2 = requests.post(url, data=json.dumps(json_data), headers=headers)

# 查看响应
if response1.status_code == 200:
 result = response1.json()
 print(f"请求成功,服务器返回:{result}")
3

文件上传

POST请求还可以用于上传文件,这在很多Web应用中都很常见,例如上传头像、附件等。

# 文件上传
import requests

url = 'https://api.example.com/upload'

# 准备文件数据
files = {
 'file': open('example.txt', 'rb') # 打开文件,rb表示以二进制模式读取
}

# 可以同时发送表单数据
data = {
 'description': '这是一个示例文件',
 'category': '文档'
}

try:
 response = requests.post(url, files=files, data=data)

 if response.status_code == 200:
 print("文件上传成功!")
 else:
 print(f"文件上传失败,状态码:{response.status_code}")
except Exception as e:
 print(f"文件上传出错:{e}")
finally:
 # 确保文件被关闭
 if 'file' in locals() or 'file' in globals():
 files['file'].close()
4

POST请求实际案例:翻译服务

下面我们来看一个实际应用案例:通过百度翻译API将中文翻译成英文。

# POST请求实际案例:翻译服务
import requests
import json

# 百度翻译API示例(注意:实际使用需要申请API密钥)
url = 'https://fanyi-api.baidu.com/api/trans/vip/translate'

# 准备请求参数
params = {
 'q': '你好,世界!',
 'from': 'zh',
 'to': 'en',
 'appid': 'YOUR_APPID', # 替换为你的AppID
 'salt': '123456', # 随机数
 'sign': 'SIGN_VALUE' # 签名,需要根据appid、q、salt、密钥计算
}

# 也可以使用POST的data参数
# data = params.copy()

headers = {
 'Content-Type': 'application/x-www-form-urlencoded'
}

try:
 # 发送GET请求或者POST请求都可以
 # response = requests.get(url, params=params)
 response = requests.post(url, params=params, headers=headers)

 if response.status_code == 200:
 result = response.json()
 if 'trans_result' in result:
 translated_text = result['trans_result'][0]['dst']
 print(f"原文:{params['q']}")
 print(f"译文:{translated_text}")
 else:
 print(f"翻译失败:{result}")
 else:
 print(f"请求失败,状态码:{response.status_code}")
except Exception as e:
 print(f"翻译过程中发生错误:{e}")

小华的新闻爬虫

小华是一名新闻专业的学生,需要收集各大新闻网站的热点新闻进行分析。她发现手动复制粘贴效率太低, 于是决定用Requests库编写一个简单的新闻爬虫。

import requests
from bs4 import BeautifulSoup

# 小华的新闻爬虫
class NewsSpider:
 def __init__(self):
 self.headers = {
 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
 }

 def get_news(self, url):
 try:
 response = requests.get(url, headers=self.headers, timeout=10)
 if response.status_code == 200:
 return response.text
 else:
 print(f"请求失败,状态码:{response.status_code}")
 return None
 except Exception as e:
 print(f"请求出错:{e}")
 return None

# 使用示例
spider = NewsSpider()
content = spider.get_news('https://news.example.com')
print(f"成功获取网页内容,长度:{len(content)}字符")

小华的心得:通过使用Requests库,我可以在几分钟内收集到几百条新闻数据, 这比我手动操作快了100倍!而且代码还能重复使用。

8个练习题

练习1:基础GET请求

使用requests获取百度首页内容,并打印响应状态码和内容长度。

# 目标:requests.get('https://www.baidu.com')

练习2:设置用户代理

创建一个函数,为请求添加合适的User-Agent头部信息。

# 提示:headers = {'User-Agent': 'Mozilla/5.0...'}

练习3:超时处理

编写一个带有超时功能的请求函数,避免程序长时间等待。

# 目标:requests.get(url, timeout=5)

练习4:异常处理

完善爬虫程序,添加完整的异常处理机制。

# 提示:try-except捕获网络异常

练习5:POST表单提交

模拟登录表单提交,学习POST请求的使用方法。

# 目标:requests.post(url, data={'username': 'xxx'})

练习6:响应状态检查

创建一个函数,检查响应状态码并返回相应的错误信息。

# 提示:检查response.status_code

练习7:批量URL测试

编写程序批量测试多个URL的访问状态。

# 目标:遍历URL列表,检查每个的响应状态

练习8:重试机制

实现一个带有重试功能的请求函数,提高爬虫稳定性。

# 提示:使用循环实现重试逻辑

在线练习

实时请求测试