非常好 👍 我们今天来学习 Python Web Crawler(第8课)——Selenium 的使用
这一章是从“静态爬虫”迈向“动态爬虫”的关键节点。


🕷️ Python Web Crawler(8)——Selenium 的使用

一、Selenium 是什么?

🔹 Selenium 是一个 Web 自动化测试工具,能像人一样操作浏览器:

  • 打开网页
  • 点击按钮
  • 输入文本
  • 滚动页面
  • 抓取网页中由 JavaScript 动态生成的数据

📍 对于普通的 requests 爬虫无法直接访问的 动态网站(如需要登录、点击“加载更多”的网页),Selenium 是最佳解决方案。


二、安装 Selenium 与浏览器驱动

1️⃣ 安装 Selenium 库

pip install selenium

2️⃣ 安装浏览器驱动

浏览器驱动程序获取方式
Chromechromedriver自动下载(推荐)或手动下载
EdgemsedgedriverEdge 官方网站
FirefoxgeckodriverMozilla 官方网站

推荐使用 Chrome + webdriver-manager(自动管理驱动):

pip install webdriver-manager


三、基础示例:打开网页并截图

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager

# 启动浏览器
driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()))

# 打开网页
driver.get("https://www.python.org")

# 获取网页标题
print(driver.title)

# 截图保存
driver.save_screenshot("python_org.png")

# 关闭浏览器
driver.quit()

✅ 效果:自动启动 Chrome → 打开 Python 官网 → 截图 → 退出。


四、无头模式(不弹出浏览器)

无头模式常用于服务器环境或批量爬虫。

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.chrome.service import Service

options = Options()
options.add_argument("--headless")       # 无界面模式
options.add_argument("--disable-gpu")    # 关闭GPU加速
options.add_argument("--window-size=1920,1080")

driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=options)

driver.get("https://example.com")
print(driver.title)
driver.quit()


五、网页元素定位与操作

定位方式示例方法
按IDdriver.find_element("id", "username")唯一标识
按Namedriver.find_element("name", "q")常见于表单
按Classdriver.find_element("class name", "btn")多元素可重复
按Tagdriver.find_elements("tag name", "a")获取多个元素
按XPathdriver.find_element("xpath", "//div[@id='main']/a")强大、灵活
按CSS Selectordriver.find_element("css selector", "div#main > a.link")推荐方式

示例:自动搜索并抓取结果

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
import time

driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()))
driver.get("https://www.google.com")

# 搜索“Python Selenium”
search_box = driver.find_element(By.NAME, "q")
search_box.send_keys("Python Selenium")
search_box.send_keys(Keys.RETURN)

time.sleep(2)

# 抓取搜索结果标题
results = driver.find_elements(By.XPATH, "//h3")
for r in results:
    print(r.text)

driver.quit()


六、处理动态加载(等待元素出现)

有些网站加载慢,必须等待元素出现。
Selenium 提供两种等待方式:

✅ 1. 强制等待

import time
time.sleep(3)  # 暂停3秒

✅ 2. 显式等待(推荐)

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

wait = WebDriverWait(driver, 10)  # 最长等10秒
element = wait.until(EC.presence_of_element_located((By.ID, "result")))


七、滚动加载页面(模拟用户滑动)

有些网站(如微博、淘宝)需要滚动加载更多内容:

import time

for i in range(5):
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
    time.sleep(2)  # 等待加载


八、提取网页源代码(结合 BeautifulSoup)

from bs4 import BeautifulSoup

html = driver.page_source
soup = BeautifulSoup(html, "html.parser")

for title in soup.select("h3"):
    print(title.get_text())


九、模拟登录网站(示例)

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
import time

driver = webdriver.Chrome()
driver.get("https://github.com/login")

driver.find_element(By.ID, "login_field").send_keys("your_username")
driver.find_element(By.ID, "password").send_keys("your_password")
driver.find_element(By.NAME, "commit").click()

time.sleep(3)
print(driver.title)
driver.quit()


🔟 Selenium + BeautifulSoup + Pandas 综合爬虫框架示例

from selenium import webdriver
from bs4 import BeautifulSoup
import pandas as pd
import time

driver = webdriver.Chrome()
driver.get("https://quotes.toscrape.com/js/")

time.sleep(3)

html = driver.page_source
soup = BeautifulSoup(html, "html.parser")

quotes = []
for q in soup.select(".quote"):
    text = q.select_one(".text").get_text()
    author = q.select_one(".author").get_text()
    quotes.append({"quote": text, "author": author})

df = pd.DataFrame(quotes)
df.to_csv("quotes.csv", index=False, encoding="utf-8-sig")
print(df.head())

driver.quit()

✅ 说明:

  • 该网站内容由 JS 动态生成
  • requests 无法直接爬取
  • Selenium 完美解决!

🔧 十一、常用 Selenium 调试技巧

操作示例代码
获取当前URLdriver.current_url
前进/后退driver.back(), driver.forward()
切换窗口driver.switch_to.window(driver.window_handles[1])
执行 JSdriver.execute_script("alert('Hello!')")
模拟点击按钮element.click()
模拟输入文字element.send_keys("text")
模拟按键from selenium.webdriver.common.keys import Keys + element.send_keys(Keys.ENTER)

✅ 十二、Selenium 的优缺点总结

优点缺点
可操作任意 JS 动态网页速度比 requests 慢
模拟真实用户行为占用内存、CPU
可用于登录、表单、滚动等复杂场景不适合超大规模爬取
支持无头模式与代理调试较复杂

💡 结论:

  • 如果目标网站是静态页面 → 用 requests + BeautifulSoup
  • 如果页面是 动态加载 / 登录后内容 / AJAX → 用 Selenium
  • 如果要 高并发爬取 → 用 aiohttp + asyncio(第9课)