Selenium(1)

文章目录

  • Selenium(1)
    • 安装类库
    • 安装驱动
    • 开始
      • 八个基本组成部分
        • 打开与关闭浏览器
        • 浏览器操作:获取网页以及浏览器的信息
        • 等待策略
        • 元素操作
          • 1.查找元素
          • 2.获取元素信息
          • 3. 操作元素(元素交互)
  • 基本介绍结束
  • 参考资料

安装类库

pip install selenium -i https://pypi.tuna.tsinghua.edu.cn/simple

安装驱动

首先需要下载ChromeDriver。

可以前往以下两个网站的任意一个。

  • http://chromedriver.storage.googleapis.com/index.html

  • CNPM Binaries Mirror

注意,需要下载与自己当前Chrome浏览器版本相匹配的驱动器。

  • 如何查看自己Chrome浏览器的版本?

在Chrome的菜单中,选中帮助菜单项,然后点击其下的子菜单项关于Google Chrome

我的版本是103.0.5060,下载对应的驱动器就行。

  • 将下载的驱动器放入指定路径中。

下载下来的文件夹中有一个可执行文件,就是驱动器。现在需要将驱动器放入指定的路径中。

  1. 放入运行python的安装目录下(或者说,将驱动器放在当前使用的python解释器的同一级目录下):
  • 如何找到当前运行的python环境的安装目录?打开cmd,输入python,进入python交互界面
import sys
print(sys.executable)

到此,完成了所有的准备工作,当然,完成这些的前提是你已经下载好了python。


开始

好了,现在正式开始学习使用Selenium吧。

首先,简单了解一下什么是Selenium以及它能干些啥。

以下是官方对它的介绍:

Selenium 是支持 web 浏览器自动化的一系列工具和库的综合项目。

它提供了扩展来模拟用户与浏览器的交互,用于扩展浏览器分配的分发服务器, 以及用于实现 W3C WebDriver 规范 的基础结构, 该 规范 允许您为所有主要 Web 浏览器编写可互换的代码。

八个基本组成部分

根据官方文档的介绍,所有在Selenium中的操作,基本可以归结为一下八个部分。

  1. 使用驱动实例开启会话:在我目前看来,就是使用代码打开浏览器。driver = webdriver.Chrome() #打开Google浏览器

  2. 在浏览器上执行操作:最常用的操作就是导航到一个网页。driver.get('https://www.baidu.com/')

  3. 请求浏览器信息:既然打开了浏览器,当然可以获取浏览器的信息喽,较常用的就是获取浏览器的Cookiecookies = driver.get_cookies())。也可以获取其他信息,如窗口句柄、浏览器尺寸/位置、警报等。

  4. 建立等待策略:这个很重要。当我们使用driver.get()方法导航到一个网页时,get方法会在网页的框架加载结束后返回。但很多网页都会需要发送Ajax请求,经过JavaScript渲染,最后才呈现完整的页面,完成这些操作需要时间。而我们如果想要获取页面完整信息,就需要等待。Selenium能够实现所见即所爬,页面没加载完毕,我们看到的也不是完整的页面,那么怎么能爬取到完整的HTML源码呢?

  5. 发送命令查找元素:这个没什么好说的,就是要定位到网页的某个元素嘛。

  6. 操作元素:对于一个元素,只有少数几个操作,但是时常会用到它们。

  7. 获取元素信息:信息提取。

  8. 结束会话:driver.quit()这将结束驱动程序进程, 默认情况下, 该进程也会关闭浏览器. 无法向此驱动程序实例发送更多命令.还有一个driver.close(),用于关闭窗口,需要区分开来,一般如果想结束程序的运行,并关闭浏览器,就使用quit().

看着有八大基本操作,实际上也没那么多。可以再简化一下:

以上基本操作中1,8归为一类,就叫必要操作吧,因为使用Selenium,打开浏览器和关闭浏览器是必要的。2,3,归为一类,叫做浏览器操作吧,因为针对的对象是浏览器,至于4可以单独归为一类,命名为等待策略5,6,7再归为一类,称作元素操作。

