郑州做网站企起,商城网站建站,免费php网站开发模板,站规划在网站建设中的作用自动化爬虫selenium 文章目录自动化爬虫selenium一#xff1a;Selenium简介1#xff1a;什么是selenium2#xff1a;安装准备二#xff1a;元素定位1#xff1a;id 定位2#xff1a;name 定位3#xff1a;class 定位4#xff1a;tag 定位5#xff1a;xpath 定位(最常用…自动化爬虫selenium 文章目录自动化爬虫selenium一Selenium简介1什么是selenium2安装准备二元素定位1id 定位2name 定位3class 定位4tag 定位5xpath 定位(最常用)6css 定位7link 定位8partial_link 定位三浏览器控制1窗口大小2浏览器前进 后退3浏览器的刷新4浏览器窗口之间切换5常用方法四鼠标操作1单击左键2单击右键3双击4拖动5鼠标悬停五键盘控制六设置元素等待1显示等待2隐式等待七定位一组元素八切换操作1窗口切换2表单切换九弹窗处理十百度自动化实例十一Chrome handless一Selenium简介
1什么是selenium
Selenium是一个用于Web应用程序测试的工具 Selenium测试直接运行在浏览器之中就像真正的用户在操作一样 支持各种的driver(火狐谷歌IEOpera)驱动真实的浏览器完成测试 支持无界面浏览器操作 可以模拟浏览器的功能自动执行网页中的JS代码实现动态的加载
2安装准备 1安装selenium pip install selenium2针对不同的浏览器需要安装不同的驱动常见的有谷歌和_Edge_ Google(https://chromedriver.storage.googleapis.com/index.html)Edge(https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/) 3查看浏览器对应的版本决定下哪个版本的驱动设置 - 关于 - 得到版本 google查看方法 edge查看方法 4复制对应的解压文件到python的文件夹和浏览器的文件夹中 5编写测试代码 from selenium import webdriverif __name__ __main__:driver webdriver.Chrome(rE:\centbrowser\chromedriver.exe)driver.get(https://www.csdn.net/)⚠️ 如果打开主页后自动关闭可以设置为不立刻关闭
from selenium import webdriverif __name__ __main__:# 不自动关闭浏览器option webdriver.ChromeOptions()option.add_experimental_option(detach, True)driver webdriver.Chrome(rE:\centbrowser\chromedriver.exe, chrome_optionsoption)driver.get(https://www.csdn.net/)二元素定位
1id 定位 标签的 id 具有唯一性就像人的身份证可以通过 id 定位到它由于 id 的唯一性我们可以不用管其他的标签的内容。
driver.find_element_by_id(2cc5a005-9926-46fb-811d-ef323d660402)2name 定位
meta namekeywords contentCSDN博客,CSDN学院,CSDN论坛,CSDN直播name 指定标签的名称在页面中可以不唯一可以使用 find_element_by_name 定位到 meta 标签。
driver.find_element_by_name(keywords)3class 定位
div classtoolbar-search-containerclass 指定标签的类名在页面中可以不唯一可以使用 find_element_by_class_name 定位到上面_html_片段的 div 标签
driver.find_element_by_class_name(toolbar-search-container)4tag 定位
div classtoolbar-search-container每个 tag 往往用来定义一类功能通过 tag 来识别某个元素的成功率很低每个页面一般都用很多相同的 tag我们可以使用 find_element_by_class_name 定位
driver.find_element_by_tag_name(div)5xpath 定位(最常用)
# 绝对路径层级关系定位
driver.find_element_by_xpath(/html/body/div/div/div/div[2]/div/div/input[1])
# 利用元素属性定位
driver.find_element_by_xpath(//*[idtoolbar-search-input]))
# 层级元素属性定位
driver.find_element_by_xpath(//div[idcsdn-toolbar]/div/div/div[2]/div/div/input[1])
# 逻辑运算符定位
driver.find_element_by_xpath(//*[idtoolbar-search-input and autocompleteoff])F12 - 右键html元素内容 - copy - copy full xpath
6css 定位
CSS 使用选择器来为页面元素绑定属性它可以较为灵活的选择控件的任意属性一般定位速度比 xpath 要快但使用起来略有难度
driver.find_element_by_css_selector(#toolbar-search-input)
driver.find_element_by_css_selector(htmlbodydivdivdivdivdivdivinput)7link 定位
div classpractice-box data-v-04f46969加入每日一练/divlink 专门用来定位文本链接使用 find_element_by_link_text 并指明标签内全部文本即可定位
driver.find_element_by_link_text(加入每日一练)8partial_link 定位
就是“部分链接”对于有些文本很长这时候就可以只指定部分文本即可定位同样使用刚才的例子
# 上面的例子使用部分链接匹配
driver.find_element_by_partial_link_text(加入)三浏览器控制
1窗口大小
webdriver 提供 set_window_size() 方法来修改浏览器窗口的大小。
from selenium import webdriver# Chrome浏览器
driver webdriver.Chrome()
driver.get(https://www.csdn.net/)# 设置浏览器浏览器的宽高为600x800
driver.set_window_size(600, 800)也可以使用 maximize_window() 方法可以实现浏览器全屏显示
from selenium import webdriver# Chrome浏览器
driver webdriver.Chrome()
driver.get(https://www.csdn.net/)# 设置浏览器浏览器的宽高为600x800
driver.maximize_window()2浏览器前进 后退
webdriver 提供 back 和 forward 方法来实现页面的后退与前进
from selenium import webdriver
from time import sleepdriver webdriver.Chrome()# 访问CSDN首页
driver.get(https://www.csdn.net/)sleep(2)#访问CSDN个人主页
driver.get(https://blog.csdn.net/qq_43965708)sleep(2)#返回后退到CSDN首页
driver.back()sleep(2)#前进到个人主页
driver.forward()第二次 get() 打开新页面时会在原来的页面打开而不是在新标签中打开。
如果想的话也可以在新的标签页中打开新的链接但需要更改一下代码执行 js 语句来打开新的标签
# 在原页面打开
driver.get(https://blog.csdn.net/qq_43965708)# 新标签中打开
js window.open(https://blog.csdn.net/qq_43965708)
driver.execute_script(js)3浏览器的刷新
# 刷新页面
driver.refresh()4浏览器窗口之间切换
我们先获取当前各个窗口的句柄这些信息的保存顺序是按照时间来的 最新打开的窗口放在数组的末尾这时我们就可以定位到最新打开的那个窗口了
# 获取打开的多个窗口句柄
windows driver.window_handles
# 切换到当前最新打开的窗口(获取句柄数组中的最后一个)
driver.switch_to.window(windows[-1])5常用方法 模拟操作 if __name__ __main__:driver webdriver.Chrome(rE:\centbrowser\chromedriver.exe)driver.get(https://www.csdn.net/)sleep(2)# 定位搜索输入框text_label driver.find_element_by_xpath(//*[idtoolbar-search-input])# 在搜索框中输入 text_label.send_keys(是小崔啊)sleep(2)button driver.find_element_by_xpath(//*[idtoolbar-search-button]/span)button.click()四鼠标操作
1单击左键
模拟完成单击鼠标左键的操作一般点击进入子页面等会用到左键不需要用到 ActionChains 。
# 定位搜索按钮
button driver.find_element_by_xpath(//*[idtoolbar-search-button]/span)
# 执行单击操作
button.click()2单击右键
单击右键需要使用 ActionChains
from selenium.webdriver.common.action_chains import ActionChains# 定位搜索按钮
button driver.find_element_by_xpath(//*[idtoolbar-search-button]/span)
# 右键搜索按钮
ActionChains(driver).context_click(button).perform()3双击
需要使用 ActionChains
# 定位搜索按钮
button driver.find_element_by_xpath(//*[idtoolbar-search-button]/span)
# 执行双击动作
ActionChains(driver).double_click(button).perform()4拖动
模拟鼠标拖动操作该操作有两个必要参数
source鼠标拖动的元素target鼠标拖至并释放的目标元素
# 定位要拖动的元素
source driver.find_element_by_xpath(xxx)
# 定位目标元素
target driver.find_element_by_xpath(xxx)
# 执行拖动动作
ActionChains(driver).drag_and_drop(source, target).perform()5鼠标悬停
模拟悬停的作用一般是为了显示隐藏的下拉框
# 定位收藏栏
collect driver.find_element_by_xpath(xxx)# 悬停至收藏标签处
ActionChains(driver).move_to_element(collect).perform()五键盘控制
webdriver 中 Keys 类几乎提供了键盘上的所有按键方法我们可以使用 send_keys Keys 实现输出键盘上的组合按键
from selenium.webdriver.common.keys import Keys# 定位输入框并输入文本
driver.find_element_by_id(xxx).send_keys(是小崔啊)# 模拟回车键进行跳转输入内容后
driver.find_element_by_id(xxx).send_keys(Keys.ENTER)# 使用 Backspace 来删除一个字符
driver.find_element_by_id(xxx).send_keys(Keys.BACK_SPACE)# Ctrl A 全选输入框中内容
driver.find_element_by_id(xxx).send_keys(Keys.CONTROL, a)# Ctrl C 复制输入框中内容
driver.find_element_by_id(xxx).send_keys(Keys.CONTROL, c)# Ctrl V 粘贴输入框中内容
driver.find_element_by_id(xxx).send_keys(Keys.CONTROL, v)六设置元素等待
很多页面都使用 ajax 技术页面的元素不是同时被加载出来的为了防止定位这些尚在加载的元素报错。 可以设置元素等来增加脚本的稳定性。webdriver 中的等待分为 显式等待 和 隐式等待。
1显示等待
显式等待设置一个超时时间每个一段时间就去检测一次该元素是否存在
如果存在则执行后续内容如果超过最大时间超时时间则抛出超时异常TimeoutException。显示等待需要使用 WebDriverWait同时配合 until 或 not until 。 driver浏览器驱动
timeout超时时间单位秒
poll_frequency每次检测的间隔时间默认为0.5秒
ignored_exceptions指定忽略的异常如果在调用 until 或 until_not 的过程中抛出指定忽略的异常则不中断代码默认忽略的只有 NoSuchElementExceptionWebDriverWait(driver, timeout, poll_frequency0.5, ignored_exceptionsNone)method指定预期条件的判断方法在等待期间每隔一段时间调用该方法判断元素是否存在直到元素出现。
until_not 正好相反当元素消失或指定条件不成立则继续执行后续代码
message: 如果超时抛出 TimeoutException 并显示 message 中的内容
method 中的预期条件判断方法是由 expected_conditions 提供下面列举常用方法。until(method, messagexxx)
until_not(method, messagexxx)from selenium.webdriver.common.by import By
from selenium import webdriverdriver webdriver.Chrome()
locator (By.ID, kw)
element driver.find_element_by_id(kw)from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import Bydriver webdriver.Chrome()
element WebDriverWait(driver, 5, 0.5).until(EC.presence_of_element_located((By.ID, kw)),message超时啦!)2隐式等待
用 implicitly_wait() 来实现隐式等待使用难度相对于显式等待要简单很多。 示例打开个人主页设置一个隐式等待时间 5s通过 id 定位一个不存在的元素最后打印 抛出的异常 与 运行时间。
from selenium import webdriver
from time import timedriver webdriver.Chrome()
driver.get(https://blog.csdn.net/qq_43965708)start time()
driver.implicitly_wait(5)
try:# 触发隐式等待在轮询检查 5s 后仍然没有定位到元素抛出异常driver.find_element_by_id(kw)
except Exception as e:print(e)print(f耗时{time()-start})七定位一组元素
将元素定位中的element - elements
find_elements_by_id()find_elements_by_name()find_elements_by_class_name()find_elements_by_tag_name()find_elements_by_xpath()find_elements_by_css_selector()find_elements_by_link_text()find_elements_by_partial_link_text()
from selenium import webdriver# 设置无头浏览器
option webdriver.ChromeOptions()
option.add_argument(--headless)driver webdriver.Chrome(optionsoption)
driver.get(https://blog.csdn.net/)p_list driver.find_elements_by_xpath(//p[classname])
name [p.text for p in p_list]八切换操作
1窗口切换
窗口切换需要使用页面句柄和 switch_to.windows() 方法。
from selenium import webdriverhandles []
driver webdriver.Chrome()
driver.get(https://blog.csdn.net/)
# 设置隐式等待
driver.implicitly_wait(3)
# 获取当前窗口的句柄
handles.append(driver.current_window_handle)
# 点击 python进入分类页面
driver.find_element_by_xpath(//*[idmainContent]/aside/div[1]/div).click()
# 获取当前窗口的句柄
handles.append(driver.current_window_handle)print(handles)
# 获取当前所有窗口的句柄
print(driver.window_handles)可以看到第一个列表 handle 是相同的说明 selenium 实际操作的还是 _CSDN_首页 并未切换到新页面。 下面使用 switch_to.windows() 进行切换。
from selenium import webdriverhandles []
driver webdriver.Chrome()
driver.get(https://blog.csdn.net/)
# 设置隐式等待
driver.implicitly_wait(3)
# 获取当前窗口的句柄
handles.append(driver.current_window_handle)# 点击 python进入分类页面
driver.find_element_by_xpath(//*[idmainContent]/aside/div[1]/div).click()
# 切换窗口
driver.switch_to.window(driver.window_handles[-1])
# 获取当前窗口的句柄
handles.append(driver.current_window_handle)print(handles)
print(driver.window_handles)2表单切换
很多页面也会用带 frame or iframe 表单嵌套对于这种内嵌的页面 selenium 是无法直接定位的需要使用 switch_to.frame() 方法将当前操作的对象切换成 frame or iframe 内嵌的页面。switch_to.frame() 默认可以用的 id 或 name 属性直接定位但如果 iframe 没有 id 或 name 这时就需要使用 xpath 进行定位。下面先写一个包含 iframe 的页面做测试用 举个例子 !DOCTYPE html
html langenheadmeta charsetUTF-8meta http-equivX-UA-Compatible contentIEedgemeta nameviewport contentwidthdevice-width, initial-scale1.0titleDocument/titlestylediv p {color: red;animation: change 2s infinite;}keyframes change {from {color: red;}to {color: blue;}}/style
/headbody
divpCSDN是小崔啊/p
/div
!-- 注意这里 --
iframe srchttps://blog.csdn.net/qq_43350524 width400 height200/iframe
/body
/html现在我们定位红框中的 CSDN 按钮可以跳转到 CSDN 首页
from selenium import webdriver
from pathlib import Pathdriver webdriver.Chrome()
# 读取本地html文件
driver.get(file:/// str(Path(Path.cwd(), iframe测试.html)))# 1.通过id定位
driver.switch_to.frame(CSDN_info)
# 2.通过name定位
# driver.switch_to.frame(是小崔啊)
# 通过xpath定位
# 3.iframe_label driver.find_element_by_xpath(/html/body/iframe)
# driver.switch_to.frame(iframe_label)driver.find_element_by_xpath(//*[idcsdn-toolbar]/div/div/div[1]/div/a/img).click()九弹窗处理
JavaScript 有三种弹窗 alert确认、confirm确认、取消、prompt文本框、确认、取消。
处理方式
先定位switch_to.alert自动获取当前弹窗再使用 text、accept、dismiss、send_keys 等方法进行操作
!DOCTYPE html
html langenhead
/headbodybutton idalertalert/buttonbutton idconfirmconfirm/buttonbutton idpromptprompt/buttonscript typetext/javascriptconst dom1 document.getElementById(alert);dom1.addEventListener(click, function(){alert(alert hello)});const dom2 document.getElementById(confirm);dom2.addEventListener(click, function(){confirm(confirm hello)});const dom3 document.getElementById(prompt);dom3.addEventListener(click, function(){prompt(prompt hello)});/script
/body
/htmlfrom selenium import webdriver
from pathlib import Path
from time import sleepdriver webdriver.Firefox()
driver.get(file:/// str(Path(Path.cwd(), 弹窗.html)))sleep(2)# 点击alert按钮
driver.find_element_by_xpath(//*[idalert]).click()
sleep(1)
alert driver.switch_to.alert
# 打印alert弹窗的文本
print(alert.text)
# 确认
alert.accept()sleep(2)# 点击confirm按钮
driver.find_element_by_xpath(//*[idconfirm]).click()
sleep(1)
confirm driver.switch_to.alert
print(confirm.text)
# 取消
confirm.dismiss()sleep(2)# 点击confirm按钮
driver.find_element_by_xpath(//*[idprompt]).click()
sleep(1)
prompt driver.switch_to.alert
print(prompt.text)
# 向prompt的输入框中传入文本
prompt.send_keys(Dream丶Killer)
sleep(2)
prompt.accept()输出
alert hello
confirm hello
prompt hello十百度自动化实例
import time
from selenium import webdriverpath rE:\centbrowser\chromedriver.exe
browser webdriver.Chrome(path)url https://www.baidu.com
browser.get(url)
time.sleep(2)# 获取文本框对象
input_object browser.find_element_by_id(kw)
input_object.send_keys(周杰伦)
time.sleep(2)# 获取按钮并点击
button_object browser.find_element_by_id(su)
button_object.click()
time.sleep(2)# 滑到底部
js_bottom document.documentElement.scrollTop100000
browser.execute_script(js_bottom)
time.sleep(2)# 跳转到下一页
next_object browser.find_element_by_xpath(//a[classn])
next_object.click()
time.sleep(2)# 回退
browser.back()
time.sleep(3)# 退出
browser.quit()十一Chrome handless
Headless 模式是指浏览器在没有图形用户界面(GUI)的情况下运行Selenium 支持 Chrome 和 Firefox 等主流浏览器的 Headless 模式非常适合服务器环境和自动化测试/爬虫场景。
from selenium import webdriver
from selenium.webdriver.chrome.options import Optionschrome_options Options()
chrome_options.add_argument(--headless) # 启用无头模式
chrome_options.add_argument(--disable-gpu) # 禁用GPU加速(旧版可能需要)driver webdriver.Chrome(optionschrome_options)
driver.get(https://example.com)
print(driver.title)
driver.quit()高级配置选项 chrome_options.add_argument(--no-sandbox) # 禁用沙盒
chrome_options.add_argument(--disable-dev-shm-usage) # 解决/dev/shm内存不足问题
chrome_options.add_argument(--window-size1920,1080) # 设置窗口大小
chrome_options.add_argument(--blink-settingsimagesEnabledfalse) # 禁用图片加载import time
from selenium import webdriver
from selenium.webdriver.chrome.options import Optionsdef share_browser():chrome_options Options()chrome_options.add_argument(--headless)chrome_options.add_argument(--disable-gpu)# chrome浏览器的文件路径path rE:\centbrowser\chrome.exechrome_options.binary_location pathreturn webdriver.Chrome(chrome_optionschrome_options)if __name__ __main__:browser share_browser()# 剩下的部分就一样了url https://www.baidu.combrowser.get(url)browser.save_screenshot(baidu.png)time.sleep(2)browser.quit()