概述
一. selenium自动化介绍
Selenium是一个Web的自动化测试工具,最初是为网站自动化测试而开发的,Selenium 可以直接运行在浏览器上,它支持所有主流的浏览器(包括PhantomJS这些无界面的浏览器),可以接收指令,让浏览器自动加载页面,获取需要的数据,甚至页面截屏.主讲chrome
Chromedriver的介绍 # 主讲这个
WebDriver是一个用来进行复杂重复的web自动化测试的工具,可以理解它是谷歌的浏览器的驱动或者插件,自动化selenium提供调用该方法进行自动化的操作
PhantomJS的介绍
PhantomJS 是一个基于Webkit的“无界面”(headless)浏览器,它会把网站加载到内存并执行页面上的 JavaScript
谷歌浏览器的镜像网址
# 镜像网址:http://npm.taobao.org/mirrors/chromedriver
phantomjs镜像源地址:
开发者社区npm升级通知—阿里云开发者社区https://developer.aliyun.com/mirror/NPM?from=tnpm
安装镜像的流程:
1.首先查看我们所使用的chrom(谷歌浏览器)的版本:
设置 -->帮助-->关于chrome的版本
2. 然后用chrome打开镜像源地址:
(1)找到与版本最相近的版本点击进入
例如: 我这里为
(2)下载window版本32位
(3)然后将包解压获得一个.exe文件.这个镜像文件就是chrome的驱动
(4)剪切或者复制该文件到python解释器文件的同级目录
!!!这里是我都目录,需要你寻找到自己的目录哦
然后安装 selenium这个包
pip install selenium 在pycharm的控制台安装,或者终端界面安装
@selenium的基本使用
1. 无头模式(无界面模式)
无头模式,就是在自动化程序不打开窗口进行后台运行的模式.这样就不会在运行程序时弹出浏览器界面影响其他工作.
""" 在安装selenium这个包后, 我们需要导入这个包中的webdriver这个模块 然后从这个模块导入控制无头参数的ChromeOptions """ """第一步: 导包""" from selenium import webdriver from selenium.webdriver import ChromeOptions """ 第二步: 创建ChromeOption对象, 设置无界面启动参数: options.headless=True """ option = ChromeOptions() option.add_argument('--headless') # 指定无头模式 """ 第三步: 创建浏览webdriver对象,这里用windows变量接收""" windows = webdriver.Chrome(options=option) # 将无界面对象传入, 有界面的就可以不传入,直接创建对象即可 # 设置浏览器窗口大小, (这里设置无界面模式,可以不设置窗口大小的.因为只是后台运行) # windows.set_window_size(1920, 1080) # 指定窗口大小 windows.maximize_window() # 窗口最大化 """ 第四步: 访问网页: 这里我们访问 csdn页面: https://www.csdn.net""" url = 'https://www.csdn.net' windows.get(url) # 这里get方法就是模拟人为输入网址 """ 第五步: 获取网页源码""" source = windows.page_source print(source)
这个时候就会发现源码有返回, 但是没有窗口弹出的原因,就在于设置无界面模式
!!! 一般我们写爬虫自动化开发的时候,无界面模式一般最后添加进去.
为的是写一部分然后运行自动化看看有无错误, 方便开发,最后添加无界面为了方便使用
2. 加载网页的常见操作:
# (1) 创建driver对象 driver = webdriver.Chrome() # 这里是大写Chrome # (2) 访问起始url地址 start_url = 'https://www.csdn.net' driver.get(start_url) # (3) 将网页生成图片 , 其实就是访问成功后截图, 如果访问有小姐姐的网址截图是不是很nice.嘻嘻嘻 driver.save_screenshot('csdn.png') # (4) 根据element(网页的意思)内容, 进行定位 后面详细了解 # (5) 获取element 的源码 driver.page_source # 可以用变量接收,然后打印观察哦 # (6) 打印网页的标题 print(driver.title) # (7) 获取cookie driver.get_cookies() # (8) 退出当前网页, 有时候需要访问多个网页, 这个只是关闭其中一个 driver.close() # (9) 退出浏览器, 退出就全部关闭了 driver.quit()
3. webdriver 操作浏览器的方式
# (1) 最大化浏览器 driver.maximize_window() # (2)刷新 driver.refresh() # (3)后退 driver.back() # (4)前进 driver.forward() # (5)设置浏览器大小 driver.set_window_size(100, 200) # (6)设置浏览器的位置 driver.set_window_position(300, 200) # 这个单位: 像素 # (7)关闭网页窗口和关闭整个浏览器 """上面有哦"""
4.标签定位方法
介绍9中定位方法,是因为方便应对不同情况, xpath和css_select可以直接element中右键复制.
# (1) 根据标签的属性id定位 driver.find_element_by_id('').send_keys('你的名字') # 定位之后调用.send_keys()向定位的搜索框传入内容 # (2) 根据标签的class属性定位 driver.find_element_by_class_name('') # (3) 根据标签的name属性定位 driver.find_elements_by_name('') # (4) 根据xpath语法定位 driver.find_element_by_xpath('') # (5) 根据CSS选择器定位 driver.find_element_by_css_selector('') # (6) 根据连接文本定位元素 driver.find_element_by_link_text('') # (7) 根据链接包含的文本定位元素 driver.find_element_by_partial_link_text('') # (8) 根据标签定名定位元素 driver.find_element_by_tag_name('') # (9) js代码定位 如果对js不熟悉可以不使用 js_id = 'document.querySelector("#xxx")' # 这个是id, 其实和css有点类似, 如果了解一点前端知识.容易理解 js_class = 'document.querySelector(".xxx")' # 这个是class driver.execute_script(js_id) # 这个方法是执行js代码
9中方法也都有自己的多元素定位方法, 就是在elements添加个s
(1) find_element和find_elements的区别:
s就返回一个列表, 没有就返回匹配到的第一个标签对象
find_element匹配不到就会抛出异常, find_elements匹配不到就会返回空列表
(2) by_link_text 和 by_partial_link_text的区别:
前者是匹配全部文本, 后者匹配部分文本内容.应该是后面好用一点.
5. webdriver其他常用方法
""" (1) size : 返回元素大小, 先定位元素然后调用.size""" size_el = driver.find_element_by_name('xxx').size print(size_el) """ (2) text : 获取元素的文本, 先定位""" text_el = driver.find_element_by_id('xxx').text """ (3) title: 获取网页title , 上面好像讲过了耶""" """ (4) current_url : 获取当前网页的url""" url_el = driver.current_url print(url_el) # 这个一般用于网页重定向后获取url """ (5) get_attribute('xxx') : 获取元素中xxx的属性值, 先定位元素""" href = driver.find_element_by_class_name('xxx').get_attribute('class') print(href) """ (6) is_display() :判断元素是否可见, 同样先定位, 然后调用""" """ (7) is_enabled() :判断元素是否可用, 同上""" """(6), (7)方法一般用的比较少"""
6. webdriver操作鼠标的方法
""" 首先元素定位: 然后鼠标操作""" """ 右击 --> 此方法模拟鼠标右键点击效果""" 1. context_click() """ 双击 --> 模拟双击效果""" 2. double_click() """ 拖动 --> 模拟鼠标拖动效果""" 3. drag_and_drop() """ 悬停 --> 模拟鼠标悬停""" 4. move_to_element() """ 执行 -->>>> 该方法用于执行上面方法""" perform() # 使用方法 """第一步 : 导包, 从selenium.webdriver.common.action_chains 导入 ActionChains模块""" from selenium.webdriver.common.action_chains import ActionChains """第二步,定位元素""" element = driver.find_element_by_name('xxxx') """第三步: 实例化ActionChains对象: """ action = ActionChains(driver) # 这里传入driver实例化对象这个参数, 具体这个参数是什么,想信大家都知道, 不就是元素定位实例化对象嘛. """第四步 : 调用鼠标方法, """ cl = action.context_click(element) """最后: 执行""" cl.perform() """综合起来""" action.move_to_element(element).perform()
@selenium控制标签页的切换
1.窗口切换: (窗口句柄: 指的是指向标签对象的标识)
获取所有标签的窗口句柄
利用窗口句柄字切换到句柄指向的标签页
"""窗口切换""" """第一步: 获取当前所有的标签的句柄构成列表""" windows_list = driver.window_handles """第二步: 根据标签页句柄列表索引下标进行切换""" driver.switch_to.window(windows_list[0]) # 案例: from selenium import webdriver import time # 创建driver对象 driver = webdriver.Chrome() # 访问url的网页地址 url_01 = 'https://www.baidu.com/s?wd=%E6%BC%82%E4%BA%AE%E7%9A%84%E5%B0%8F%E5%A7%90%E5%A7%90' url_02 = 'https://www.csdn.net' """上面两个网址都是小姐姐哦,相信大家喜欢的""" """访问""" driver.get(url_01) time.sleep(3) driver.find_element_by_xpath('//*[@id="1"]/div/h3/a').click() driver.get(url_02) time.sleep(2) windows_list = driver.window_handles # 打印输出列表 print(windows_list) """这个时候浏览器窗口将停留在小姐姐网页, 但是我们要去再学习""" # 切换窗口 driver.switch_to.window(windows_list[0]) time.sleep(10) """这个想看小姐姐又切换回来""" driver.switch_to.window(windows_list[1])
这个时候你就会发现一个问题, get访问网页,还是原来的窗口访问,并没有创建新的窗口
这个时候就需要用到 js 代码创建一个新的窗口from selenium import webdriver import time # 创建driver对象 driver = webdriver.Chrome() # 访问url的网页地址 url_01 = 'https://www.baidu.com/s?wd=%E6%BC%82%E4%BA%AE%E7%9A%84%E5%B0%8F%E5%A7%90%E5%A7%90' """上面两个网址都是小姐姐哦,相信大家喜欢的""" """访问""" driver.get(url_01) time.sleep(3) driver.find_element_by_xpath('//*[@id="1"]/div/h3/a').click() js = 'window.open("https://www.csdn.net")' driver.execute_script(js) time.sleep(2) windows_list = driver.window_handles # 打印输出列表 print(windows_list) """这个时候浏览器窗口会停在csdn这里, 但是我们要去看小姐姐10秒""" # 切换窗口 driver.switch_to.window(windows_list[1]) time.sleep(10) """这个想看完又切换回来学习""" driver.switch_to.window(windows_list[2])
!!!! 注意: 在开启一个新窗口时, 这里不能用占位符来代替,为什么我也不知道,要不然会报错.
且, 外单内双, 或者内单外双引号.这里总共公会出现三个窗口, 第二是点击生成的
@selenium控制 iframe 嵌套的切换
iframe是html中常用的一种技术,即一个页面中嵌套了另一个网页,selenium默认是访问不了frame中的内容的,对应的解决思路是 :
1. 通过元素定位到 ( iframe 或者 frame 标签 )
` 2. 通过driver.switch_to.frame(接收iframe标签定位的元素变量名)
driver.switch_to.frame(frame_element)
"""实现网易邮箱自动化登录""" from selenium import webdriver import time def login(user=0, password=0): driver = webdriver.Chrome() driver.maximize_window() # 窗口最大化 driver.get("https://email.163.com/") # 我们直接定位内嵌套元素, 会报错, 如果用elements会返回空列表 time.sleep(2) """我们需要先定位内嵌套开始的位置, 即html上面的iframe标签, 然后再来定位元素""" iframe = driver.find_element_by_tag_name('iframe') # 这里用标签定位比较好 driver.switch_to.frame(iframe) # 切换为内嵌套 source = driver.page_source # 获取内嵌套源码 print(source) """切换iframe之后, 开始定位登录框框""" driver.find_element_by_name('email').send_keys('lanshuang20210909') # send_keys()传值 driver.find_element_by_name('password').send_keys('xxxxxxxx') """最后定位登录点击按键, 进行点击""" driver.find_element_by_id('dologin').click() login()
这里将自动化登录事件放入一个函数中, 当这个方法运行完,这个窗口就关闭了.不知道是不是被检测到的原因.后面添加防检测,看看会不会结束后自己关闭
@拓展iframe嵌套如何进一步操作
""" 跳出iframe嵌套""" """ 恢复默认网页方法 : 这里默认网页指的是存在iframe嵌套的网页窗口 当我们对iframe嵌套操作后,需要对嵌套外定位时,需要恢复默认网页,意思是必须退出iframe嵌套 """ driver.switch_to.default_content() # 在frame表单中操作其他页面,必须回到默认页面,才能进一步操作 """ 跳回上层页面: 向上的单层切换""" driver.switch_to.parent_frame() """ 利用: iframe切换标签页的方式重新加载网页,退回默认网页,即嵌套外网页""" windows_list = driver.window_handles driver.switch_to.window(window_list[x])
@利用selenium获取cookie的方法 (重点)
获取cookie: driver.get_cookies() 返回列表. 其中包含完整的cookie信息,需要转换为字典
!!!! 这里获取一定是get_cookies(), 不是get_cookie()
@字典推导式转换
cookies_dict = {cookie['name']: cookie['value'] for cookie in driver.get_cookies()}
这里
""" 百度案例: 获取cookie""" from selenium import webdriver url = 'https://www.baidu.com/' # 实例化chrome浏览器对象 driver = webdriver.Chrome() driver.get(url) ck01 = driver.get_cookies() print(ck01) print('-'*10) cookies_dict = {cookie['name']: cookie['value'] for cookie in driver.get_cookies()} print(cookies_dict)
观察对比一下,发现一样的.很nice哟
删除某一条cookie()
driver.delete_cookie(' cookie_name')
删除所有cookies()
driver.delete_all_cookies()
例如: 删除上图PSTM这条cookie: driver.delete_cookie('PSTM')
!!! 注意: 这里删除得在获取cookies前删除, 意思是在driver.get_cookies()前执行
@页面等待 (超重点)
页面等待分为三种:
1. 强制等待: time.sleep()
缺点: 不智能,设置的时间太短,元素还没有加载出来,设置的时间太长,浪费时间
2. 隐式等待:
针对元素定位, 隐式等待设置了一个时间, 在一段时间内判断元素是否定位成功,如果完成,就进行下一步
在设置时间内没有定位成功,则会报错超时加载,但是却比强制等待效率高,
3.显示等待:
明确等待某一个元素,超时则报错异常
@隐式等待
"""隐式等待""" from selenium import webdriver driver = webdriver.Chrome() # 最多等待10秒, 10秒后,没有定位成功就报错, 如果定位成功,立刻执行 driver.get('https://www.csdn.net') driver.implicitly_wait(10) driver.find_element_by_xpath('//*[@id="floor-nav_557"]/div/div/div[2]/ul/li[1]/a').click() """隐式等待: 必须放在定位,或者其他需要等待操作的前面执行""" """为什么用隐式等待: 因为有时候因为网络问题,存在加载过慢,导致程序已经执行到定位元素的时候,却没有网页.从而导致定位失败报错"""
@显示等待
"""隐式等待""" from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.support.wait import WebDriverWait from selenium.webdriver.common.by import By from selenium import webdriver driver = webdriver.Chrome() # 最多等待10秒, 10秒后,没有定位成功就报错, 如果定位成功,立刻执行 driver.get('https://www.csdn.net') # 通过xpath定位csdn网页的python driver.find_element_by_xpath('//*[@id="floor-nav_557"]/div/div/div[2]/ul/li[1]/a').click() windows_list = driver.window_handles driver.switch_to.window(windows_list[1]) page = WebDriverWait(driver, 20, 0.5).until(EC.presence_of_element_located((By.XPATH, '//*[@id="csdn-nav-second"]/div/div/ul/li[8]/a'))).click() """ 参数20表示最长等待20s 参数0.5表示0.5s检查一次规定的标签书否存在 EC.presence_of_all_elements_located((By.LINK_TEXT, '地图')):通过文本内容定位标签 每0.5s一次检查,通过链接文本内容定位标签是否存在,如果存在就向下继续执行,如果不存在20s上限就报错 By.类似的定位方法, 后面'地图'就是文本链接参数 例如这里我用: By.XPATH, 'xpath语法定位' """
!!! 注意: 显示等待具有很好的优点,但是需要导入很多包.
在面向对象编程的过程中,可以创建一个显示等待的带参方法函数,需要使用的时候就调用.
@selenium控制浏览器执行js代码的方法
这个前面9大元素定位最后一个有讲到过:
js = ' 写入js代码 '
driver.execute_script(js) # 利用 .execute_script(js)执行js代码
@ selenium使用代理IP(重点)
使用代理ip的方法:
1.实例化 webdriver 配置对象:
(1)导包: from selenium.webdriver import ChromeOptions()
(2)实例化配置对象: options = webdriver.ChromeOptions()
2. 配置对象, 添加使用代理ip
options.add_argument('--proxy-server=http://202.20.16.82:8527')
3.实例化带有配置对象的driver对象
driver = webdriver.Chrome(options=options)
from selenium import webdriver from selenium.webdriver improt ChromeOptions() # 1.创建一个配置对象 options = webdriver.ChromeOptions() # 使用代理 options.add_argument('--proxy-server=http://192.168.129.130:9527') # 创建driver对象 driver = webdriver.Chrome(options=options) # 传入使用代理的参数 # 访问url driver.get('https://www.csdn.net')
@selenium替换user-agent
方法:
实例化配置对象
options = webdriver.ChromeOptions()
配置对象添加替换UA的命令
options.add_argument('--user-agent=Mozilla/5.0 HAHA')
!!! :当访问网页需要手机模式的时候, 只需要替换为手机user-agent 即可
实例化带有配置对象的driver对象
driver = webdriver.Chrome(options=options)
""" 替换user-agent""" from selenium import webdriver # 创建一个配置对象 options = webdriver.ChromeOptions() # 配置ua 即: user-agent ua = 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Mobile Safari/537.36' options.add_argument('--user-agent={}'.format(ua)) # 方式一 # 拼接也可以 options.add_argument('--user-agent=' + ua) # 方式二 # 创建driver,传入配置 # 利用js代码检查ua是否替换成功 js = 'return navigator.useragent' result = driver.execute_script(js) print(result)
返回的结果是不是和我们设置的一样一样的.
@指定chrome驱动
在创建 driver = webdriver.Chrome(executable_path='存放chrome驱动的文件路径')
利用executable_path指定驱动路径
@selenium防检测
方案一: 添加防检测配置,(启动开发者模式)
options = ChromeOptions() # 实例化一个ChromeOptions对象
options.add_experimental_option('excludeSwitches', ['enable-automation'])
driver = webdriver.Chrome(options=option) # 传入防检测参数之后, 实现调用驱动为undefined, 即未定义
方案二: 这个我也看不懂.
driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", { "source": """ Object.defineProperty(navigator, 'webdriver', { get: () => undefined }) """})
!!!注意: 今天测试多次,发现方案二: 似乎失效了
@selenium禁止弹窗
""" 禁止弹窗参数 """ prefs = { 'profile.default_content_setting_values': { 'notifications': 2 } } # 配置对象添加参数 options.add_experimental_option('prefs', prefs) # 创建driver实例对象,传入配置参数 driver = webdriver.Chrome(options=options)
@selenium 清空输入框框
方法:
先定位输入框框
input_box = driver.find_element_by_id('xxx')
input_box.send_keys('xxxxxx ') 输入框输入内容
input_box.clear() 清空输入框框
@selenium 模拟回车
input_box.submit() 模拟回车
@selenium 下拉框选择
(1)首先定位下拉框
el_select = driver.find_element_by_id('xxx')
(2)创建一个下拉框对象
drop_down_box = Select(el_select)
""" 第一种选择: 通过选项的索引选定选项 """ drop_down_box.select_by_index(0) # 这里索引为0 """ 第二种: 通过options标签属性选择""" drop_down_box.select_by_value('20') # 这里options属性是20 """第三种: 通过文本选择(就是下拉框的值选择)""" drop_down_box.select_by_visible_text('每页20条视频') # 打印选择的文本 # 查看第一个已选(若有多个已选则打印第一个,只有一个已选则打印一个) print(drop_down_box.first_selected_option.text) # 打印所有已选的选项的文本 list = drop_down_box.all_selected_options for i in list: print(i.text) # 打印是否是多选 print(drop_down_box.is_multiple) # 打印所有选项(包括已选和未选的) m_list = drop_down_box.options for a in m_list: print('选项',a.text) # # 关闭浏览器 # driver.quit()
@selenium 鼠标悬停
@窗口下滑
利用js代码实现
js = 'window.scrollTo(0, 2000)' # scrollTo(滑动起始位置, 滑动终止位置) driver.execute_script(js)
@提供效率
from selenium import webdriver options = webdriver.ChromeOptions() options.add_argument('--headless') # 无界面配置 options.add_argument('--disable-gpu') # 规避浏览器bug """ 不加载图片, 提升速度""" options.add_argument('blink-settings=imagesEnabled=false') # 创建driver对象, 配置参数 driver = webdriver.Chrome(options=options)
@实战小案例 (本案例只是用于学术教学)
这里咱们设计一个自动化观看抖音的小程序为例讲解
from selenium import webdriver driver = webdriver.Chrome() driver
@励志语录:
你只管向前, 剩下的交给时间.!!!
最后
以上就是任性野狼为你收集整理的目前记录♡最详细的一篇记录学习笔记 ---Python爬虫(18) selenium自动化安装和使用一. selenium自动化介绍的全部内容,希望文章能够帮你解决目前记录♡最详细的一篇记录学习笔记 ---Python爬虫(18) selenium自动化安装和使用一. selenium自动化介绍所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复