request和selenium(Python爬虫)
requests
和 selenium
是 Python 中两个常用的用于网络数据获取的工具,但它们的设计目标、使用场景和底层机制有显著不同。
1. 基本概念
项目 | requests | selenium |
---|---|---|
类型 | HTTP 库 | 浏览器自动化工具 |
功能 | 发送 HTTP 请求,获取响应 | 控制真实或虚拟浏览器进行页面操作 |
依赖 | 不依赖浏览器 | 依赖浏览器(如 Chrome、Firefox)或无头浏览器 |
2. 工作原理
requests:
- 直接与服务器进行 HTTP 通信。
- 只能获取服务器返回的原始 HTML 或 JSON 数据。
- 无法执行 JavaScript,无法与动态内容交互。
selenium:
- 启动一个真实的浏览器(或无头浏览器)。
- 完整加载页面,包括执行 JavaScript、加载 AJAX 内容、处理动态元素。
- 可模拟用户操作:点击、输入、滚动、等待等。
3. 使用场景对比
场景 | 推荐工具 | 原因 |
---|---|---|
爬取静态网页(HTML 源码即所需内容) | ✅ requests | 快速、轻量、高效 |
爬取动态网页(内容由 JS 渲染) | ✅ selenium | 能执行 JS,获取渲染后内容 |
需要登录、点击按钮、填写表单 | ✅ selenium | 可模拟用户交互 |
接口调用、获取 JSON 数据 | ✅ requests | 直接请求 API 接口更高效 |
高并发、大规模爬取 | ✅ requests | 资源消耗小,速度快 |
需要截图、测试前端功能 | ✅ selenium | 支持截图、模拟真实用户行为 |
4. 代码示例对比
使用 requests
获取网页内容:
1 | import requests |
优点:简单、快速。
缺点:无法获取 JS 动态生成的内容。
使用 selenium
获取渲染后的网页内容:
1 | from selenium import webdriver |
优点:能处理复杂动态页面。
缺点:启动慢、资源占用高、配置复杂。
5. 性能与资源消耗
指标 | requests | selenium |
---|---|---|
速度 | ⚡ 极快 | 🐢 较慢(需启动浏览器) |
内存占用 | 低 | 高(每个浏览器实例消耗大) |
并发能力 | 高(可配合 asyncio) | 低(浏览器实例难并发) |
易用性 | 简单直观 | 需要配置驱动、处理等待等 |
6. 常见搭配
- requests + BeautifulSoup:适用于静态网页解析。
- selenium + WebDriverWait:适用于动态网页等待和交互。
- requests + selenium 结合使用:
- 用 selenium 登录获取 cookies,
- 再用 requests 携带 cookies 高效请求数据。
7. 安全与反爬
工具 | 易被反爬 | 说明 |
---|---|---|
requests | ✅ 容易(User-Agent、IP 限制) | 可通过 headers、代理缓解 |
selenium | ❌ 相对难(但非免疫) | 浏览器行为更像真人,但仍可能被检测(如 webdriver 特征) |
注意:现代反爬虫技术(如 Cloudflare)也能检测 selenium,需配合
undetected-chromedriver
等工具绕过。
总结:如何选择?
选择标准 | 使用 requests | 使用 selenium |
---|---|---|
页面是静态的 | ✅ | ❌(杀鸡用牛刀) |
内容由 JS 动态加载 | ❌ | ✅ |
需要模拟用户操作 | ❌ | ✅ |
追求速度和效率 | ✅ | ❌ |
做自动化测试或 UI 验证 | ❌ | ✅ |
✅ 简单总结:
requests
是“打电话问数据”selenium
是“亲自打开浏览器看网页”
Tips
- 如果目标网站提供 API 接口,优先用
requests
直接调用。 - 对于单页应用(SPA),如 React/Vue 项目,通常需要
selenium
。 - 可考虑使用
playwright
或puppeteer
(Node.js)作为 selenium 的现代替代品,性能更好、API 更简洁。