《老鸟python 系列》视频上线了,全网稀缺资源,涵盖python人工智能教程,爬虫教程,web教程,数据分析教程以及界面库和服务器教程,以及各个方向的主流实用项目,手把手带你从零开始进阶高手之路!点击 链接 查看详情

了解Selenium

阅读:1150    分享到

从现在开始,你只需要安装并配置好 Python 和 Pycharm 就可以轻松完成这个自动赚钱项目,防止有同学懒得看 selenium 教程,在此我还要简单的介绍一下 selenium 的基本语法和使用。

selenium 介绍

selenium 是一个可以操控浏览器的库,这个库提供的 API 可以模拟人操作浏览器,也就是说 selenium 提供的 API 含有人操作浏览器的一系列行为,比如:点击,拖动,输入,最大化,拖动滚动条等等。

Python 并没有直接提供 selenium 库,所以,我们首先需要安装 selenium 库,目前最新的 selenium 版本不太稳定,我们可以使用稳定的版本,比如 3.141.0,安装方法如下:

pip install -i https://mirrors.aliyun.com/pypi/simple selenium==3.141.0

selenium 并不能直接操控浏览器,它还需要一个操控浏览器的驱动,因为 selenium 并不能直接认识浏览器,他需要一个中介,也就是说selenium是通过各种不同浏览器提供的驱动来操控不同的浏览器。

针对不同的浏览器,我们可以下载不同的驱动,以下是各个浏览器的驱动网址:

  • Chrome浏览器驱动:https://chromedriver.chromium.org/downloads
  • Firefox浏览器驱动:https://github.com/mozilla/geckodriver/releases
  • IE浏览器驱动:http://selenium-release.storage.googleapis.com/index.html
  • Opera浏览器驱动:https://github.com/operasoftware/operachromiumdriver/releases
  • PhantomJS浏览器驱动:http://phantomjs.org/

在此,我们使用 Chrome 浏览器,所以只需要下载 Chrome 浏览器的驱动:chromedriver。

开始使用selenium

我们在此使用 Chrome 浏览器,所以我们先把 Chrome 浏览器的驱动下载到本地,然后我们可以手动创建一个存放浏览器驱动的目录,如: C:\driver , 将下载的 Chrome 浏览器驱动文件放在该目录下。

下面,我们来用程序验证 Chrome 浏览器驱动是否可以正常使用,执行以下代码,如果能直接打开 Chrome 浏览器,说明我们已经把 Chrome 驱动安装配置成功。

from selenium import webdriver

driver = webdriver.Chrome(executable_path="c:/driver/chromedriver.exe")  # 使用 selenium 通过 Chrome 驱动打开 Chrome 浏览器

上面的代码只是打开浏览器,浏览器并没有打开任何网站,只是呈现出一个空白的网页,如果我们想通过浏览器打开某个特定的网站该怎么办呢,比如我们想打开百度网站,代码如下:

from selenium import webdriver

driver = webdriver.Chrome(executable_path="c:/driver/chromedriver.exe")
driver.get('http://www.baidu.com')  # 操控浏览器打开百度主页
print(driver.page_source)

我们前面刚刚提过,selenium 可以模拟人对浏览器的所有操作,下面我们就来学习一下常见的操控浏览器的行为。

from selenium import webdriver

driver = webdriver.Chrome(executable_path="c:/driver/chromedriver.exe")
driver.get('http://www.baidu.com')  # 操控浏览器打开百度主页
print(driver.page_source)

改变浏览器大小

实际上我们用程序操作浏览器和人操作浏览器是一样的,比如我们想点击一个控件,就需要这个控件露出来,否则我们没法点击。同样,我们用 selenium 操控浏览器点击一个按钮也是一样的,所以我们要经常改变浏览器的大小让控件漏出来。

我们调用 set_window_size 函数可以改变浏览器的大小,只需要传入宽和高两个参数即可调整浏览器大小。

from selenium import webdriver

driver = webdriver.Chrome(executable_path="c:/driver/chromedriver.exe")
driver.get("http://www.baidu.com")
driver.set_window_size(480, 800)  # 设置浏览器宽 480 像素、高 800 像素

让浏览器最大化也是常见的需求,我们只需要调用 maximize_window 函数即可以使浏览器最大化。

from selenium import webdriver

driver = webdriver.Chrome(executable_path="c:/driver/chromedriver.exe")
driver.get("http://www.baidu.com")
driver.maximize_window()  # 最大化浏览器

网页元素定位和操作

大家仔细思考一下,我们用 selenium 操控浏览器是什么意思,其实就是用 selenium 模拟人上网,也就是说人用浏览器能做的任何事情,我们用 selenium 都可以做,selenium 就如一个会上网的机器人一样。

刚刚我们只是简单的学习了用 selenium 打开浏览器并做了对浏览器做了一些简单的操作,大家要知道,我们上网更重要的是对网页做操作,也就是对网页中的控件做操作,想对这些控件做操作,首先,我们就需要先找到它们。

Selenium 提供了 8 种定位方式: id,name,class name,tag name,link text,partial link text,xpath,css selector。 这 8 种定位方式在 Python selenium 中所对应的方法为:

  • find_element_by_id()
  • find_element_by_name(),find_elements_by_name()
  • find_element_by_class_name(),find_elements_by_class_name()
  • find_element_by_tag_name(),find_elements_by_tag_name()
  • find_element_by_link_text(),find_elements_by_link_text()
  • find_element_by_partial_link_text(),find_elements_by_partial_link_text()
  • find_element_by_xpath(),find_elements_by_xpath()
  • find_element_by_css_selector(),find_elements_by_css_selector()

