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

目录
requests简介- 安装
requests requests基础用法- 发送 GET 请求
- 解析响应内容
- 处理 URL 参数
- 设置请求头
- 爬虫核心流程
- 实战案例:爬取豆瓣 Top 250 电影
- 进阶技巧
- 处理动态网页(结合
Selenium) - 数据存储(CSV, JSON)
- 避免被封禁(设置 User-Agent, 代理 IP, 延时)
- 处理动态网页(结合
requests 简介
requests 库的主要功能是模拟浏览器向服务器发送 HTTP 请求,并获取服务器的响应,它支持多种请求方法,如 GET、POST、PUT、DELETE 等,并能轻松处理 cookies、session、文件上传等。
核心优势:
- 简洁易用:API 设计非常直观,几行代码就能完成复杂的 HTTP 请求。
- 功能强大:支持自动解码响应内容、处理流式请求、文件上传、会话管理等。
- 社区活跃:文档完善,遇到问题很容易找到解决方案。
安装 requests
在使用之前,你需要先安装它,打开你的终端或命令行工具,运行以下命令:
pip install requests
requests 基础用法
1 发送 GET 请求
GET 请求是最常见的请求方式,通常用于从服务器获取数据。

import requests
# 目标 URL
url = 'https://www.httpbin.org/get' # 一个用于测试 HTTP 请求的网站
try:
# 发送 GET 请求
response = requests.get(url)
# 检查请求是否成功 (状态码为 200)
response.raise_for_status() # 如果状态码不是 200,会抛出异常
# 打印响应内容
print("请求成功!")
print("状态码:", response.status_code)
print("响应头:", response.headers)
print("响应内容 (文本):", response.text)
except requests.exceptions.RequestException as e:
print(f"请求发生错误: {e}")
2 解析响应内容
requests 的响应对象 response 提供了多种方式来获取内容:
response.text:以字符串形式返回响应内容。requests会根据 HTTP 头部信息自动解码。response.content:以字节形式返回响应内容,适合处理图片、音频等二进制文件。response.json():如果响应内容是 JSON 格式,这个方法会直接将其解析为 Python 的字典或列表。这是最常用、最方便的方式。
示例:
import requests
import json # json 库用于手动对比
url = 'https://www.httpbin.org/json'
response = requests.get(url)
# 使用 .json() 方法
data = response.json()
print("使用 .json() 解析:")
print(data['slideshow']['author'])
# 对比手动解析
# manual_data = json.loads(response.text)
# print("\n手动解析:")
# print(manual_data['slideshow']['author'])
3 处理 URL 参数
当你需要向 URL 传递查询参数时(?key1=value1&key2=value2),可以直接使用 params 参数,requests 会帮你自动构建 URL。
import requests
# 目标基础 URL
base_url = 'https://www.httpbin.org/get'
# 要传递的参数
params = {
'name': '张三',
'age': 25,
'city': '北京'
}
# 发送带参数的 GET 请求
response = requests.get(base_url, params=params)
# 打印最终的 URL
print("最终请求的 URL:", response.url)
# 打印响应内容
print("响应内容:", response.json()['args'])
4 设置请求头
有些网站会检查请求头,如果发现请求头中没有 User-Agent(浏览器标识),可能会拒绝访问,设置一个常见的 User-Agent 是爬虫的基本操作。

import requests
url = 'https://www.httpbin.org/get'
# 设置请求头
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'
}
response = requests.get(url, headers=headers)
print("响应头中的 User-Agent:", response.json()['headers']['User-Agent'])
爬虫核心流程
一个简单的爬虫通常遵循以下步骤:
- 确定目标:明确要爬取哪个网站、哪些页面、哪些信息。
- 分析网页:使用浏览器开发者工具(F12)查看目标网页的结构,找到数据所在的 HTML 标签。
- 发送请求:使用
requests库向目标 URL 发送 HTTP 请求。 - 获取响应:获取服务器返回的 HTML 内容(通常是
response.text)。 - 解析数据:使用解析库(如
BeautifulSoup或lxml)从 HTML 中提取所需信息。 - 存储数据:将提取的数据保存到文件(如 CSV、JSON)或数据库中。
- 遍历与循环:如果需要爬取多个页面,则构造下一页的 URL,重复步骤 3-6。
实战案例:爬取豆瓣 Top 250 电影
我们将爬取豆瓣电影 Top 250 的电影名称、评分和一句话评语。
准备工作:
- 安装
requests和beautifulsoup4(一个强大的 HTML 解析库)。pip install requests beautifulsoup4
- 分析豆瓣 Top 250 的网页结构,找到电影信息所在的
div
代码实现:
import requests
from bs4 import BeautifulSoup
import time
def get_douban_top250():
"""
爬取豆瓣电影 Top 250 的信息
"""
# 目标 URL
base_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 = []
# 循环爬取 10 页数据 (每页 25 条)
for start in range(0, 250, 25):
# 构造每页的 URL
url = f'{base_url}?start={start}'
print(f'正在爬取: {url}')
try:
# 发送 GET 请求
response = requests.get(url, headers=headers)
response.raise_for_status() # 检查请求是否成功
# 使用 BeautifulSoup 解析 HTML
soup = BeautifulSoup(response.text, 'html.parser')
# 找到所有包含电影信息的 <div> 标签 (class="item")
movie_list = soup.find_all('div', class_='item')
for movie in movie_list:
# 提取电影名称
title = movie.find('span', class_='title').text
# 提取评分
rating = movie.find('span', class_='rating_num').text
# 提取一句话评语 (处理可能不存在的情况)
quote = movie.find('span', class_='inq')
quote_text = quote.text if quote else '无'
# 将电影信息添加到列表
all_movies.append({
'title': title,
'rating': rating,
'quote': quote_text
})
# 礼貌性延时,避免请求过于频繁
time.sleep(1)
except requests.exceptions.RequestException as e:
print(f'请求失败: {e}')
break
return all_movies
if __name__ == '__main__':
movies = get_douban_top250()
# 打印结果
for movie in movies:
print(f"电影: {movie['title']}, 评分: {movie['rating']}, 评语: {movie['quote']}")
# 你可以将 movies 列表保存到文件或数据库中
print(f"\n总共爬取了 {len(movies)} 部电影。")
进阶技巧
1 处理动态网页
有些网站(如淘宝、微博)的内容是通过 JavaScript 动态加载的,requests 只能获取到初始的 HTML,看不到动态加载的内容,这时需要使用 Selenium 或 Playwright 等工具来模拟浏览器行为,等待 JS 渲染完成后再获取 HTML。
2 数据存储
将爬取的数据保存下来是爬虫的最终目的。
-
保存为 CSV: 使用 Python 内置的
csv模块。import csv with open('movies.csv', 'w', newline='', encoding='utf-8-sig') as f: writer = csv.DictWriter(f, fieldnames=['title', 'rating', 'quote']) writer.writeheader() writer.writerows(movies) -
保存为 JSON: 使用
json模块。import json with open('movies.json', 'w', encoding='utf-8') as f: json.dump(movies, f, ensure_ascii=False, indent=4)
3 避免被封禁
大规模爬取网站时,如果不加控制,很容易被服务器识别并封禁 IP,以下是一些反反爬策略:
- 设置 User-Agent:如前所述,伪装成浏览器。
- 使用代理 IP:通过代理服务器发送请求,隐藏真实 IP,可以购买代理 IP 服务或使用免费代理(免费代理通常不稳定)。
proxies = { 'http': 'http://your_proxy_ip:port', 'https': 'https://your_proxy_ip:port', } response = requests.get(url, proxies=proxies) - 控制访问频率:在两次请求之间加入随机延时。
import random time.sleep(random.uniform(1, 3)) # 随机延时 1 到 3 秒
- 使用 Session:
Session对象可以在多次请求之间保持 cookies,适用于需要登录的网站。s = requests.Session() s.get('https://www.example.com/login', headers=headers) # 模拟登录 response = s.get('https://www.example.com/profile', headers=headers) # 访问需要登录的页面
requests 是 Python 爬虫的基石,它让发送 HTTP 请求变得异常简单,结合 BeautifulSoup 进行 HTML 解析,你可以高效地完成绝大多数静态网站的爬取任务。
编写爬虫时,请务必遵守网站的 robots.txt 协议,并控制好爬取频率,做一个有礼貌的爬虫开发者。
