Selenium 爬虫实战:从环境搭建到自动化采集

🔹 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);")

🔹 前进与后退

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

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 进行后续的数据抓取。

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

相关推荐
向往风的男子1 分钟前
【devops】devops-ansible之介绍和基础使用
运维·ansible·devops
她最爱橘了8 分钟前
AppStore评论爬虫
爬虫·python·gui·pyside6
没枕头我咋睡觉9 分钟前
【大语言模型_1】VLLM部署Qwen模型
python·语言模型
lkasi29 分钟前
python文字转wav音频
开发语言·python
qq_433716951 小时前
UI自动化测试的边界怎么定义?
自动化测试·软件测试·测试工具·jmeter·ui·接口测试·postman
Bruce小鬼1 小时前
最新版本TensorFlow训练模型TinyML部署到ESP32入门实操
人工智能·python·tensorflow
xiaojiesec1 小时前
第159天:安全开发-Python-协议库爆破&FTP&SSH&Redis&SMTP&MYSQL等
运维·安全·ssh
技术不支持1 小时前
WSL2+Ubuntu 22.04搭建Qt开发环境+中文输入法
linux·运维·服务器·qt·ubuntu
木人舟1 小时前
以root用户登陆ubuntu的桌面环境
linux·运维·ubuntu