Selenium 自动化环境安装及各版本差异

Selenium 是一个强大的自动化测试工具,支持多种浏览器。不同版本之间存在一些差异,了解这些差异有助于我们更好地选择和使用。首先,我们需要安装 Selenium 库和对应的浏览器 WebDriver。

# 安装最新版本的 Selenium
pip install selenium

# 下载对应浏览器的 WebDriver
# 例如 ChromeDriver

Selenium 4 引入了许多新特性,如 DevTools 支持,增强的窗口处理等,而 Selenium 3 则更加稳定和广泛应用。


Selenium 选择元素

在 Selenium 中,选择元素是自动化测试的核心。我们可以使用不同的选择器来定位元素,包括 ID、Class、CSS 和 XPath 选择器。

ID选择器

ID选择器是最常用的选择器之一,它根据元素的唯一 ID 属性定位。

from selenium import webdriver

driver = webdriver.Chrome()
driver.get('https://example.com')

element = driver.find_element_by_id('element_id')

Class选择器

Class选择器根据元素的 class 属性定位,可以用于选择具有相同 class 的多个元素。

element = driver.find_element_by_class_name('element_class')

CSS选择器

CSS选择器更加灵活,可以结合多种条件定位元素,非常适合复杂的选择需求。

element = driver.find_element_by_css_selector('.element_class')

XPath选择器

XPath 是最强大的选择器,可以通过元素的各种属性进行定位,适用于结构复杂的网页。

element = driver.find_element_by_xpath('//div[@id="element_id"]')

Selenium 被监测的特征与绕过方法

Selenium 的行为容易被一些网站检测到,通过一些方法可以绕过这些监测。例如,我们可以通过禁用 AutomationControlled 特性来减少被检测的概率。

options = webdriver.ChromeOptions()
options.add_argument('--disable-blink-features=AutomationControlled')
driver = webdriver.Chrome(options=options)

Selenium 浏览器操作

在进行自动化操作时,浏览器的各种操作是必不可少的,包括切换 iframe、窗口,滚动页面,前进和后退等。

切换iframe

iframe 是嵌入在页面中的子页面,通过 switch_to.frame 方法可以切换到指定的 iframe。

driver.switch_to.frame('iframe_name')

切换窗口

当页面打开多个窗口时,可以使用 window_handles 列表获取所有窗口的句柄,并通过 switch_to.window 方法在不同窗口之间切换。

driver.switch_to.window(driver.window_handles[1])

滚动页面

通过执行 JavaScript 代码,可以实现页面的滚动操作。

driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")

前进与后退

使用 backforward 方法可以实现浏览器的后退和前进操作。

driver.back()
driver.forward()

页面冻结与弹窗处理

页面冻结和弹窗处理是自动化操作中的常见问题。页面冻结可以通过显式等待来处理,而弹窗则需要使用 switch_to.alert 方法进行处理。

# 页面冻结处理
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()

单选、多选与下拉选择框

在表单自动化中,处理单选按钮、多选框和下拉选择框是常见的操作。

# 单选按钮
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')

隐性等待与显式等待

隐性等待和显式等待是处理动态加载页面的常用方法。隐性等待在查找元素时等待固定时间,而显式等待则等待特定条件的满足。

# 隐性等待
driver.implicitly_wait(10)

# 显式等待
element = WebDriverWait(driver, 10).until(
    EC.presence_of_element_located((By.ID, "element_id"))
)

Selenium 模拟登录与 cookie 处理

通过 Selenium 可以模拟用户登录操作,并获取 cookie 进行后续的数据抓取。

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 采集项目实战

最后,通过一个完整的代码示例,展示了从登录、数据抓取到数据保存的完整流程。

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 进行网页数据采集,并实现数据的自动化处理与展示!

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部