准备工作

简介

selenium是python的一个第三方模块,一个自动化模块,相当于模拟人对浏览器的操作.常用于爬虫和自动话测试等等.

安装selenium

selenium是一个第三方模块,我们需要自己安装,下面我们使用pip来安装

python selenium 单个用例运行 python中selenium_python

红框中的提示安装成功了.下面来检测下是否安装成功

在cmd中输入python(前提是配置好python的环境变量)

python selenium 单个用例运行 python中selenium_python_02

如果import selenium没有报错则说明下载成功,如果没成功则会报如下图所示的错误

python selenium 单个用例运行 python中selenium_selenium_03


不要在意包不是selenium包 哈哈

下载浏览器驱动

并不是有了selenium包之后我们就可以操作浏览器了,我们还得需要对应的浏览器驱动.我用的是chrome浏览器,需要的浏览器驱动是chromedriver.

下载chromedriver

下载地址:chromedriver下载地址 需要注意的是:浏览器的驱动版本最好和浏览器一致.

我的浏览器版本为79.0.3945.88

python selenium 单个用例运行 python中selenium_实例化_04

chromedriver下载网页如下

python selenium 单个用例运行 python中selenium_chrome_05

并没有和我浏览器对应版本的,那就下载一个贴近的就行了

配置chromedriver

其实就是让selenium找到chromedriver.有2种方法
1.把下载的chromedriver浏览器驱动放在python安装目录的根目录下
比如我的python安装目录为:D:\Python35,那么就把chromedriver放在D:\Python35目录下即可

2.在实例化selenium的时候作为参数加入,如下

#chromedriver放置的位置
chromedriver_path='C:/Users/lgx/Downloads/chromedriver_win32/chromedriver.exe'
#实例化selenium,引入chromedriver
driver=webdriver.Chrome(executable_path=chromedriver_path)

从上可知,我们可以把chromedriver放于某个地方,当使用到它的时候引用即可
这里只说引用chromedriver浏览器驱动,具体的下面会说.建议大家使用第一种方式

到此,我们的准备工作就完成了.

selenium

selenium模块的webdriver包

实际上,我们是使用selenium模块中的webdriver包来模拟人对浏览器的操作.
下面我们先来说说的webdriver的简单使用过程

  1. 导入selenium模块中的webdriver包
  2. 实例化webdriver
  3. 打开网页
  4. 定位标签元素
  5. 执行动作
  6. 获取所需要的信息

导入selenium包

from selenium import webdriver  #就是用webdriver来操作浏览器驱动的

实例化webdriver

#在实例化中,我们可以加入很多参数,比如上文说的chromedriver的存在路径
#和无窗口模式等等,无窗口模式会在下文讲到
driver=webdriver.Chrome()

打开网页

url='https://www.baidu.com/'
driver.get(url) # 通过get()方法打开网页,需要传入目标网址

定位标签元素

一个HTML网页是由许许多多的标签元素组成的,我们想使用selenium点击网页上的某个按钮,就得先定位到这个按钮所在的标签元素,然后再对其进行操作.

定位标签元素的方法

一般用8种方法来定位标签方法,分别是:
1.通过元素的id来定位:find_element_by_id(id的值)
2.通过class属性来定位元素:find_element_class_name(class的值)
3.通过标签的名字来定位:find_element_by_tag_name(标签的名字)
4.通过css样式定位元素:find_element_by_css_selector(css选择器)
5.通过标签的name来定位:find_element_by_name(节点中的name的值)
6.通过文字链接来定位元素:find_element_by_link_text(文字链接)
7.通过部分文字链接来定位素:find_element_by_partial_link_text()
8.通过xpth()来定位:driver.find_element_by_xpath(x_path)

是不是很多,但是今天要讲一种超级简单好用的定位标签元素方法,那就是最后一个方法,前面7种你可以在深入之后再学习.

x_path是指标签在HTML中的位置,有绝对路径和相对路径.我们通过调用driver.find_element_by_xpath()方法,再传入x_path路径,就可以很容易定位到目标.

那么我不懂找x_path路径怎么办,别担心,强大的chrome浏览器已经帮你找出来了,你只需要复制即可.具体下文说.

执行操作

我们定位到某个标签元素之后,就可以对其进行操作了.最常见的操作有点击按钮,在输入框中输入值.
下面是这2个操作的方法:
click():点击
send_keys()

获取所需要的信息

