一、Selenium简介
Selenium是一个强大的Web自动化测试工具,最初是为网站自动化测试而开发的。它能够模拟真实用户操作浏览器,支持多种主流浏览器包括Chrome、Firefox、Safari等。随着技术的发展,Selenium也被广泛应用于网络数据采集领域,特别是针对动态网页的数据抓取。
二、动态网页与静态网页
2.1 静态网页
静态网页是指存放在服务器文件系统中的实际HTML文件。当用户请求页面时,服务器直接返回这个HTML文件。特点是:
-
URL后缀通常为.html、.htm、.shtml等
-
内容固定不变,除非手动修改源代码
-
处理简单,直接请求即可获取全部内容
2.2 动态网页
动态网页是服务器根据请求动态生成的HTML页面,特点是:
-
URL后缀通常为.asp、.jsp、.php等
-
常包含"?"参数标志
-
内容会根据时间、用户、数据库状态等变化
动态网页技术主要包括:
2.2.1 JavaScript
JavaScript可以为网页添加各种动态功能,动态创建HTML内容。例如:
<script type="text/javascript" src="example.js"></script>
2.2.2 Ajax
Ajax技术可以在不重新加载整个页面的情况下更新部分内容,实现异步数据加载。
2.2.3 DHTML
DHTML是HTML、CSS和JavaScript的整合,用于创建交互式动态效果。
2.3 动态网页处理方法
-
直接破解JavaScript代码
-
抓包分析,伪造请求
-
使用浏览器引擎直接获取渲染后的内容(推荐)
三、Selenium基础
3.1 工作原理
Selenium通过WebDriver API控制浏览器驱动,进而操作浏览器。Python → Selenium → 浏览器驱动 → 浏览器。
3.2 环境配置
-
安装浏览器(Chrome/Firefox)
-
下载对应浏览器驱动
-
将驱动放到Python安装目录
-
安装Selenium库:
pip install selenium
3.3 快速入门
from selenium import webdriver
driver = webdriver.Chrome()
url = 'https://www.baidu.com/'
driver.get(url)
driver.quit()
四、浏览器操作
4.1 常用方法
-
driver.get('url')
:访问URL -
driver.page_source
:获取页面HTML -
driver.get_cookies()
:获取Cookies -
driver.current_url
:获取当前URL -
driver.maximize_window()
:最大化窗口 -
driver.close()
:关闭当前标签页 -
driver.quit()
:退出浏览器
4.2 页面等待
-
强制等待:
time.sleep(5)
-
隐式等待:
driver.implicitly_wait(5) #隐式等待5秒
4.3 导航控制
-
driver.back()
:后退 -
driver.forward()
:前进
五、元素定位与操作
5.1 定位单个元素
from selenium.webdriver.common.by import By
# 通过ID定位
element = driver.find_element(By.ID, 'id_value')
# 通过name定位
element = driver.find_element(By.NAME, 'name_value')
# 通过class定位
element = driver.find_element(By.CLASS_NAME, 'class_value')
# 通过标签文本定位(精确)
element = driver.find_element(By.LINK_TEXT, 'link_text')
# 通过XPath定位
element = driver.find_element(By.XPATH, 'xpath_expression')
# 通过CSS选择器定位
element = driver.find_element(By.CSS_SELECTOR, 'css_selector')
5.2 定位多个元素
将find_element
改为find_elements
,返回元素列表。
5.3 元素操作
-
element.send_keys('text')
:输入文本 -
element.click()
:点击元素 -
element.text
:获取文本 -
element.get_attribute('attr')
:获取属性值
六、Selenium进阶技巧
6.1 处理嵌套网页(iframe)
# 通过索引切换
driver.switch_to.frame(0)
# 通过元素切换
iframe = driver.find_element(By.CSS_SELECTOR, '#iframe_id')
driver.switch_to.frame(iframe)
# 切换回主文档
driver.switch_to.default_content()
6.2 执行JavaScript
# 滚动到页面底部
js = 'document.documentElement.scrollTop = document.documentElement.scrollHeight'
driver.execute_script(js)
6.3 鼠标动作链
from selenium.webdriver import ActionChains
action = ActionChains(driver)
action.drag_and_drop(source_element, target_element)
action.perform()
6.4 键盘操作
from selenium.webdriver.common.keys import Keys
element.send_keys(Keys.CONTROL, 'a') # 全选
element.send_keys(Keys.CONTROL, 'c') # 复制
element.send_keys(Keys.ENTER) # 回车
6.5 处理下拉框
from selenium.webdriver.support.select import Select
select = Select(driver.find_element(By.ID, 'select_id'))
select.select_by_index(1) # 通过索引
select.select_by_value('value') # 通过value
select.select_by_visible_text('text') # 通过可见文本
6.6 处理弹窗
alert = driver.switch_to.alert
print(alert.text) # 获取文本
alert.accept() # 确认
alert.dismiss() # 取消
6.7 无头模式
from selenium.webdriver.chrome.options import Options
chrome_options = Options()
chrome_options.add_argument('--headless') # 无头模式
driver = webdriver.Chrome(options=chrome_options)
6.8 绕过检测
driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
"source": """
Object.defineProperty(navigator, 'webdriver', {
get: () => undefined
})
"""
})
七、反爬虫与应对策略
-
User-Agent检测:随机更换User-Agent
-
IP限制:使用代理IP池
-
请求频率:随机延迟请求
-
验证码:OCR识别或手动输入
-
动态令牌:使用Selenium直接渲染页面
八、总结
Selenium作为强大的浏览器自动化工具,不仅适用于Web测试,也是处理动态网页数据采集的利器。从基础的元素定位到高级的浏览器控制,Selenium提供了完整的解决方案。掌握这些技巧,可以应对大多数Web自动化需求,但使用时也应注意遵守网站的使用条款。
通过本文的介绍,相信你已经对Selenium有了全面的了解。实际应用中,还需要结合具体场景灵活运用这些技术,并不断学习新的反反爬策略以应对日益复杂的Web环境。