标签:#Python爬虫 #Selenium #动态爬虫 #JS渲染 #Ajax数据爬取
前言
前面我们学的 requests + bs4 爬虫,只能爬取静态源码页面。
但现在90%的现代网站都是JS动态渲染:滚动加载、点击刷新、Ajax异步请求数据。
你用requests请求源码,只能拿到一堆空壳HTML,看不到真实文本、列表、图片数据,这也是新手爬虫最大的瓶颈!
想要彻底解决动态页面爬取,必须掌握 Selenium。
它是一款自动化浏览器工具,直接启动真实浏览器,模拟人工打开页面、等待加载、点击、滚动,百分百还原真人浏览行为,能拿到浏览器最终渲染完成的完整数据,专治各种JS动态反爬!
本篇零基础保姆教程,从环境配置、基础用法、等待机制、元素定位、实战爬取全覆盖,学完搞定所有动态网页!
一、为什么requests抓不到动态数据?零基础秒懂
1、静态页面流程
请求网址 → 服务器直接返回完整HTML源码 → 直接解析数据
2、动态页面(Ajax/JS)流程
请求网址 → 返回空壳HTML → 浏览器自动执行JS代码 → 后台异步请求接口 → 渲染生成最终页面数据
核心问题:requests只拿到第一步的空源码,无法等待JS执行和异步加载,所以数据为空。
Selenium解决方案:启动真实浏览器,自动等待页面渲染完成,直接抓取最终展示页面的数据。
二、Selenium环境一键配置(最新版)
Selenium最大优势:新版无需手动下载驱动!自动适配浏览器版本。
1、安装库
pip install selenium -i https://pypi.douban.com/simple/2、核心特性(新版4.0+)
✅ 内置驱动自动适配,无需手动配置ChromeDriver
✅ 兼容Chrome、Edge、Firefox主流浏览器
✅ 支持智能等待、元素定位、模拟人工操作
三、最简入门:启动浏览器+打开网页
零基础第一行Selenium代码,启动Chrome浏览器访问网页。
from selenium import webdriverfrom selenium.webdriver.chrome.options import Options# 配置浏览器参数chrome_options = Options()# 可选:关闭浏览器自动测试提示(防反爬)chrome_options.add_experimental_option("excludeSwitches", ["enable-automation"])chrome_options.add_experimental_option("useAutomationExtension", False)# 初始化谷歌浏览器driver = webdriver.Chrome(options=chrome_options)# 设置页面加载超时时间driver.set_page_load_timeout(10)# 打开目标网址driver.get("https://www.baidu.com")# 打印页面渲染完成后的源码(可直接解析动态数据)print(driver.page_source)# 关闭浏览器driver.quit()
核心区别:driver.page_source 获取的是JS渲染完成后的最终源码,和你肉眼看到的网页完全一致!
四、无头模式(后台静默爬取,不弹出浏览器)
日常批量爬取不需要弹出浏览器窗口,开启无头模式,后台静默运行,节省资源、速度更快。
from selenium import webdriverfrom selenium.webdriver.chrome.options import Optionschrome_options = Options()# 开启无头模式(无界面运行)chrome_options.add_argument("--headless=new")chrome_options.add_experimental_option("excludeSwitches", ["enable-automation"])chrome_options.add_experimental_option("useAutomationExtension", False)driver = webdriver.Chrome(options=chrome_options)driver.get("https://www.baidu.com")print("页面标题:", driver.title)driver.quit()
实战建议:调试代码时关闭无头(看窗口),正式批量爬取开启无头(静默运行)。
五、重中之重:智能等待(彻底解决数据加载不全)
新手90%的Selenium报错,都是因为代码跑得比网页快,元素还没加载出来就开始抓取,导致报错/空数据。
Selenium三种等待方式(必掌握)
1、强制等待(简单粗暴)
import time# 强制等待2秒,等待页面加载time.sleep(2)
2、隐式等待(全局通用)
# 全局设置:最长等待5秒,元素加载完成立即执行driver.implicitly_wait(5)
3、显式等待(精准推荐,项目首选)
针对某个具体元素等待,加载成功立即执行,效率最高,适配所有动态页面。
from selenium.webdriver.common.by import Byfrom selenium.webdriver.support.ui import WebDriverWaitfrom selenium.webdriver.support import expected_conditions as EC# 等待10秒,直到指定元素加载完成WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.CLASS_NAME, "item-list")))
六、八大元素定位方法(精准抓取动态数据)
Selenium核心:精准定位网页元素,提取文本、属性、内容。
from selenium.webdriver.common.by import By常用定位方式
✅ By.ID:根据id定位(最精准、唯一)
✅ By.CLASS_NAME:根据类名定位
✅ By.XPATH:万能定位,适配所有复杂元素(重点掌握)
✅ By.LINK_TEXT:精准匹配链接文本
✅ By.PARTIAL_LINK_TEXT:模糊匹配链接文本
数据提取方法
# 获取元素文本内容element.text# 获取链接href属性element.get_attribute("href")# 获取图片src地址element.get_attribute("src")
七、实战:动态网页完整爬取案例
实现:打开动态页面 → 智能等待加载 → 批量提取动态渲染的标题、链接 → 数据打印输出。
from selenium import webdriverfrom selenium.webdriver.chrome.options import Optionsfrom selenium.webdriver.common.by import Byfrom selenium.webdriver.support.ui import WebDriverWaitfrom selenium.webdriver.support import expected_conditions as ECimport time# 浏览器配置chrome_options = Options()chrome_options.add_experimental_option("excludeSwitches", ["enable-automation"])chrome_options.add_experimental_option("useAutomationExtension", False)def crawl_dynamic_page(url):# 初始化浏览器driver = webdriver.Chrome(options=chrome_options)driver.implicitly_wait(5)try:# 打开页面driver.get(url)# 精准等待列表元素加载完成WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.CLASS_NAME, "news-item")))# 获取所有动态渲染的列表数据item_list = driver.find_elements(By.CLASS_NAME, "news-item")print(f"✅ 成功加载{len(item_list)}条动态数据")# 遍历提取数据for index, item in enumerate(item_list, 1):title = item.text.strip()link = item.find_element(By.TAG_NAME, "a").get_attribute("href")print(f"{index}. 标题:{title}")print(f" 链接:{link}\n")except Exception as e:print("❌ 爬取异常:", e)finally:# 关闭浏览器driver.quit()# 执行爬取if __name__ == "__main__":target_url = "此处替换为动态网页地址"crawl_dynamic_page(target_url)
八、进阶模拟操作(真人行为)
Selenium不仅能爬数据,还能模拟人工操作,突破更多动态反爬:
1、输入内容
driver.find_element(By.ID, "username").send_keys("账号")2、点击按钮
driver.find_element(By.ID, "submit-btn").click()3、滚动页面(加载更多数据)
# 滚动到页面底部driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")time.sleep(1)
4、清空输入框
element.clear()九、新手高频踩坑总结
1、不等待直接抓取
动态页面必须加等待!优先用显式等待,禁止裸跑代码,否则100%报错空数据。
2、混淆find_element与find_elements
find_element:获取单个元素,找不到直接报错 find_elements:获取元素列表,找不到返回空列表,不会崩溃
3、浏览器自动被检测
必须关闭自动化提示,规避基础反爬检测。
4、运行完不关闭浏览器
必须用driver.quit()关闭,否则会残留大量后台进程,占用内存。
5、过度使用强制等待
time.sleep效率极低,优先使用隐式/显式智能等待。
文末结语
至此,你已经掌握爬虫两大核心体系:
✅ 静态爬虫:requests + bs4(高效快速、轻量)
✅ 动态爬虫:Selenium自动化浏览器(万能适配、通杀动态页面)
Selenium是爬虫进阶的必经之路,彻底解决动态数据加载难题,也是自动化测试、脚本开发的核心技能。
本篇所有代码可直接复制运行,适配99%的JS动态渲染网站,建议收藏反复实操!