我们发现除了根据 id 定位之外,剩下的 7 中方法都提供两个函数,两个函数唯一的区别是在单词 element 后面多了一个 s 表示复数,带 s 的函数是定位一组元素的写法(也就是找到符合条件的所有元素,结果为一个数组),如果不加 s,则是找到第一个符合条件的元素。而网页中元素的 id 是唯一的(当然如果你非要多个元素同用一个 id 名,只有第一个元素的 id 有效),所以没有 find_elements_by_id 这种查找方法。

我们了解了定位规则,现在就让我们开始搞个栗子吧,我们打开百度主页面,通过前端工具(按 F12)查看到一个元素的属性是这样的,我们现在使用以上 8 种方法去查找元素,我们用单一元素定位的函数,对于一组元素定位的函数使用,大家自行写代码做实验。

<form name="f" id="form" action="/s" class="fm  has-soutu" onsubmit="javascript:F.call('ps/sug','pssubmit');">
    <span id="s_kw_wrap" class="bg s_ipt_wr new-pmd quickdelete-wrap">
        <span class="soutu-btn"></span>
        <input type="text" class="s_ipt" name="wd" id="kw" maxlength="100" autocomplete="off">
        <i class="c-icon quickdelete c-color-gray2" title="清空"></i>
        <i class="quickdelete-line"></i>
        <span class="soutu-hover-tip" style="display: none;">按图片搜索</span>
    </span>
    ......
</form>

现在就让我们定位 input 标签的输入框,下面我们列举了两种定位函数,一种是最直接的方式,另一种是使用 xpath 语法。

driver.find_element_by_id("kw")    # 通过 id 定位
driver.find_element_by_name("wd")  # 通过 name 定位
driver.find_element_by_class_name("s_ipt")  # 通过class name定位
driver.find_element_by_tag_name("input")    # 通过tag name定位

通过 xpath 定位,xpath 定位有 N 种写法,这里列几个常用写法。

driver.find_element_by_id("kw")    # 通过 id 定位
driver.find_element_by_name("wd")  # 通过 name 定位
driver.find_element_by_class_name("s_ipt")  # 通过class name定位
driver.find_element_by_tag_name("input")    # 通过tag name定位

鼠标和键盘操作

我们已经学习了定位元素,定位只是第一步,定位之后需要对这个元素进行操作,或单击(按钮)或输入(输入框),下面就来认识 WebDriver 中最常用的几个方法,在 WebDriver 中,将这些关于鼠标操作的方法封装在 ActionChains 类提供,ActionChains 类提供了鼠标操作的常用方法:

  • perform(): 执行所有 ActionChains 中存储的行为;
  • context_click(): 右击;
  • double_click(): 双击;
  • drag_and_drop(): 拖动;
  • move_to_element(): 鼠标悬停。

我们给大家举例鼠标悬停操作如果写代码,其它的操作行为,大家可以自行试验,多动动手对自己的编码能力提高有很大的帮助。

from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains  # 导入提供鼠标操作的 ActionChains 类。

driver = webdriver.Chrome(executable_path="c:/driver/chromedriver.exe")
driver.get("http://www.baidu.cn")
driver.maximize_window()  # 最大化浏览器为了把设置标签露出来,否则无法移动到那儿
above = driver.find_element_by_id("s-usersetting-top")

'''
对定位到的元素执行鼠标悬停操作
1.调用 ActionChains()类: 将浏览器驱动 driver 作为参数传入。
2.move_to_element(above):将要移动鼠标到这个 above 这个元素上
3.perform:执行所有 ActionChains 中存储的行为,可以理解成是对整个操作的提交动作。
'''
ActionChains(driver).move_to_element(above).perform()

我们上网时操作浏览器,不但有鼠标操作,键盘操作也是必不可少的,比如我们在百度搜索框内搜索某个信息,就输入用键盘输入。selenium 只需要用一个 send_keys 函数就可以模拟键盘把我们想输入的内容输入到浏览器中,比如我们在百度搜索框内输入 selenium。

from selenium import webdriver

driver = webdriver.Chrome(executable_path="c:/driver/chromedriver.exe")
driver.get("http://www.baidu.com")
driver.find_element_by_id("kw").send_keys("selenium")  # 模拟键盘输入

鼠标操作还有单击,双击,右键等等行为,现在我们就结合键盘的输入和鼠标点击行为,使用键盘操作在百度搜索框内输入我们想搜索的内容,然后使用鼠标操作点击百度一下按钮,来实现自动搜索行为。

from selenium import webdriver

driver = webdriver.Chrome(executable_path="c:/driver/chromedriver.exe")
driver.get("http://www.baidu.com")
driver.find_element_by_id("kw").send_keys("selenium")  # 模拟按键输入
driver.find_element_by_id("su").click()  # 单击元素

下拉滚动条

虽然 WebDriver 提供了操作浏览器的前进和后退方法,但对于浏览器滚动条并没有提供相应的操作方法。在这种情况下,就可以借助 JavaScript 来控制浏览器的滚动条。WebDriver 提供了execute_script 函数来执行 JavaScript 代码。window.scrollTo 函数用于设置浏览器窗口滚动条的水平和垂直位置。方法的第一个参数表示水平的左间距,第二个参数表示垂直的上边距。其代码如下:

from selenium import webdriver

driver = webdriver.Chrome(executable_path="c:/driver/chromedriver.exe")
driver.get("http://www.baidu.com")
driver.set_window_size(600, 600)

js = "window.scrollTo(150,100);"  # 通过javascript设置浏览器窗口的滚动条位置
driver.execute_script(js)  # 执行 js 代码

目前为止,我们已经把 selenium 常用的功能都介绍了,掌握了上面这些就可以开始我们的赚钱项目了。


如果以上内容对您有帮助,请老板用微信扫一下赞赏码,赞赏后加微信号 birdpython 领取免费视频。


登录后评论