非常好 👍 我们今天来学习 Python Web Crawler(第8课)——Selenium 的使用。
这一章是从“静态爬虫”迈向“动态爬虫”的关键节点。
🕷️ Python Web Crawler(8)——Selenium 的使用
一、Selenium 是什么?
🔹 Selenium 是一个 Web 自动化测试工具,能像人一样操作浏览器:
- 打开网页
- 点击按钮
- 输入文本
- 滚动页面
- 抓取网页中由 JavaScript 动态生成的数据
📍 对于普通的 requests
爬虫无法直接访问的 动态网站(如需要登录、点击“加载更多”的网页),Selenium 是最佳解决方案。
二、安装 Selenium 与浏览器驱动
1️⃣ 安装 Selenium 库
pip install selenium
2️⃣ 安装浏览器驱动
浏览器 | 驱动程序 | 获取方式 |
---|---|---|
Chrome | chromedriver | 自动下载(推荐)或手动下载 |
Edge | msedgedriver | Edge 官方网站 |
Firefox | geckodriver | Mozilla 官方网站 |
推荐使用 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()
五、网页元素定位与操作
定位方式 | 示例 | 方法 |
---|---|---|
按ID | driver.find_element("id", "username") | 唯一标识 |
按Name | driver.find_element("name", "q") | 常见于表单 |
按Class | driver.find_element("class name", "btn") | 多元素可重复 |
按Tag | driver.find_elements("tag name", "a") | 获取多个元素 |
按XPath | driver.find_element("xpath", "//div[@id='main']/a") | 强大、灵活 |
按CSS Selector | driver.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 调试技巧
操作 | 示例代码 |
---|---|
获取当前URL | driver.current_url |
前进/后退 | driver.back() , driver.forward() |
切换窗口 | driver.switch_to.window(driver.window_handles[1]) |
执行 JS | driver.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课)
发表回复