如何用Python结合selenium和requests实现动态网页抓取

来源:个人站长作者:澳门程序员头衔:程序员
导读:本期聚焦于小伙伴创作的《如何用Python结合selenium和requests实现动态网页抓取》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《如何用Python结合selenium和requests实现动态网页抓取》有用,将其分享出去将是对创作者最好的鼓励。

动态网页的内容通常由JavaScript在页面加载完成后动态渲染生成,直接使用requests库发送HTTP请求只能获取到初始的HTML骨架,无法拿到动态加载的业务数据。selenium可以驱动真实浏览器执行JS完成页面渲染,能获取到完整的页面内容,但浏览器实例的启动和运行会消耗较多资源,批量抓取时效率偏低。将两者结合使用,可以先用selenium处理需要JS渲染的部分,再提取关键参数用requests发起高效请求,兼顾数据获取能力和抓取效率。

如何用Python结合selenium和requests实现动态网页抓取

核心实现思路

结合selenium和requests的抓取流程主要分为三个步骤:

  • 使用selenium启动浏览器,访问目标动态网页,等待页面JS渲染完成,获取渲染后的页面内容或者关键请求参数
  • 分析页面动态加载数据的请求规律,提取请求URL、请求头、请求参数等关键信息
  • 使用requests携带提取到的参数发起请求,直接获取动态加载的接口数据,避免重复启动浏览器渲染

环境准备

首先需要安装对应的依赖库,同时准备好对应浏览器的驱动程序:

# 安装依赖库
pip install selenium requests
# 以Chrome浏览器为例,需要下载对应版本的chromedriver,放到系统PATH路径下

完整实现示例

以下示例以某个动态加载商品列表的页面为例,演示结合使用的完整过程:

步骤1:用selenium获取渲染后的页面和关键参数

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time

# 初始化Chrome浏览器选项,设置无头模式提升效率
options = webdriver.ChromeOptions()
options.add_argument('--headless')
options.add_argument('--disable-gpu')

# 启动浏览器
driver = webdriver.Chrome(options=options)
# 访问目标动态网页
driver.get('http://ipipp.com/dynamic-page')
# 等待页面动态内容加载完成,最多等待10秒
wait = WebDriverWait(driver, 10)
wait.until(EC.presence_of_element_located((By.CLASS_NAME, 'goods-item')))

# 获取页面的cookies,后续requests请求需要携带
cookies = driver.get_cookies()
# 获取动态加载接口的请求参数,这里假设参数在页面的某个隐藏input中
token = driver.find_element(By.ID, 'dynamic-token').get_attribute('value')
# 关闭浏览器
driver.quit()

# 将selenium获取的cookies转换为requests可用的格式
requests_cookies = {cookie['name']: cookie['value'] for cookie in cookies}

步骤2:用requests发起接口请求获取数据

import requests
import json

# 动态加载数据的接口URL,通过浏览器开发者工具抓包获取
api_url = 'http://ipipp.com/api/goods/list'
# 构造请求头,复制浏览器真实的请求头内容
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',
    'Referer': 'http://ipipp.com/dynamic-page',
    'Content-Type': 'application/json'
}
# 构造请求参数
payload = {
    'page': 1,
    'page_size': 20,
    'token': token
}

# 发起POST请求,携带cookies和参数
response = requests.post(
    url=api_url,
    headers=headers,
    cookies=requests_cookies,
    data=json.dumps(payload)
)

# 解析返回的JSON数据
if response.status_code == 200:
    data = response.json()
    print('成功获取动态加载的商品数据:', data)
else:
    print('请求失败,状态码:', response.status_code)

注意事项

  • 浏览器驱动版本需要和本地安装的浏览器版本匹配,否则会出现启动失败的问题
  • 如果目标网站有反爬机制,可以在selenium中设置更多的浏览器参数,比如禁用自动化特征标识,避免被检测
  • requests请求时尽量还原真实浏览器的请求头、cookies等信息,降低被拦截的概率
  • 不需要重复渲染的页面,尽量复用提取到的参数发起requests请求,减少selenium的使用次数,提升整体效率

常见问题解答

selenium获取到的cookies可以直接给requests用吗

不能直接使用,selenium返回的cookies是字典列表格式,需要转换成key:value的字典格式,requests才能正确识别携带。

如何判断动态数据是通过哪个接口加载的

打开浏览器的开发者工具,切换到Network面板,勾选XHR和Fetch选项,刷新页面后就能看到动态加载的请求,查看请求的Response内容即可确认是否为目标数据的接口。

Pythonseleniumrequests动态网页抓取修改时间:2026-07-05 20:51:22

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。