爬虫基础——selenium的使用

本文主讲:selenium的安装与使用等等…..

selenium环境安装【重点】

什么是selenium以及selenium怎么实现抓取网页数据

答:selenium是web自动化测试工具,不是浏览器,它常常配合浏览器来实现网站的自动化测试,也就是说selenium可以自动化操作留浏览器进行一些行为,selenium配合浏览器就可以实现数据的抓取(可见即可得)

怎么查看python安装在哪个路径的指令(win与linux)

window指令:where python

image-20211013152832885

linux指令:whereis python

image-20211013152021640

怎么安装 selenium 工具(库)

Windows + linux指令:pip3 install selenium

安装 selenium + 浏览器工具的环境步骤

使用selenium + 浏览器最常见的四种组合如下:

1:selenium + PhantomJS

2:selenium + Chrome + chromedriver

3:selenium + Firefox + geckodriver

4:selenium + Edge +

注意:其中后面带有driver就是浏览器驱动程序,PhantomJS是无头浏览器因此不需要驱动(行为都在内存中发生!)

安装步骤:

注意:下面常用的程序都可以在淘宝镜像网站中下载: https://npm.taobao.org/mirrors

第一步:首先确保你的电脑(windows与linux)都安装了这四个浏览器以及 selenium 工具,剩下的就是安装对应的浏览器驱动

PhantomJS下载地址:https://npm.taobao.org/mirrors/phantomjs/

第二步:下载每个浏览器的驱动(下载windows以及linxu版本)

chromedriver下载地址(下载与chrome版本一致的驱动):https://npm.taobao.org/mirrors/chromedriver/
注意:没有一致的版本就下载最接近的

geckodriver下载地址(下载版本最大的那个驱动):https://npm.taobao.org/mirrors/geckodriver/v0.29.1/

image-20211013152113696

第三步:下载完成驱动后将驱动解压(所有压缩文件全部解压),剪切到对应文件夹下面

windows:python路径下面的Scripts文件夹下

image-20211013152123877

linux:家目录下的usr文件夹下的bin文件夹放入成功后,将这个驱动程序权限更改为最高权限

注意:在linux下放入指定文件夹下的浏览器驱动程序是解压完成的程序,不是压缩文件!!

对应指令:

sudo cp 驱动文件名 /usr/bin 将驱动放入对应文件
sudo chmod 777 /use/bin/驱动文件名

第四步:进行测试,可以正常打开浏览器并且不闪退即可

image-20211013152144737

selenium应用【重点】

怎么利用selenium配合浏览器打开指定网页并且对网页进行一些操作

语法:

from selenium import webdriver 导入模块

浏览器对象 = webdriver.Chrome( ) 打开Chrome浏览器(也可以是其他浏览器,前提是安装其他浏览器的驱动)

浏览器对象.get(“指定网站”) 在Chrome浏览器内打开指定网站

浏览器对象的一些常用方法以及属性

答:在获得浏览器对象之后,我们可以对浏览器对象执行以下方法 其中browser代指浏览器对象

browser.get(“指定网站”) :在浏览器内打开指定网站

browser.maximize_window( ):将浏览器窗口最大化

browser.save_scrrenshot("图片名称"):将浏览器当前所在的页面进行截图保存

browser.page_scurce:获取浏览器当前页面的前端最终渲染的数据代码

browser.page_scurce.find(“字符串”):获取浏览器当前页面的前端最终渲染的数据代码,并在代码中查找执行字符串,查不到直接返回-1,常常用于网站最后一页的判断

browser.quit( ):关闭浏览器

browser.close():关闭当前网页

element_obj= browser.find_element_by_xpath(xpath语法):在浏览器内获取第一个符合xpath语法的结点对象

element_obj= browser.find_element_by_id (id属性值):在浏览器内获取第一个符合id属性值的结点对象

element_obj= browser.find_element_by_name (name属性值):在浏览器内获取第一个符合name属性值的结点对象

