欢迎来到 Python 基础入门 Day15!昨天我们学习了如何使用 requests
和 BeautifulSoup
实现 Web 爬虫,并简单提到了处理动态网页的挑战。今天,我们将深入了解如何使用 Selenium,一种可以模拟浏览器操作的工具,来应对动态网页的爬取。
目录
- 什么是 Selenium?
- 安装与环境配置
- Selenium 的基本操作
- 动态网页的处理
- 示例:爬取包含 JavaScript 动态加载的网页
- 小结与练习
一、什么是 Selenium?
Selenium 是一个强大的 Web 自动化工具,最初是为浏览器自动化测试而开发的。它的功能包括但不限于:
- 模拟用户操作(点击、输入、滚动等)。
- 等待动态内容加载。
- 操作 JavaScript 渲染的网页。
与传统爬虫工具不同,Selenium 可以直接启动浏览器(如 Chrome、Firefox),通过模拟人类行为获取动态加载的内容。
二、安装与环境配置
2.1 安装 Selenium 库
使用 pip 安装 Selenium:
pip install selenium
2.2 安装浏览器驱动
Selenium 需要与浏览器驱动配合使用。以下是 Chrome 浏览器的设置方法:
- 下载 ChromeDriver(确保版本与 Chrome 浏览器匹配)。
- 解压后,将驱动程序的路径添加到环境变量中,或者直接指定路径。
2.3 验证安装
测试代码:
from selenium import webdriver
driver = webdriver.Chrome() # 启动 Chrome 浏览器
driver.get("https://www.python.org") # 打开 Python 官网
print(driver.title) # 输出页面标题
driver.quit() # 关闭浏览器
三、Selenium 的基本操作
3.1 打开网页
driver = webdriver.Chrome()
driver.get("https://example.com")
3.2 定位元素
Selenium 提供多种方式来定位网页中的元素:
from selenium.webdriver.common.by import By
# 根据 ID 定位
element = driver.find_element(By.ID, "element_id")
# 根据类名定位
element = driver.find_element(By.CLASS_NAME, "element_class")
# 根据 XPath 定位
element = driver.find_element(By.XPATH, "//div[@class='example']")
3.3 模拟用户操作
# 输入文本
element.send_keys("Python")
# 点击按钮
button = driver.find_element(By.ID, "submit")
button.click()
3.4 等待页面加载
使用显式等待确保目标元素加载完成:
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
element = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.ID, "element_id"))
)
3.5 关闭浏览器
driver.quit()
四、动态网页的处理
4.1 滚动页面加载更多内容
对于需要滚动加载的页面(如微博、商品列表),可以使用 JavaScript 指令模拟滚动操作:
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
4.2 捕获动态生成的内容
动态网页通常由 JavaScript 渲染,内容可能需要等待加载。通过显式等待可以确保数据完整:
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
element = WebDriverWait(driver, 10).until(
EC.visibility_of_element_located((By.CSS_SELECTOR, ".dynamic-content"))
)
print(element.text)
五、示例:爬取动态加载的网页
以下示例展示了如何使用 Selenium 爬取动态加载的新闻标题:
5.1 代码实现
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
# 启动浏览器
driver = webdriver.Chrome()
driver.get("https://news.ycombinator.com/")
# 等待页面加载
WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.CLASS_NAME, "storylink"))
)
# 提取新闻标题
titles = driver.find_elements(By.CLASS_NAME, "storylink")
for title in titles:
print(title.text)
# 关闭浏览器
driver.quit()
5.2 输出结果
Show HN: New AI tool released
Open Source Python Projects
How to Learn Python Effectively
...
六、小结与练习
今天我们学习了如何使用 Selenium 处理动态网页,包括基本操作和复杂场景的处理。Selenium 是应对 JavaScript 渲染内容的强大工具,但由于需要启动浏览器,速度较慢,适合处理小规模数据爬取。
今日练习题:
- 使用 Selenium 模拟登录某个简单的网站(如博客、论坛)。
- 爬取电商网站首页的动态商品列表信息。
- 尝试爬取一个滚动加载页面的所有内容。
下一节预告:在 Day16 中,我们将探索如何将 Web 爬虫与 数据库 结合,完成数据的存储与管理。敬请期待!
希望你今天学得开心!如果有任何问题或需要进一步的解释,欢迎随时留言 😊。