requests 是 Python 中最流行、最易用的 HTTP 库,它极大地简化了发送 HTTP 请求和处理响应的过程,相比于 Python 内置的 urllib 库,requests 的 API 更加简洁直观。

目录
- 准备工作:安装
requests - 核心概念:
requests的基本用法- 发送 GET 请求
- 解析响应内容
- 处理 URL 参数
- 处理 Headers
- 处理 Cookies
- 实战案例:爬取豆瓣电影 Top 250
- 分析目标网页
- 编写爬虫代码
- 保存数据到文件
- 进阶技巧
- 发送 POST 请求
- 使用会话对象 (
Session) - 处理动态加载网页 (与
Selenium结合) - 设置代理
- 爬虫的“道”与“术”:重要提醒与最佳实践
robots.txt协议- User-Agent (伪装浏览器)
- 请求频率控制 (礼貌性爬虫)
- 异常处理
- 法律与道德
准备工作:安装 requests
如果你还没有安装 requests,可以通过 pip 来安装,打开你的终端或命令行工具,运行以下命令:
pip install requests
核心概念:requests 的基本用法
发送 GET 请求
GET 请求是最常见的请求方式,通常用于从服务器获取数据,使用 requests.get() 方法。
import requests
# 目标网址
url = 'https://www.httpbin.org/get' # 一个用于测试 HTTP 请求的网站
# 发送 GET 请求
response = requests.get(url)
# 检查请求是否成功 (状态码为 200)
print(f"状态码: {response.status_code}")
服务器返回的响应对象 response 包含了丰富的信息。
response.text: 以字符串形式返回响应内容,自动解码。response.content: 以字节形式返回响应内容,适合处理非文本内容(如图片、视频)。response.json(): 如果响应内容是 JSON 格式,这个方法会将其解析为 Python 字典。
# 获取响应文本
html_content = response.text
print(f"响应文本 (前100个字符): {html_content[:100]}")
# 获取响应内容 (字节)
content_bytes = response.content
print(f"响应内容 (前100个字节): {content_bytes[:100]}")
# 如果响应是JSON格式
# response = requests.get('https://api.github.com/events')
# data = response.json()
# print(data[0]['actor']['login'])
处理 URL 参数
很多时候,我们需要在 URL 后面附加查询参数(?key1=value1&key2=value2),手动拼接 URL 既麻烦又容易出错。requests 提供了 params 参数来自动处理。

# 目标URL,不带参数
base_url = 'https://www.httpbin.org/get'
# 参数字典
params = {
'name': '张三',
'age': 25
}
# 发送带参数的GET请求
response = requests.get(base_url, params=params)
# requests会自动将参数编码并拼接到URL上
print(f"最终请求的URL: {response.url}")
处理 Headers
有些网站会检查请求的 Headers,特别是 User-Agent,来判断请求是否来自浏览器,为了模拟真实浏览器,我们需要自定义 Headers。
# 自定义Headers
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-Language': 'zh-CN,zh;q=0.9,en;q=0.8'
}
url = 'https://www.httpbin.org/get'
response = requests.get(url, headers=headers)
print(f"自定义Headers后的响应: {response.json()['headers']['User-Agent']}")
处理 Cookies
requests 会自动处理一些简单的 Cookie,如果需要手动设置或获取 Cookie,可以使用 cookies 参数。
# 设置Cookies
cookies_dict = {'my_cookie': 'hello'}
url = 'https://www.httpbin.org/cookies'
response = requests.get(url, cookies=cookies_dict)
print(response.json()) # 会输出 {'cookies': {'my_cookie': 'hello'}}
# 获取响应中的Cookies
response = requests.get('https://www.httpbin.org/cookies/set/test_cookie/12345')
print(response.cookies.get_dict()) # 会输出 {'test_cookie': '12345'}
实战案例:爬取豆瓣电影 Top 250
这是一个非常经典的入门案例,可以帮助你理解爬虫的基本流程。
分析目标网页
- 打开豆瓣电影 Top 250 页面:
https://movie.douban.com/top250 - 按下
F12打开开发者工具,选择 "网络" (Network) 选项卡。 - 刷新页面,你会看到一个名为
?start=0&filter=的请求,这就是我们需要的。 - 点击这个请求,查看 "响应" (Response) 标签页,你会发现,每部电影的标题、评分、一句话简介等信息都在 HTML 源码中,以
<div class="item">为单位清晰排列。
编写爬虫代码
我们的目标是提取每部电影的排名、标题、评分和一句话简介。