当我们不能通过requests模块来爬取我们需要的信息的时候,就可以使用selenium来爬取.比如使用requests来爬取动态网页时候,源码里面并没有我们需要的信息,而selenium模拟人操作浏览器,可以触发js生成的内容,源码里面就有了我们需要的信息.

selenium登录人人网

下面是使用selenium登录人人网的例子,下面先分析

python selenium 单个用例运行 python中selenium_chrome_06

人人网的登录界面是这样,如果是我们登陆的话,我们需要怎么做呢,如果我们之前已经有了账号,那我们需要4步:
1,打开人人网站
2.点击账号框,然后输入账号
3.点击密码框,然后输入密码
4.点击登录按钮

下面我们使用selenium来模拟我们的这4步.

1.打开人人网网站

driver.get(url) # url就是人人网的网址

2.点击账号框,然后输入账号

我们要向点击账号框并且向里面传值,就需要定位到账号框所在的标签元素.上文我们说使用find_element_by_xpath()方法来定位是非常简单的,而且chrome浏览器也为我们找出了标签元素的的x_path值,下面就展示使用chrome找出目标标签元素的x_path值:

在人人网的登录界面右键鼠标,选中检查或者使用快捷键F12

python selenium 单个用例运行 python中selenium_selenium_07

打开之后,选中Elements,点击左边的鼠标指针,用它来选中我们的目标账号框

python selenium 单个用例运行 python中selenium_实例化_08


选中账号框之后,点击一下,就可以在Elements中定位到了账号框所在的标签元素.从下图可以看到有红框中有背景颜色这行就是账号框的标签元素

python selenium 单个用例运行 python中selenium_chrome_09


定位到目标标签元素之后,chrome怎么给我找出其的x_path的值呢?看下图,选中目标标签元素鼠标右键,选择copy,在其展开的菜单中是不是看到了2个有xpath的选择,其中Copy XPath是复制目标标签元素的相对xpath路径,而Copy full XPath是复制目标标签原色的绝对路径.这2个选中其一即可.

python selenium 单个用例运行 python中selenium_实例化_10


是不是chrome已经给我们找出来了呢?

找到了x_path的值,将其传入find_element_by_xpath()方法中即可
定位到账号框中,我们需要点击和传值,如下所示

#点击账号框
driver.find_element_by_xpath('//*[@id="email"]').click()
#在账号框输入账号
driver.find_element_by_xpath('//*[@id="email"]').send_keys('你的账号')

同理点击密码框和登录按钮也是这样操作

#点击密码框
driver.find_element_by_xpath('//*[@id="password"]').click()
#在密码框中输入密码
driver.find_element_by_xpath('//*[@id="password"]').send_keys('你的密码')
#点击登录按钮
driver.find_element_by_xpath('//*[@id="login"]').click()

其实不用点击账号框和密码框也可以直接传值的,也就是说可以省略点击的操作.

点击和传值

driver.find_element_by_xpath('//*[@id="email"]').click()
driver.find_element_by_xpath('//*[@id="email"]').send_keys('账号')

等同于

不点击,直接传值

driver.find_element_by_xpath('//*[@id="email"]').send_keys('账号')

源码

from selenium import webdriver
import time

url='http://www.renren.com/SysHome.do'      #人人网的网址
chromedriver_path='C:/Users/lgx/Downloads/chromedriver_win32/chromedriver.exe' #chromedriver的保存路径
driver=webdriver.Chrome(executable_path=chromedriver_path) #实例化webdriver,并传入浏览器驱动的位置
#driver=webdriver.Chrome()  #如果你已经把chromedriver驱动放在了python的安装目录下,可以把上面二行代码去掉
driver.maximize_window()
driver.get(url)     #打开网页
driver.find_element_by_xpath('//*[@id="email"]').click()    #点击账号框
driver.find_element_by_xpath('//*[@id="email"]').send_keys('zhanghao') #输入账号
driver.find_element_by_xpath('//*[@id="password"]').click()  #点击密码框
driver.find_element_by_xpath('//*[@id="password"]').send_keys('mima') #输入密码
driver.find_element_by_xpath('//*[@id="login"]').click() #点击登录按钮
time.sleep(5)
driver.close()  #关闭浏览器

有话说

当初我想学习如何使用python实现自动登陆网页来减轻工作的重复性以及解放双手,在网上找了一大堆教程,但是大多数是不完整,copy之后不是这出问题就是那出问题.因为我自己小白并且比较笨,所以看了很多的教程还是处于一脸蒙蔽的状态.我想少数和我一样想学习python的人在入门的路上走得顺一点,所以就在在会了一些浅薄的用法之后,献丑滴写出了这个教程.