打开与关闭浏览器

这个没太多说的,最简单的打开和关闭方式。

from selenium import webdriver
driver = webdriver.Chrome() #打开浏览器
driver.quit() #关闭浏览器

有点像对文件的操作,打开了,使用完后,就要关闭,否则会占用资源。

  • 无头模式:

显然,每次webdriver.Chrome()都会打开浏览器,而且如果程序切换页面频繁,对我们的其他操作会造成干扰。

无头模式运行时不会弹出窗口,从而减小干扰,同时还减少了一些资源的加载(比如图片),这在一定程度上节省了资源加载的时间和网络带宽。

from selenium import webdriver
from selenium.webdriver import ChromeOptions
import timeoption = ChromeOptions()
option.add_argument('--headless') #添加了一个初始化参数
browser = webdriver.Chrome(options=option)
browser.set_window_size(1366, 768) #设置浏览器的窗口大小,虽然不会显示出来
browser.get('https://www.baidu.com')
time.sleep(5) #睡眠5秒
browser.quit()

浏览器操作:获取网页以及浏览器的信息

  • 获取网页:webDriver.get('url')
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('https://www.baidu.com') #打开百度网页
  • 获取浏览器信息:我们获得了浏览器对象的引用,并把它保存在driver变量中
driver.title #从浏览器中读取当前页面的标题
# 我们打开一个网页,都有一个对应的标签(选项卡),标签上的文字即为title
driver.current_url #获取当前页面的url

还有一种比较常用的操作,添加和删除Cookies

#添加Cookie
driver.add_cookie({"name": "key", "value": "value"})#获取Cookie
# 1.获取指定Cookie
#   可以指定cookie名称,然后获取其值
driver.get_cookie("cookie's name")# 2. 获取全部Cookies
driver.get_cookies()#删除Cookie
# 1.删除指定cookie
driver.delete_cookie("cookie's name")
# 2.删除所有Cookies
driver.delete_all_cookies()

等待策略

等待策略共有三种:显式等待,隐式等待, 流畅等待 。其中最常用的是显示等待。

  • 显示等待

我们可以在页面加载之前,指定一个条件,在页面加载过程中,如果满足这个条件,程序继续执行,若不满足,则继续等待直到条件满足。当然,如果条件始终不能满足,也不能让程序无休止地不停等待,所以也可以设置一个等待时间,如果在等待时限之类,条件满足,那么就会进行下一步,否则,抛出异常。

这里需要使用到wait包。

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as ECbrowser = webdriver.Chrome()
browser.get('https://www.taobao.com/')
wait = WebDriverWait(browser, 10) #初始化一个WebDriverWait对象
input = wait.until(EC.presence_of_element_located((By.ID, 'q')))
button = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, '.btn-search')))
print(input, button)

上面代码中,实现显示等待的代码为wait.until()。wait对象初始化时,指定了浏览器和最长等待时间。随后使用wait.until(condition)的形式,完成显示等待。这里需要解释的是:condition就是我们指定的条件,这个条件本质是一个函数。只要该函数的返回值在当前语言中,能够被解释成True,那么条件满足,程序继续运行。

我们将 条件 作为函数引用传递, 等待 将会重复运行直到其返回值为true。“truthful”返回值是在当前语言中计算为boolean true的任何值,例如字符串、数字、boolean、对象(包括 WebElement )或填充(非空)的序列或列表。这意味着 空列表 的计算结果为false。当条件为true且阻塞等待终止时,条件的返回值将成为等待的返回值。

库中实现定义好的条件很多。可以在IDE中查看selenium.webdriver.support.expected_conditions包中的函数。

当然,我们也可以自定义条件函数,这个函数需要有一个返回值。

  • 隐式等待

指定一个固定的等待时长,时间一到,运行程序下一步。

driver.implicitly_wait(10) #隐式等待10秒
  • 流畅等待:流畅等待实例定义了等待条件的最大时间量,以及检查条件的频率。

用起来有点麻烦,我是不会用的。