element_obj= browser.find_element_by_class_name (class属性值):在浏览器内获取第一个符合class属性值的结点对象

element_obj= browser.find_element_by_link_text (a标签文本):在浏览器内获取第一个符合a标签内文本的结点对象

element_obj_list = browser.find_elements_by_xpath(xpath语法):在浏览器内获取全部符合xpath语法的结点对象,并且返回存放所有对象的列表

利用selenium+浏览器匹配数据的注意事项

1:浏览器对象在查找指定节点对象时,如果方法中的element不带s,那么就查找第一个符合规则的结点对象返回,如果带s,那就查找所有符合规则的结点对象,并且存放在指定列表中返回这个列表

2:浏览器对象根据xpath查找指定节点时,可以直接在前端的控制台找到指定节点,右键复制当前节点的xpath即可,这是为什么呢?因为利用selenium获得的数据是前端最终渲染出来的数据,而不是响应源代码,因此利用selenium匹配数据真正实现了可见即可得,管你是动态渲染还是什么,只有一句话,牛批!

图示:

image-20211013152221244

四:浏览器对象在成功匹配指定节点后对这个结点的一些操作指令

指定节点对象 . send_keys(“待查找的数据”):向这个结点对象发送指定数据,一般这样的结点都是搜索框结点

指定节点对象.click():点击这个结点

指定节点对象.clear():清空结点对象中的内容(常用于清空搜索框中的默认数据)

指定节点对象.get_attribute( ):获取这个结点的属性值

指定节点对象.get_attribute( “title”):获取这个结点的 title 属性值

指定节点对象.text :获取这个结点对象的文本值(包括当前节点以及所有子节点的文本)!

注意事项:

1:获取结点以及子节点的文本内容,是利用结点对象的text属性,而不是text方法!!!!,切记切记!!!

2:浏览器对象.find_elements_by_xpath(xpath表达式)获取到所有符合xpath表达式的结点对象,这个结点对象与利用etree库的xpath表达式在响应源代码中提取的结点对象不一样!!!

总结截图:

image-20211013152239461

selenium高级应用【重中之重】

怎么把Chrome以及firefox浏览器设置为无头模式!

为什么要设置为无头浏览器?

答:无头浏览器性能更好一些,可以在不打开浏览器窗口的情况下进行数据的抓取

设置语法:

from selenium import webdriver 导入模块

options = webdriver.ChromeOptions( ) 创建选项对象,注意ChromeOptions( ) 中的O是大写

options.add_argument("--headless") 向这个选项对象中添加“headless”参数,代表无头

Browser = webdriver.Chrome(options = options) 创建浏览器时,将设置好的options参数传入

图示:

image-20211013152255642

selenium打开的浏览器怎么执行javascript脚本

