🔹 Selenium 自动化环境安装及各版本差异
Selenium 是一个强大的自动化测试工具,支持多种浏览器。不同版本之间存在一些差异,了解这些差异有助于我们更好地选择和使用。首先,我们需要安装 Selenium 库和对应的浏览器 WebDriver。
python
# 安装最新版本的 Selenium
pip install selenium
# 下载对应浏览器的 WebDriver
# 例如 ChromeDriver
Selenium 4 引入了许多新特性,如 DevTools 支持,增强的窗口处理等,而 Selenium 3 则更加稳定和广泛应用。
🔹 Selenium 选择元素
在 Selenium 中,选择元素是自动化测试的核心。我们可以使用不同的选择器来定位元素,包括 ID、Class、CSS 和 XPath 选择器。
🔹 ID选择器
ID选择器是最常用的选择器之一,它根据元素的唯一 ID 属性定位。
python
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('https://example.com')
element = driver.find_element_by_id('element_id')
🔹 Class选择器
Class选择器根据元素的 class 属性定位,可以用于选择具有相同 class 的多个元素。
python
element = driver.find_element_by_class_name('element_class')
🔹 CSS选择器
CSS选择器更加灵活,可以结合多种条件定位元素,非常适合复杂的选择需求。
python
element = driver.find_element_by_css_selector('.element_class')
🔹 XPath选择器
XPath 是最强大的选择器,可以通过元素的各种属性进行定位,适用于结构复杂的网页。
python
element = driver.find_element_by_xpath('//div[@id="element_id"]')
🔹 Selenium 被监测的特征与绕过方法
Selenium 的行为容易被一些网站检测到,通过一些方法可以绕过这些监测。例如,我们可以通过禁用 AutomationControlled
特性来减少被检测的概率。
python
options = webdriver.ChromeOptions()
options.add_argument('--disable-blink-features=AutomationControlled')
driver = webdriver.Chrome(options=options)
🔹 Selenium 浏览器操作
在进行自动化操作时,浏览器的各种操作是必不可少的,包括切换 iframe、窗口,滚动页面,前进和后退等。
🔹 切换iframe
iframe 是嵌入在页面中的子页面,通过 switch_to.frame
方法可以切换到指定的 iframe。
python
driver.switch_to.frame('iframe_name')
🔹 切换窗口
当页面打开多个窗口时,可以使用 window_handles
列表获取所有窗口的句柄,并通过 switch_to.window
方法在不同窗口之间切换。
python
driver.switch_to.window(driver.window_handles[1])
🔹 滚动页面
通过执行 JavaScript 代码,可以实现页面的滚动操作。
python
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
🔹 前进与后退
使用 back
和 forward
方法可以实现浏览器的后退和前进操作。
python
driver.back()
driver.forward()
🔹 页面冻结与弹窗处理
页面冻结和弹窗处理是自动化操作中的常见问题。页面冻结可以通过显式等待来处理,而弹窗则需要使用 switch_to.alert
方法进行处理。
python
# 页面冻结处理
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"))
)
# 弹窗处理
alert = driver.switch_to.alert
alert.accept()
🔹 单选、多选与下拉选择框
在表单自动化中,处理单选按钮、多选框和下拉选择框是常见的操作。
python
# 单选按钮
radio_button = driver.find_element_by_id('radio_button_id')
radio_button.click()
# 多选框
checkbox = driver.find_element_by_id('checkbox_id')
checkbox.click()
# 下拉选择框
from selenium.webdriver.support.ui import Select
select = Select(driver.find_element_by_id('select_id'))
select.select_by_value('value1')
🔹 隐性等待与显式等待
隐性等待和显式等待是处理动态加载页面的常用方法。隐性等待在查找元素时等待固定时间,而显式等待则等待特定条件的满足。
python
# 隐性等待
driver.implicitly_wait(10)
# 显式等待
element = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.ID, "element_id"))
)
🔹 Selenium 模拟登录与 cookie 处理
通过 Selenium 可以模拟用户登录操作,并获取 cookie 进行后续的数据抓取。
python
driver.get('https://example.com/login')
username = driver.find_element_by_id('username')
password = driver.find_element_by_id('password')
login_button = driver.find_element_by_id('login')
username.send_keys('myusername')
password.send_keys('mypassword')
login_button.click()
# 获取 cookie
cookies = driver.get_cookies()
print(cookies)
# 结合 requests 进行数据抓取
import requests
s = requests.Session()
for cookie in cookies:
s.cookies.set(cookie['name'], cookie['value'])
response = s.get('https://example.com/protected_page')
print(response.text)
🔹 Selenium 采集项目实战
最后,通过一个完整的代码示例,展示了从登录、数据抓取到数据保存的完整流程。
python
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
import time
options = webdriver.ChromeOptions()
options.add_argument('--disable-blink-features=AutomationControlled')
driver = webdriver.Chrome(options=options)
driver.get('https://example.com')
# 模拟登录
driver.find_element_by_id('username').send_keys('myusername')
driver.find_element_by_id('password').send_keys('mypassword')
driver.find_element_by_id('login').click()
# 等待页面加载完成
WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.ID, 'data_container'))
)
# 获取数据
data_elements = driver.find_elements_by_class_name('data_class')
data = [element.text for element in data_elements]
# 数据处理和保存
with open('data.txt', 'w') as f:
for item in data:
f.write("%s\n" % item)
driver.quit()
通过以上详细的介绍和代码示例,希望你能够更好地理解和应用 Selenium 进行网页数据采集,并实现数据的自动化处理与展示!🚀