driver = webdriver.Chrome()
driver.get("http://somedomain/url_that_delays_loading")
wait = WebDriverWait(driver, timeout=10, poll_frequency=1, ignored_exceptions=[ElementNotVisibleException, ElementNotSelectableException])
element = wait.until(EC.element_to_be_clickable((By.XPATH, "//div")))

元素操作

1.查找元素

首先说明,我们查找到的元素,在Selenium中,都是WebElement类的对象。

查找元素主要是两个方法。find_element,find_elements。顾名思义,前者只找一个元素,后者找所有匹配的元素。两个方法使用基本一致,只介绍一个。

  • find_element(by=By.ID, value=None):by参数是指查找方式,默认按节点ID查找,value代表查找值,默认为空。

这里的查找方式,可以参看selenium.webdriver.common.by包的定义。

from selenium import webdriver
from selenium.webdriver.common.by import Bybrowser.get('https://taobao.com')
input = browser.find_element(By.ID, 'q') #按照ID查找节点
input = browser.find_element(By.CSS_SELECTOR, '#q') #按CSS选择器
input = browser.find_element(By.XPATH, '//*[@id="q"]') #按XPath路径语言
  • find_elements():查找到的结果以列表形式返回。
2.获取元素信息
WebElement.tag_name #获取元素标签名
WebElement.rect #用于获取参考元素的尺寸和坐标.
WebElement.text #获取特定元素渲染后的文本.
WebElement.location #获取元素的位置
WebElement.size #获取元素的大小
WebElement.is_displayes() #判断元素是否正确显示
#等等还有许多方法和属性
3. 操作元素(元素交互)

仅有五种基本命令可用于元素的操作:

  • 点击 (适用于任何元素)
  • 发送键位 (仅适用于文本字段和内容可编辑元素)
  • 清除 (仅适用于文本字段和内容可编辑元素)
  • 提交 (仅适用于表单元素)
  • 选择 (参见 选择列表元素)

以上方法使用那些元素对象需要弄清楚。

只介绍常用的:

  • 点击
WebElement.click()
# 元素点击命令执行在元素的中央。
# 如果元素中央被遮挡,将会返回元素点击错误
  • 发送键位
WebElement.send_keys()#示例:
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import KeysWebElement.send_keys("info") #向元素发送"info"字符串
WebElement.send_keys(Keys.ENTER) #向元素发送回车按键命令
WebElement.send_keys("info"+Keys.ENTER) #输入"info"后,按下回车
#更多的按键,查看keys包
  • 清除

#一般用于表单输入的清除
WebElement.clear()
  • 提交:在Selenium 4中, 不再通过单独的端点以及脚本执行的方法来实现. 因此, 建议不要使用此方法, 而是单击相应的表单提交按钮.

基本介绍结束

到此,最最基本的操作已经介绍了。更多的操作以后更新吧。

参考资料

  • 如何查看python的安装目录

  • Python—查看安装路径 - Bestone - 博客园 (cnblogs.com)

  • Find full path of the Python interpreter? - Stack Overflow

  • 概述 | Selenium

