引言
在互联网时代,数据获取已成为各行各业的重要需求。Python凭借其简洁的语法和丰富的生态系统,成为了网络爬虫开发的首选语言。在众多Python爬虫工具中,Requests库以其简单易用的特点,被誉为”HTTP for Humans”,是每个爬虫开发者的必备工具。本文将详细介绍这个强大的HTTP请求库,帮助初学者快速掌握网络爬虫的基础技能。

Requests库简介
功能特点
Requests库是Python生态系统中最受欢迎的HTTP客户端库,它的主要优点包括:
- 简洁的API设计:告别繁琐的urllib3操作,一行代码即可完成HTTP请求
- 自动化的常用操作:
- Cookie管理
- 会话持久化
- 自动解码
- 重定向处理
- 完善的异常处理:提供清晰的异常体系
- 强大的功能扩展:支持自定义身份验证、代理设置等
工作原理
Requests库基于urllib3实现,其工作流程如下:
- 接收用户请求参数
- 构建标准的HTTP请求
- 发送请求到服务器
- 接收服务器响应
- 处理响应数据
- 返回Response对象
安装方法
打开命令行终端,输入以下命令即可安装Requests库:
pip install requests
安装完成后,可以通过以下代码验证安装是否成功:
import requests
print(requests.__version__)
Requests库的基本使用
1. 发送GET请求
GET请求是最常用的HTTP请求方法,用于从服务器获取数据。以下是几个常用的GET请求示例:
import requests
# 发送简单的GET请求
response = requests.get('https://api.github.com')
print(response.status_code) # 输出状态码,200表示请求成功
这段代码展示了最基本的GET请求。requests.get()
方法向指定URL发送请求,返回一个Response对象。通过检查status_code
属性,我们可以知道请求是否成功。
带参数的GET请求示例:
# 使用params参数传递查询参数
params = {
'q': 'python',
'sort': 'stars',
'order': 'desc'
}
response = requests.get('https://api.github.com/search/repositories', params=params)
print(response.url) # 查看实际请求的URL
这个例子展示了如何添加URL参数。params
参数接受一个字典,Requests会自动将其转换为URL查询字符串。这种方式比手动拼接URL更安全且更容易维护。
2. 自定义请求头
在爬虫开发中,自定义请求头是一个重要的技巧,可以帮助我们模拟浏览器行为:
# 设置自定义请求头
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,image/webp,*/*;q=0.8',
'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8'
}
response = requests.get('https://www.python.org', headers=headers)
print('请求成功' if response.status_code == 200 else '请求失败')
这段代码展示了如何设置请求头。通过设置User-Agent,我们可以让服务器认为请求来自真实的浏览器,这对于一些反爬虫网站很有用。
3. 发送POST请求
POST请求通常用于向服务器提交数据,以下是几个常见的POST请求示例:
# 发送表单数据
login_data = {
'username': 'test_user',
'password': 'test_password'
}
response = requests.post('https://httpbin.org/post', data=login_data)
print(response.json()) # 打印服务器返回的JSON数据
# 发送JSON数据
json_data = {
'name': 'Python爬虫',
'description': '使用Requests库发送POST请求'
}
response = requests.post('https://httpbin.org/post', json=json_data)
print(response.json())
这个例子展示了两种常见的POST请求场景:
- 使用
data
参数发送表单数据 - 使用
json
参数发送JSON数据
Requests会自动设置适当的Content-Type请求头。
4. 处理响应内容
Requests提供了多种方式来处理服务器的响应:
response = requests.get('https://api.github.com')
# 1. 获取文本内容
print(response.text) # 返回Unicode字符串
# 2. 获取二进制内容
print(response.content) # 返回字节串,适用于下载图片等二进制文件
# 3. 获取JSON内容
print(response.json()) # 自动将JSON响应解码为Python对象
# 4. 获取响应头
for key, value in response.headers.items():
print(f'{key}: {value}')
# 5. 获取响应状态码
print(response.status_code)
# 6. 获取编码信息
print(response.encoding)
这段代码展示了如何处理不同类型的响应内容。根据需要,我们可以选择合适的方法来获取数据。
5. 文件上传和下载
Requests也支持文件的上传和下载操作:
# 上传文件
files = {
'file': ('test.txt', open('test.txt', 'rb'), 'text/plain')
}
response = requests.post('https://httpbin.org/post', files=files)
# 下载文件
response = requests.get('https://example.com/image.jpg', stream=True)
if response.status_code == 200:
with open('image.jpg', 'wb') as f:
for chunk in response.iter_content(1024):
f.write(chunk)
这个例子展示了:
- 如何上传文件:使用
files
参数 - 如何下载大文件:使用
stream=True
和iter_content()
方法进行分块下载
实际案例:获取热门GitHub仓库信息
下面是一个完整的实例,展示如何使用Requests库获取GitHub上Python相关的热门仓库信息:
import requests
import time
from datetime import datetime
def get_trending_repos(language='python', since='daily'):
"""
获取GitHub趋势仓库信息
参数:
language: 编程语言
since: 时间范围(daily/weekly/monthly)
"""
# 构建请求URL和头信息
url = f'https://api.github.com/search/repositories'
headers = {
'User-Agent': 'Python-Requests-Tutorial',
'Accept': 'application/vnd.github.v3+json'
}
# 构建查询参数
query = f'language:{language} '
params = {
'q': query,
'sort': 'stars',
'order': 'desc',
'per_page': 10
}
try:
# 发送请求
response = requests.get(url, headers=headers, params=params)
response.raise_for_status() # 检查请求是否成功
# 解析响应数据
repos = response.json()['items']
# 格式化输出
print(f"====== GitHub {language} 热门仓库 ======\n")
for repo in repos:
print(f"仓库名称:{repo['full_name']}")
print(f"描述:{repo['description']}")
print(f"Star数:{repo['stargazers_count']}")
print(f"Fork数:{repo['forks_count']}")
print(f"最后更新:{datetime.strptime(repo['updated_at'], '%Y-%m-%dT%H:%M:%SZ').strftime('%Y-%m-%d %H:%M:%S')}")
print("-" * 50 + "\n")
return True
except requests.exceptions.RequestException as e:
print(f"请求失败:{e}")
return False
except KeyError as e:
print(f"数据解析失败:{e}")
return False
# 使用示例
if __name__ == '__main__':
get_trending_repos()
# 添加延时,避免请求过于频繁
time.sleep(1)
这个实例展示了一个完整的爬虫程序,包含了以下要点:
- 合理的函数结构设计
- 完善的异常处理
- 请求头的设置
- 参数的构建和传递
- 响应数据的解析和格式化
- 适当的延时处理
注意事项和最佳实践
- 请求频率控制
- 使用
time.sleep()
添加适当的延时 - 考虑使用随机延时避免固定模式
- 遵守网站的robots.txt规定
- 使用
- 异常处理
try:
response = requests.get(url, timeout=5)
response.raise_for_status()
except requests.exceptions.Timeout:
print("请求超时")
except requests.exceptions.HTTPError as e:
print(f"HTTP错误:{e}")
except requests.exceptions.RequestException as e:
print(f"请求异常:{e}")
- 会话管理
with requests.Session() as session:
session.headers.update({'User-Agent': 'Custom User Agent'})
response = session.get(url)
相关资源
- PyPI地址:https://pypi.org/project/requests/
- GitHub项目:https://github.com/psf/requests
- 官方文档:https://requests.readthedocs.io/
总结
Requests库是Python爬虫开发中最基础且最重要的工具之一。通过本文的学习,读者应该已经掌握了:
- Requests库的基本用法
- 如何发送各种类型的HTTP请求
- 如何处理响应数据
- 异常处理的最佳实践
- 实际爬虫案例的开发方法
在使用过程中,请始终记住:
- 遵守网站的使用条款和robots.txt规范
- 控制请求频率,避免对目标网站造成压力
- 合理使用异常处理和超时机制
- 注意数据的合法性和使用规范
通过不断的实践和探索,相信你会发现Requests库还有更多强大的功能等待发掘。让我们在遵守规范的前提下,充分利用这个强大的工具,创造更多有价值的应用。
关注我们,每天推荐一款实用的Python爬虫工具
