selenium
- 优点:可以进行互动的操作,处理动态网页
- 缺点:慢
一、引入
- 爬虫和反爬虫的斗争
- selenium最初本来是用来测试网站的,但是爬虫人员将其引过来可以解决动态网页的问题
静态网页与ajax动态加载
- 以前爬取的网页都是静态的网页
- 何为静态网页,其实就是我们向一个网站发起请求得到响应,那么这些响应的数据都是网页的源代码中,通过response就可以得到数据
- 除了静态网页,还有一些网站数数据不在这个请求得到url地址当中,那么这些护具有可能是通过ajax技术加载出来的数据,例如12306的班次的信息不在url中,查询的内容只是对网页的部分内容更新,这个就是ajax动态加载出来的
- element是最终的显示结果,会经过渲染和多次请求,只能作为参考,只有源代码才是准确的,如果观察element的数据在网页源代码中没有,那就可能藏着其他文件里,动态加载出来的
ajax动态加载的数据怎么处理
- 网页有我们要爬取的数据,但是网页的源码中没有,该如何解决
- 1.分析真正的ajax真正的数据接口,找到接口的url。从而来获取数据
- 2.通过selenium来模拟浏览器获取数据
ajax基本介绍
- 动态了解HTML技术
- JS
• 是网络上最常用的脚本语言,它可以收集用户的跟踪数据,不需要重载页面直接提交表单,在页面嵌入多媒体文件,甚至运行网页 - jQuery
• jQuery是一个快速、简介的JavaScript框架,封装了JavaScript常用的功能代码 - ajax
• ajax可以使用网页实现异步更新,可以在不重新加载整个网页的情况下,对网页的某部分进行更新
- JS
二、配置Selenium、chromdriver
Selenium 介绍
- selenium是一个web的自动化测试工具,最初是为网站自动化测试而开发的,selenium可以直接运行在浏览器上,它支持所有主流的浏览器,可以接收指令,让浏览器自动加载页面,获取需要的数据,甚至页面截屏
- 安装Selenium:pip install selenium, 安装教程
- 要使用Selenium,还要下载浏览器驱动,第一次启用驱动要指定地址,或者将其安装在当前工作目录下
chromedriver
- chromedriver是一个驱动Chrome浏览器的驱动程序,使用他才可以驱动浏览器。当然针对不同的浏览器有不同的driver。以下列出了不同浏览器及其对应的driver:
- chromedriver 地址 http://chromedriver.storage.googleapis.com/index.html 选择和浏览器版本匹配的驱动器
- firefoxdriver类似,火狐浏览器的驱动器
Phantomjs
- 无头浏览器,不会打开页面,它是没有和用户交互界面的,一个完整的浏览器内核,包括js解析引擎,渲染引擎,请求处理等,但是不包括显示和用户交互页面的浏览器
- 用途:
- 1 有的程序是用的是它
- 2 对比的去学习chromedriver
- 区别:
- Phantomjs可以通过截屏driver.save_screenshot(‘baidu.png’)来获取测试结果,不会和 chromedriver一样弹出浏览器窗口,动态看操作步骤。
- Phantomjs对于Selenium是过时的程序,所以会报错警告
三、Selenium的基本操作
- from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import Select - 当属性有空格的时候,定位的时候可能会找不到该元素,例如account-tab-account on 如何解决呢?
- 1.可以选其中的一部分(通过测试)先选择长一点的尝试,去掉on
- 2 xpath来定位
- 注意:没有网的话用 selenium会报错
(一)设置驱动、退出驱动
driver = webdriver.Chrome(路径)
- 路径:填的是chromedriver.exe的路径,如果当前工作文件夹有,可以不填
- Chrome:这个是打开的是Chrome浏览器,也可以选择火狐webdriver.firefox()或无头浏览器webdriver.PhantomJS()
设置无界面模式
- 设置了这个后就不会再弹出浏览器窗口了,可以截屏,但和不同无头浏览器不完全一样,无头浏览器截屏可以看到它是没有浏览器的,不会有拖动框。
# 创建chrome设置对象
options = webdriver.ChromeOptions()
# 设置无界面功能 --headless 浏览器无界面 --xxxx
options.add_argument('--headless')
driver = webdriver.Chrome(options=options)
driver.quit()
- 退出驱动(关闭所有的窗口)
(二)网页打开、关闭等基本操作
1.打开网页、多个网页、切换窗口
打开网页
- get(url)接连打开两个网页,后面会直接覆盖前面的
如何打开多个窗口呢?
- driver.execute_script(‘window.open(“https://www.douban.com/”)’)
- 但是当前工作环境,后面操作对象仍然是前面的窗口,要想在新的窗口进行操作的换,还需要主动的切换窗口
- 有时候窗口中有很多子tab页面。这时候肯定是需要进行切换的。selenium提供了一个叫做switch_to_window来进行切换,具体切换到哪个页面,可以从driver.window_handles中找到
切换窗口
- driver.switch_to.window(driver.window_handles[1]) 序号就是代指了网页的顺序索引,从0开始
显示当前窗口
- driver.current_url
2.关闭当前窗口
driver.close()
- 关闭当前窗口,只会关闭一个,当前如果有多个窗口的话,只会关闭当前工作的窗口
- 因为关闭的是当前工作的窗口,所以后面再继续操作都会报错,即使打开另一个窗口的操作也不行,这个时候就必须要切换还在的窗口,然后再进行下一个步骤
3.网页全屏与截屏
全屏
- driver.maximize_window()
网页截屏
- driver.save_screenshot(‘图片名.png’)`
- 截取的是当前工作的网页
(三)定位元素
- 通过定位元素,就可以在指定的位置操作元素
方法
- element匹配第一个
elements 匹配所有,返回列表- driver.find_element(By.某,对应某值)
driver.find_elements(By.某,对应某值) - driver.find_element_by_ 某(对应某值)
driver.find_elements_by_ 某(对应某值)
- driver.find_element(By.某,对应某值)
1.通过标签
- driver.find_element_by_tag_name(‘标签名’)
driver.find_elements_by_tag_name(‘标签名’) - 不够精确,不常用
2.通过属性值
- id
- driver.find_element_by_id(‘属性值’) 方法指定属性
driver.find_elements_by_id(‘属性值’) - driver.find_element(By.ID,‘属性值’) 括号指定属性
driver.find_element(By.ID,‘属性值’)
- driver.find_element_by_id(‘属性值’) 方法指定属性
- class(by_class_name用的是class_name)、name、link等属性同理
3.通过xpath
- driver.find_element_by_xpath(xpath路径)
- 可以直接复制某行的xpath的路径
(四)标签元素处理
1.获取文本text
- tag.text
2.获取属性值get_attribute('属性')
- tag.get_attribute(‘属性’)
3.获取文本输入框内容get_attribute('value')
- InputTag.get_attribute(‘value’)
(五)操作元素
1.输入框-----传值send_key()与清空值clear()
send_key()传值
- 第一步:找到这个元素input_tag,定位到的输入框标签位置。
第二步:使用send_keys(value),将数据填充进去
input_tag.send_keys(‘要传的值’)
clear()清空值
- input_tag.clear()清空输入值
2.按钮-----click()点击
- 操作按钮有很多种方式。比如单击、右击、双击等。这里讲一个最常用的。就是点击
click()点击
- 第一步:找到这个元素button,定位到的按钮标签位置。
第二步:使用.click()
button.click()