Python之Selenium的基本使用(1)相关推荐

  1. python selenium脚本_怎样开始写第一个基于python的selenium脚本

    1.下载并安装python(http://www.python.org/geti/). 2.安装selenium(http://pypi.python.org/pypi/selenium)下载并解压缩 ...

  2. 使用Python在Selenium WebDriver中获取WebElement的HTML源代码

    我正在使用Python绑定来运行Selenium WebDriver. from selenium import webdriver wd = webdriver.Firefox() 我知道我可以抓住 ...

  3. python批量下载文件-python使用selenium实现批量文件下载

    背景 实现需求:批量下载联想某型号的全部驱动程序. 一般在做网络爬虫的时候,都是保存网页信息为主,或者下载单个文件.当涉及到多文件批量下载的时候,由于下载所需时间不定,下载的文件名不定,所以有一定的困 ...

  4. Python之selenium:selenium库的简介、安装、使用方法之详细攻略

    Python之selenium:selenium库的简介.安装.使用方法之详细攻略 目录 selenium库的简介 1.Selenium需要一个驱动程序来与所选的浏览器交互 selenium库的安装 ...

  5. [Python爬虫] Selenium获取百度百科旅游景点的InfoBox消息盒

    前面我讲述过如何通过BeautifulSoup获取维基百科的消息盒,同样可以通过Spider获取网站内容,最近学习了Selenium+Phantomjs后,准备利用它们获取百度百科的旅游景点消息盒(I ...

  6. [Python爬虫] Selenium+Phantomjs动态获取CSDN下载资源信息和评论

    前面几篇文章介绍了Selenium.PhantomJS的基础知识及安装过程,这篇文章是一篇应用.通过Selenium调用Phantomjs获取CSDN下载资源的信息,最重要的是动态获取资源的评论,它是 ...

  7. [Python爬虫] Selenium实现自动登录163邮箱和Locating Elements介绍

    前三篇文章介绍了安装过程和通过Selenium实现访问Firefox浏览器并自动搜索"Eastmount"关键字及截图的功能.而这篇文章主要简单介绍如何实现自动登录163邮箱,同时 ...

  8. Python学习--Selenium模块

    1. Python学习--Selenium模块介绍(1) 2.Python学习--Selenium模块学习(2) 其他: 1. Python学习--打码平台 转载于:https://www.cnblo ...

  9. python selenium_Python+selenium自动化测试

    前言 Selenium v1.0 的核心组件是 Selenium RC:Selenium v2.0 的核心组件是 WebDriver:因此可以说 v1.0 版本和 v2.0 版本完全是两套东西.而 S ...

  10. [python爬虫] Selenium常见元素定位方法和操作的学习介绍(转载)

    转载地址:[python爬虫] Selenium常见元素定位方法和操作的学习介绍 一. 定位元素方法 官网地址:http://selenium-python.readthedocs.org/locat ...

最新文章

  1. Go语言Beego框架1.6.2(稍显老)及bee工具的使用
  2. 动态规划之-最大子段和
  3. Win2003的IIS设置
  4. HDU1229 还是A+B【水题】
  5. ios获取区域服务器信息,ios获取服务器数据
  6. android对象识别实验报告,20162302 实验四《Android程序设计》实验报告
  7. iphone流量 信息服务器,iphone几个功能必须关闭,别再让流量不够用
  8. jQuery EasyUI/TopJUI上传多个附件并可以进行删除操作
  9. Android基础Activity篇——创建一个活动(Activity)
  10. [宋史学习] 取蜀将帅不利
  11. 【3D建模制作技巧分享】Zbrush中凹凸贴图、法线贴图和置换贴图的区别
  12. 微信从原版到现在所有界面图片_微信进入界面的图片有什么含义
  13. 团队任务3每日立会(2018-10-24)
  14. 阿诺德·施瓦辛格的演讲(拼命才会优秀,自律才会自由~)
  15. SSD《一》-- 基础知识
  16. SpringBean篇 (2) 注解配置形式
  17. Java8 Stream:20+实际例子,玩转集合的筛选、归约、分组、聚合
  18. 人工智能很危险!?开发需谨慎?
  19. 德信计算机怎么开音乐,计算机模式识德信别 文献阅读.ppt
  20. 高级信息系统项目管理师十大领域

热门文章

  1. Qt编写可视化大屏电子看板系统22-平滑曲线图
  2. (云反馈)金蝶迷你版账套怎么转标准版?
  3. 用MPI+CUDA实现矩阵加法
  4. sqlite与mysql的区别
  5. 使用javaassist创建类和对象
  6. 央视指责三星手机维修暴利 维修人士叫屈
  7. 49深入聚合数据分析_cardinality算法之优化内存开销以及HLL算法
  8. ofo无法退押金和余额
  9. Python如何创建一个单链表,以及实现单链表的增,删,改,查操作,以及对单链表的排序功能
  10. VS2012安装VA之后菜单栏中没有VASSISTX