在Python爬虫的世界里,仅仅使用GET请求获取静态页面数据是远远不够的。当面对需要登录、提交表单或抓取由JavaScript动态渲染的内容时,我们就需要更强大的工具。本文将深入探讨Python中两个关键的进阶技术:requests库的POST请求与Selenium自动化工具,帮助你突破爬虫的常见限制,无论是处理API接口还是应对复杂的动态网站都游刃有余。与JavaScript、Java或C++等语言中的网络请求库相比,Python的requests库以其简洁优雅的语法著称,而Selenium则提供了跨浏览器的统一自动化解决方案。
一、深入理解与使用requests.post()
requests.post()requests.post() 是Python requests 库中用于发送HTTP POST请求的核心函数。与GET请求主要用于获取数据不同,POST请求的主要目的是向服务器提交数据。这在模拟用户交互时至关重要,例如用户登录、发表评论、上传文件或调用需要输入参数的RESTful API。理解POST请求的工作原理,是进阶为中级爬虫开发者的关键一步。
POST请求的基本语法结构如下,它接受目标URL和要发送的数据作为主要参数:
import requests
response = requests.post(url, data=None, json=None, **kwargs)
参数解析:
- url
url:目标请求地址,这是必填项。 - data
data:用于发送表单格式的数据,通常是一个字典或字节流。 - json
json:用于发送JSON格式的数据,传入字典后,库会自动将其序列化并设置正确的Content-TypeContent-Type: application/json头。 - 其他参数
**kwargs:如headersheaders、cookiescookies、timeouttimeout等,其用法与requests.get()get()完全一致。
和 最大区别:
GET 用于“获取”,POST 用于“提交”;POST 的数据放在请求体(body)中,而 GET 放在 URL 参数里。
二、POST请求的三大实战应用场景
掌握了基本语法后,我们通过三个最常见的场景来巩固学习。这些场景覆盖了大部分需要POST请求的爬虫任务。
1. 模拟登录与表单提交
这是爬虫中最常见的需求之一。许多网站的数据在登录后才可见。我们需要分析登录页面的表单,构造包含用户名和密码的字典进行提交。
import requests
url = "https://httpbin.org/post"
data = {
'username': 'alice',
'password': '123456'
}
response = requests.post(url, data=data)
print(response.json()) # 查看服务器收到的数据
此时请求头自动包含:
关键点:成功登录后,服务器通常会返回一个sessionid之类的凭证,需要将其保存并在后续请求中携带(如使用requests.Session()),才能访问受保护的页面。
2. 调用RESTful API接口
现代Web应用大量使用JSON格式的API进行前后端通信。使用json参数可以非常方便地与这些API交互,无论是获取数据还是创建资源。
import requests
url = "https://api.example.com/users"
payload = {
"name": "Bob",
"email": "bob@example.com"
}
# 方法1:使用 json 参数(推荐)
response = requests.post(url, json=payload)
# 方法2:手动序列化 + 设置 headers
# import json
# response = requests.post(url, data=json.dumps(payload),
# headers={'Content-Type': 'application/json'})
使用 参数时, 会:
- 自动将字典转为 JSON 字符串
- 自动设置
3. 实现文件上传功能
某些场景下需要自动化上传文件,例如批量上传图片到图床或文档到管理后台。requests库通过files参数支持多部分编码(multipart/form-data)的文件上传。
files = {'file': open('report.pdf', 'rb')}
response = requests.post("https://httpbin.org/post", files=files)
[AFFILIATE_SLOT_1]⚠️ 注意:文件会以 格式上传,适合图片、文档等二进制数据。
三、征服动态页面:Selenium自动化实战
当目标网站的内容由JavaScript动态加载时(例如无限滚动、点击选项卡切换内容),传统的requests库就无能为力了,因为它只能获取初始的HTML源码。这时,我们需要请出浏览器自动化神器——Selenium二、Selenium。
Selenium是什么?
Selenium最初是一个用于Web应用测试的工具,但它因其强大的浏览器控制能力而被爬虫领域广泛采用。它可以驱动真实的浏览器(如Chrome, Firefox),模拟人的所有操作:点击、输入、滚动、下拉选择等。与TypeScript或Java中的Puppeteer、Playwright等工具类似,Selenium的核心价值在于能获取到JavaScript执行完毕后的完整页面DOM。
Selenium的工作原理 ⚙️
Selenium并不直接控制浏览器,而是通过一个名为WebDriver的协议进行间接通信。你的Python脚本发送指令给WebDriver,WebDriver再将其翻译成浏览器能理解的操作。
Python 脚本
↓ (调用 selenium 库)
Selenium WebDriver (Python 接口)
↓ (发送 HTTP 请求)
浏览器专属驱动程序(如 chromedriver)
↓ (本地协议)
真实浏览器(Chrome / Firefox 等)
✅ 关键点:
- 每种浏览器都有专属的 Driver(如 Chrome → ,Firefox → )。
- Driver 充当“翻译官”,把 Selenium 指令转为浏览器能理解的操作。
- 必须确保 Driver 版本与浏览器版本兼容!
四、Selenium环境搭建与基础操作
使用Selenium前需要两步准备工作,虽然稍显繁琐,但一劳永逸。
步骤1:安装Selenium库
通过pip可以轻松安装Selenium的Python客户端库。
pip install selenium
安装后,可以在Python中导入验证:
import selenium
print(selenium.__version__)
步骤2:下载并配置浏览器驱动(WebDriver) ⚠️
这是最关键的一步。你需要下载与你浏览器版本匹配的驱动。以Chrome为例:
- 查看Chrome版本:打开Chrome → 右上角
⋮→ 帮助 → 关于Google Chrome。示例版本:125.0.6422.142 
- 从官方渠道下载对应版本的ChromeDriver。
- 将驱动文件(如
chromedriver.exechromedriver.exe)放置在系统PATH路径(如Windows的C:\WindowsC:\Windows\)或Python安装目录下。
配置完成后进行验证:
sudo mv chromedriver /usr/local/bin/
sudo chmod +x /usr/local/bin/chromedriver
chromedriver --version
# 输出示例:ChromeDriver 125.0.6422.141
其他主流浏览器的驱动下载地址汇总如下:
| 浏览器 | 驱动名称 | 下载地址 |
|---|---|---|
| Firefox | geckodriver | https://github.com/mozilla/geckodriver/releases |
| Edge | msedgedriver | https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/ |
| Safari | 内置(需启用) | Safari → 开发 → 允许远程自动化 |
五、Selenium核心操作与案例解析
环境配置好后,就可以开始编写自动化脚本了。首先是最基础的用法:启动浏览器并打开网页。
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
# 方式1:自动查找 PATH 中的 chromedriver(推荐)
driver = webdriver.Chrome()
# 方式2:手动指定 driver 路径(兼容旧版)
# service = Service(executable_path="/path/to/chromedriver")
# driver = webdriver.Chrome(service=service)
try:
# 打开网页
driver.get("https://www.baidu.com")
# 查找元素并操作
search_box = driver.find_element(By.ID, "kw")
search_box.send_keys("Selenium WebDriver")
# 点击搜索按钮
driver.find_element(By.ID, "su").click()
# 等待并打印标题
driver.implicitly_wait(3)
print("页面标题:", driver.title)
finally:
# 关闭浏览器
driver.quit()
为了获得更好的自动化体验,我们通常会对WebDriver进行一些配置,例如隐藏浏览器UI以节省资源、设置无头模式等。
from selenium.webdriver.chrome.options import Options
chrome_options = Options()
chrome_options.add_argument("--headless") # 无界面模式(后台运行)
chrome_options.add_argument("--no-sandbox") # 禁用沙盒(Linux 服务器常用)
chrome_options.add_argument("--disable-dev-shm-usage") # 防止内存不足
chrome_options.add_argument("--disable-gpu") # 禁用 GPU 加速
driver = webdriver.Chrome(options=chrome_options)
无头模式(Headless):适合服务器环境或不需要可视化界面的场景。
实战案例1:打开网页并截图
一个简单的开始,打开百度首页并保存截图,常用于检查页面是否加载正常。
import time
'''打开一个网页 '''
from selenium import webdriver #(驱动浏览器驱动)
from selenium.webdriver.edge.service import Service
service = Service(executable_path="./msedgedriver.exe") # 相对路径
driver = webdriver.Edge(service=service)
'''webdriver具备多种不同浏览器的驱动,
browser = webdriver.Firefox()
browser = webdriver.chrome()
browser = webdriver.PhantomJS()
browser= webdriver.Safari()
'''
# 使用get方法让WebDriver打开指定的URL,这里是Bilibili的主页。
driver.get('https://www.ptpress.com.cn/')
# driver.get('https://www.baidu.com/')
# input函数在这里用来暂停脚本的执行,直到用户按下回车键。
# 这样做是为了让用户能够观察到浏览器窗口中的结果
input('按回车退出...')
time.sleep(1)
运行结果:

实战案例2:模拟搜索行为
这个案例模拟了用户在搜索框输入关键词并点击搜索按钮的完整流程,是自动化交互的典型代表。
'''向网页中输入文字并开始搜索'''
from selenium import webdriver
from selenium.webdriver.edge.service import Service
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
service = Service(executable_path="./msedgedriver.exe") # 相对路径
driver = webdriver.Edge(service=service)
driver.get('http://www.bilibili.com') # 打开bilibili
driver. find_element(by=By.TAG_NAME, value="input").send_keys("Python"+ Keys.ENTER)
#Keys.RETURN 用于模拟按下回车键
input("按回车退出...")
运行结果:
[AFFILIATE_SLOT_2]
实战案例3:批量下载图片资源
这个进阶案例结合了Selenium的页面元素查找、循环操作以及requests库的文件下载功能,展示了如何解决更复杂的实际需求。
import requests
import os
import time
if not os.path.exists("./迪丽热巴1"):
os.mkdir("./迪丽热巴1")
# 批量化下载网页资源
from selenium import webdriver
from selenium.webdriver.edge.service import Service
from selenium.webdriver.common.by import By
service = Service(executable_path="./msedgedriver.exe") # 相对路径
driver = webdriver.Edge(service=service)
driver.get('https://image.baidu.com/search/index?tn=baiduimage&ie=utf-8&word=热巴') # 执行JavaScript滚动操作
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
time.sleep(5)
img_list=driver.find_elements(By.XPATH, value="//img[@class='img_7rRSL']")
i=1
for img in img_list:
# 获取图片的src属性
img_url = img.get_attribute("src")
img_data = requests.get(img_url)
# 保存图片到文件
with open(f"./迪丽热巴1/{i}.png", 'wb') as f:
f.write(img_data.content)
i += 1
六、常见问题与排查指南
在使用requests和Selenium的过程中,你可能会遇到各种问题。下表总结了一些常见错误及其解决方案,帮助你快速排错。
| 问题 | 解决方案 |
|---|---|
| 检查 Driver 是否放入系统 PATH,或使用 指定路径 | |
| 升级/降级 ChromeDriver 至匹配浏览器版本 | |
| 启动后立即闪退 | 添加 前加 调试 |
| 中文乱码或编码错误 | 在脚本开头添加 |
总结
通过本文的学习,你已经掌握了Python爬虫进阶的两把利剑:requests.post()用于处理需要提交数据的交互,而Selenium则专门攻克JavaScript动态渲染的页面。两者结合使用,能极大地扩展爬虫的能力边界。记住,requests轻量高效,适用于API和简单表单;Selenium功能强大但资源消耗大,适用于复杂交互和动态内容。在实际项目中,根据目标网站的特点灵活选择或组合使用这两种技术,是成为一名高效爬虫工程师的关键。合理使用这些工具,并始终遵守网站的robots.txt规则和法律法规,才能让技术创造价值。
post()get()Content-Type: application/x-www-form-urlencodedjson=requestsContent-Type: application/jsonmultipart/form-datachromedrivergeckodriverWebDriverException: Message: 'chromedriver' executable not in PATHService()This version of ChromeDriver only supports Chrome version XXdriver.quit()input("按回车退出...")# -*- coding: utf-8 -*-
浙公网安备 33010602011771号