语法:浏览器对象.excute_script("javascript脚本代码)

实例:browser.excute_script ( " window.scrollTo (0,document.body.scrollHeight )" )

浏览器执行 window.scrollTo (0,document.body.scrollHeight)这段javascript代码,将滚动条滚到最下方

图示:

image-20211013152310256

selenium配合浏览器抓取数据的注意事项

1:执行网站换页操作时,如果网站有输入第几页跳转,尽量用那个进行换页,因为如果程序在某一页报错,可以很容易知道在那一页报错

image-20211013152321863

2:抓取动态网页时,浏览器对象需要执行javascript脚本代码(将滚轮滑到最底部!)

3:利用find_enements_by_xpath抓取的结点对象集合,然后再循环遍历,调用结点的text属性,获取当前节点以及后代节点的所有文本数据,如果数据不容易被处理,可以在当前节点下调用find_enement_by_xpath方法,在查找具体的数据结点,然后调用text属性获取数据!!

image-20211013152405296

4:如果在前端页面源码内复制结点的xpath查找不到数据!!!!,记得要自己在写一下xpath语句试一试

怎么利用selenium操控键盘操作(不是特别重要)

image-20211013152428259

怎么利用selenium操控鼠标操作

用selenium操作鼠标有什么用?

答:有的网站部分功能是动态加载的,你需要把鼠标放在一些元素结点上面,其他的元素结点才能被加载出来,这是我们就要用selenium模拟鼠标操作,将鼠标移动到元素节点上,这样才可以操作动态加载的其他元素结点

image-20211013152506145

操作语法:

from selenium.webdriver import ActionChains 导入模块

ActionsChains(浏览器对象).move_to_element(to_element = 指定节点). perform() 将鼠标移动到指定目标结点处!

注意事项:必须要执行 perform方法才能真正将鼠标移动到目标结点处!

图示:

image-20211013152526149

代码截图:

image-20211013152534553

怎么利用selenium切换句柄(切换浏览器窗口)

切换句柄的使用场景:利用selenium创建浏览器对象,打开指定网站,在网站内点击一个链接后,又打开了一个新的窗口,但是我们的浏览器对象还是处在第一个网站的结点源代码中,想要对新窗口中的网站进行一些操作就要将浏览器对象切换到后打开网站的那个结点源代码中(句柄)

语法:

from selenium import webdriver 导入模块

浏览器对象 = webdriver.Chrome( ) 创建浏览器对象

all_handles = 浏览器对象.window_handles 获取当前浏览器对象所有打开的窗口对象,并存放到列表内(左边第一个窗口列表下标为0)

浏览器对象.switch_to.windows(指定窗口对象) 将浏览器切换到指定窗口

注意事项:

1:window_headles 方法功能是获取当前浏览器的所有窗口对象,并存放在一个列表内,最左面的窗口列表下标为0

2:切换窗口中的窗口不是正常浏览器中的窗口,这里指代浏览器所处在的那个结点源代码中!

代码截图:

image-20211013152555406

selenium高级操作【重中之重】

须知:如果在前端页面源码内复制结点的xpath查找不到数据!!!!,记得要自己在写一下xpath语句试一试

selenium 控制浏览器对象切换iframe(内嵌框架)的背景

答:有的网站前端渲染后的html代码是嵌套类型的,就是一个网页html代码中有一个或者多个iframe结点,其中一个iframe结点就代表一个全新的网页(一般网站的登录功能都是一个iframe结点),当利用 selenium 获取 iframe 结点下面子节点并对其操作时,是不能成功的,因为 selenium 只能从 iframe 结点外面的其他结点数据中查找其他的元素,对于这种情况就要用 selenium 控制浏览器切换 iframe了,这样就可以定位到 iframe 结点中的其他结点并对其操作啦!!

注意:一般登录功能区都在iframe结点下面哦!!

selenium 怎么切换 iframe

语法1:

from selenium import webdriver

导入模块

iframe_node = 浏览器对象.find_element_by_xpath( "xpath语法" ) 查找待切换的iframe结点对象

浏览器对象.switch_to.frame(查找到的iframe结点对象) 利用switch方法进行切换,切换成功后即可定位iframe结点下的子节点并对其操作

语法2:
from selenium import webdriver

导入模块
浏览器对象.switch_to.frame ( iframe结点的 id|name 属性值 ) 通过目标 iframe 结点的 id、name属性值可直接定位iframe结点切换

注意事项:

1:浏览器对象.switch_to.frame(查找到的iframe结点对象) 中的frame没有I

2:如果目标 iframe 结点中有 id 以及 name 属性,那么直接通过第二种语法定位iframe结点

代码截图:

image-20211013152746826

selenium 切换到iframe结点后怎么切换回来(其他的层)

语法:

浏览器对象.switch_to.parent_frame( ):切换到当前iframe结点的上一级处!

浏览器对象.switch_to.default_content( ):切换到主界面(刚打开浏览器所在的界面)

未完待续……