前言
selenium框架是Python用于控制浏览器的技术,在Python爬虫获取页面源代码的时候,是最重要的技术之一,通过控制浏览器,更加灵活便捷的获取浏览器中网页的源代码。
还没有安装启动selenium的同志请先看我的上一篇文章进行配置启动 和 XPath基础
对selenium进行浏览器和驱动进行配置Windows | Linux_使用 selenium 进行谷歌-CSDN博客
Python爬虫 XPath 三方库lxml-CSDN博客
这里就直接从基础操作进行分享
目录
selenium打开和关闭网站
在打开网站时获取网站信息常用方法
使用selenium操作浏览器的常用方法
使用XPath定位浏览器具体地方常用方法
selenium等待页面加载技术
对浏览器交互操作常用方法
模拟真人的浏览器驱动常见配置
实战案例
selenium打开和关闭网站
#初始化浏览器驱动
driver = webdriver.Chrome(service=ChromeService(ChromeDriverManager(driver_version="谷歌浏览器版本").install()))#使用浏览器驱动打开网站
driver.get("https://www.example.com")#关闭浏览器
driver.quit()
在打开网站时获取网站信息常用方法
我们的操作都是使用浏览器驱动调用的,所以获取网站的方法都是浏览器驱动对象driver调用的
#获取网站的源代码
driver.page_source#获取网站的截图
driver.save_screenshot("图片的相对路径/图片名称带图片格式")
我们在爬虫使用这个工具就是为了获取网站源码和截图,后面过滤数据有专业的相关技术
对其他方法感兴趣有空可以看他的官方文档,编程知识太多了,只学调用方法最常用的和知道内部原理,遇到使用再对调用方法进行查询使用
使用selenium操作浏览器的常用方法
selenium操作浏览器本质上就是使用XPath对浏览器的具体地方进行定位,然后使用点击事件操作
XPath定位类似于你的鼠标移动的位置
点击、下滑事件类似于你使用鼠标进行点击、下滑等操作
使用XPath定位浏览器具体地方常用方法
注意: 这里编写的XPath只能写到到元素,不能直接获取标签的属性值和内容,可以认为类似于移动鼠标,后面得到这个标签对象才能再进行处理,不然会报错
不推荐使用其他方式进行元素定位,在实战中非常复杂,也只有XPath使用起来可以应对,而且XPath也是Python爬虫数据过滤的最重要的技术,这个一定要非常熟练
from selenium.webdriver.common.by import By#这个方法只返回一个标签对象
#这里XPath只能定位到标签,不能取具体的值,不然报错
title = driver.find_element(By.XPATH,"XPath表达式")#这个方法是以集合的形式返回多个标签对象,没有标签返回空集合不会报错,遍历使用
titles = driver.find_elements(By.XPATH,"XPath表达式")#返回了Web标签对象,我们就可以对这个标签对象上面的属性值和内容进行获取了
#获取这个Web标签的内容
title.text
#获取这个Web标签中的属性值
title.get_attribute('属性名')
selenium等待页面加载技术
等待,直到获取到自己需要的web才往下执行,可以巧妙的解决网页加载时间长但是不知道设置多长等待时间的问题
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait#等待通过XPath获取的元素获取到之后再往下进行title = WebDriverWait(driver, 最长等待时间).until(EC.presence_of_element_located((By.XPATH,'XPath表达式')) )
对浏览器交互操作常用方法
前面我们已经对需要操作的元素使用XPath进行获取了,接下来我们要对这个元素进行点击、输入表单文字等操作
ActionChains是一个链式操作,一直往下点就可以了以ActionChains(浏览器驱动对象)开头
perform()提交结尾
交互操作的库
from selenium.webdriver import ActionChains# 绑定到浏览器驱动对象
actions = ActionChains(浏览器驱动对象)# 对前面使用XPath定位返回的Web元素对象进行操作# 左键点击
click(Web元素对象)# 双击
double_click(Web元素对象)# 右键点击
actions.context_click(Web元素对象)# 悬停在元素上
move_to_element(Web元素对象)# 相对当前位置移动
单位是像素
水平方向x:向右为正,向左为负
垂直方向y:向下为正,向上为负
move_by_offset(x, y)#使用鼠标从web起始元素拖拽到web目标元素
actions.drag_and_drop(web起始元素, web目标元素)#在web元素上面输入内容
send_keys(输入的内容)#中间可以加入停顿方法
pause(秒数)#提交,链式调用结尾
perform()
模拟真人的浏览器驱动常见配置
from selenium.webdriver.chrome.options import Optionsoptions = Options()
options.add_argument("user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36")
options.add_argument("--window-size=1920,1080") # 设置窗口大小
options.add_argument("--disable-blink-features=AutomationControlled") # 禁用自动化控制特征
options.add_argument("--disable-infobars") # 禁用提示条
options.add_argument("--no-sandbox") # 解决DevToolsActivePort文件不存在的报错
options.add_argument("--disable-dev-shm-usage") # 禁用共享内存
options.add_argument("--disable-extensions") # 禁用扩展
options.add_argument("--disable-gpu") # 禁用GPU加速
options.add_argument("--disable-javascript") # 禁用JavaScript(根据需求调整)
options.add_argument("--incognito") # 隐身模式
options.add_argument("--headless") # 无头模式(可选,等调试好了可以设置为无头减少资源浪费)driver = webdriver.Chrome(service=ChromeService(ChromeDriverManager(driver_version="谷歌浏览器版本").install()), options=options)
实战案例
查看淘宝详情商品,商品详情页面需要登录状态才可以查看全部内容,点击淘宝详情页面上面的一键登录进行模拟登录之后,获取到该商品详情页面的全部源代码
后面就可以使用正则表达式和XPath过滤自己需要的数据了
from selenium import webdriver
from selenium.webdriver.chrome.service import Service as ChromeService
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.common.by import By
from selenium.webdriver import ActionChains
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.support import expected_conditions as EC# selenium 4的写法
#加入一些常用元素,模拟真人环境
options = Options()
options.add_argument("user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36")
options.add_argument("--window-size=1920,1080") # 设置窗口大小
options.add_argument("--disable-blink-features=AutomationControlled") # 禁用自动化控制特征
options.add_argument("--disable-infobars") # 禁用提示条
options.add_argument("--no-sandbox") # 解决DevToolsActivePort文件不存在的报错
options.add_argument("--disable-dev-shm-usage") # 禁用共享内存
options.add_argument("--disable-extensions") # 禁用扩展
options.add_argument("--disable-gpu") # 禁用GPU加速
options.add_argument("--disable-javascript") # 禁用JavaScript(根据需求调整)
options.add_argument("--incognito") # 隐身模式#初始化浏览器驱动
driver = webdriver.Chrome(service=ChromeService(ChromeDriverManager(driver_version="谷歌浏览器版本").install()),options=options)
driver.get("淘宝的商品详情页面")#等待商品页面一键登录的按钮元素的出现就往下执行
loginHTML = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH,'//span[@class="xM6AVLCbLn--loginBtn--_3aec1d3"]')))
#点击一键登录
actions = ActionChains(driver).click(loginHTML).perform()#对登录界面的账号密码点击登录
#准备需要XPath定位的元素
usern = driver.find_element(By.XPATH,'//input[@id="fm-login-id"]')
pwd = driver.find_element(By.XPATH,'//input[@id="fm-login-password"]')
loginHb = driver.find_element(By.XPATH,'//button[@class="fm-button fm-submit password-login button-low-light"]')#使用准备号的元素对象操作浏览器登录,之间加入pause方法停顿更真实
ActionChains(driver).click(usern).pause(1).send_keys('淘宝账号').pause(0.5).perform()
ActionChains(driver).click(pwd).pause(1).send_keys('淘宝密码').pause(0.5).perform()
ActionChains(driver).click(loginHb).perform()#等待页面是否出现商品详情元素
#因为商品详情元素只有登录状态之后才有的,所以这里的效果等价于确定我浏览商品的时候已经登录完成了,后面对这个页面的源代码进行获取
resFlag = WebDriverWait(driver, 30).until(EC.presence_of_element_located((By.XPATH,'//div[@class="xM6AVLCbLn--tabDetailWrap--_3622a08"]')))
#获取页面源代码
print(driver.page_source)
#关闭谷歌浏览器
driver.quit()