我是靠谱客的博主 任性野狼,最近开发中收集的这篇文章主要介绍目前记录♡最详细的一篇记录学习笔记 ---Python爬虫(18) selenium自动化安装和使用一. selenium自动化介绍,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

一. 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自动化介绍所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(32)

评论列表共有 0 条评论

立即
投稿
返回
顶部