当前位置:首页>python>Python爬虫零基础实战⑤:Selenium自动化浏览器爬虫,完美破解JS动态渲染、Ajax异步加载数据,搞定requests抓不到的页面

Python爬虫零基础实战⑤:Selenium自动化浏览器爬虫,完美破解JS动态渲染、Ajax异步加载数据,搞定requests抓不到的页面

  • 2026-09-30 09:42:23
Python爬虫零基础实战⑤:Selenium自动化浏览器爬虫,完美破解JS动态渲染、Ajax异步加载数据,搞定requests抓不到的页面

标签:#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动态渲染网站,建议收藏反复实操!

最新文章

随机文章