import requests
import time
def scrape_douban_top250():
"""
爬取豆瓣电影Top250
"""
# 1. 定义URL和Headers
url = 'https://movie.douban.com/top250'
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'
}
all_movies = []
for start in range(0, 250, 25): # 每页25条,共10页
# 2. 构造带参数的URL
params = {'start': start, 'filter': ''}
print(f"正在爬取第 {start//25 + 1} 页...")
try:
# 3. 发送请求
response = requests.get(url, headers=headers, params=params, timeout=10)
# 4. 检查请求是否成功
response.raise_for_status() # 如果状态码不是200,则抛出异常
# 5. 解析HTML (这里使用简单的字符串查找,实际项目推荐使用BeautifulSoup)
# 在真实项目中,强烈建议使用BeautifulSoup或lxml来解析HTML
html = response.text
# 简单提取信息 (注意:这种方法脆弱,网页结构一变就失效)
# 使用BeautifulSoup会更健壮,这里为了演示简化了
movie_items = html.find_all('div', class_='item')
for item in movie_items:
rank = item.find('em', class_='').text
title = item.find('span', class_='title').text
rating = item.find('span', class_='rating_num').text
quote = item.find('span', class_='inq')
quote_text = quote.text if quote else '无'
movie_info = {
'排名': rank,
'标题': title,
'评分': rating,
'一句话简介': quote_text
}
all_movies.append(movie_info)
# 6. 礼貌性爬虫:设置延时,避免对服务器造成过大压力
time.sleep(2) # 每次请求后等待2秒
except requests.exceptions.RequestException as e:
print(f"请求失败: {e}")
break
return all_movies
if __name__ == '__main__':
movies = scrape_douban_top250()
# 7. 保存数据
with open('douban_top250.txt', 'w', encoding='utf-8') as f:
for movie in movies:
f.write(f"排名: {movie['排名']}\n")
f.write(f"标题: {movie['标题']}\n")
f.write(f"评分: {movie['评分']}\n")
f.write(f"简介: {movie['一句话简介']}\n")
f.write("-" * 30 + "\n")
print("爬取完成,结果已保存到 douban_top250.txt")
重要提示:上面的代码中,HTML解析部分使用了
find_all,这需要BeautifulSoup库,如果你没有安装,请先安装它:pip install beautifulsoup4,或者,为了专注于requests,你可以先理解发送请求和获取响应的部分,HTML解析可以先跳过或使用更复杂的字符串操作。
进阶技巧
发送 POST 请求
POST 请求通常用于提交表单数据,使用 requests.post() 方法,并通过 data 或 json 参数传递数据。
url = 'https://www.httpbin.org/post'
data = {
'username': 'test_user',
'password': '123456'
}
response = requests.post(url, data=data)
print(response.json()) # 会返回你提交的数据
使用会话对象 (Session)
Session 对象可以在多个请求之间保持某些参数,cookies,当你需要登录一个网站并保持登录状态时,Session 非常有用。
# 创建一个Session对象
session = requests.Session()
# 第一次请求,可能获得cookie
session.get('http://httpbin.org/cookies/set/sessioncookie/123456789')
# 第二次请求,会带上第一次获得的cookie
response = session.get('http://httpbin.org/cookies')
print(response.json()) # 会输出 {'cookies': {'sessioncookie': '123456789'}}
处理动态加载网页
是通过 JavaScript 动态加载的,requests 只能获取到初始的 HTML,无法执行 JS,这时需要使用 Selenium 或 Playwright 等工具来模拟浏览器行为,获取完整的渲染后的页面。
设置代理
为了防止 IP 被封,可以使用代理服务器。
proxies = {
'http': 'http://your_proxy_address:port',
'https': 'https://your_proxy_address:port',
}
response = requests.get('http://example.com', proxies=proxies)
爬虫的“道”与“术”:重要提醒与最佳实践
编写爬虫不仅仅是技术活,更是一门艺术,需要遵守规则和道德。
robots.txt 协议
在爬取一个网站之前,请务必检查其根目录下的 robots.txt 文件(https://www.example.com/robots.txt),这个文件规定了哪些页面可以爬取,哪些不可以,遵守 robots.txt 是爬虫的基本礼貌。
User-Agent (伪装浏览器)
始终设置一个常见的 User-Agent,让服务器知道你是一个“正常的”浏览器访问者,而不是一个恶意脚本。
请求频率控制 (礼貌性爬虫)
不要在短时间内向同一个服务器发送大量请求,这会给对方服务器带来巨大压力,甚至可能导致你的 IP 被封禁,在两次请求之间加入一个合理的延时(如 time.sleep(1) 到 time.sleep(5))。
异常处理
网络环境复杂多变,可能会遇到各种错误(如连接超时、DNS解析失败、服务器错误等),使用 try...except 块来捕获这些异常,让你的爬虫更加健壮。
try:
response = requests.get(url, timeout=5)
response.raise_for_status() # 检查HTTP错误
except requests.exceptions.RequestException as e:
print(f"发生错误: {e}")
法律与道德
切勿爬取和传播个人隐私信息、国家机密或受版权保护的内容。 爬取数据前,请确认该数据的版权和使用权,你的行为不应违反任何法律法规,爬虫的目的是为了学习和获取公开信息,而不是进行恶意攻击或数据窃取。
希望这份详细的指南能帮助你掌握 requests 爬虫的核心技术!祝你学习愉快!
