requestsselenium 是 Python 中两个常用的用于网络数据获取的工具,但它们的设计目标、使用场景和底层机制有显著不同。

入门指南 | Selenium

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
2
3
4
5
6
7
import requests
from bs4 import BeautifulSoup

url = "https://httpbin.org/html"
response = requests.get(url)
soup = BeautifulSoup(response.text, 'html.parser')
print(soup.title.text)

优点:简单、快速。
缺点:无法获取 JS 动态生成的内容。


使用 selenium 获取渲染后的网页内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
from selenium import webdriver
from selenium.webdriver.common.by import By

# 启动 Chrome 浏览器(需安装 chromedriver)
driver = webdriver.Chrome()
driver.get("https://example.com")

# 获取页面标题(JS 渲染后的)
print(driver.title)

# 查找元素并交互
element = driver.find_element(By.TAG_NAME, "h1")
print(element.text)

driver.quit()

优点:能处理复杂动态页面。
缺点:启动慢、资源占用高、配置复杂。


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
  • 可考虑使用 playwrightpuppeteer(Node.js)作为 selenium 的现代替代品,性能更好、API 更简洁。