第6章-selenium的使用+iframe+tesseract
一、ajax基本介绍
1、ajax
ajax可以使⽹⻚实现异步更新,在不重新加载整个⽹⻚的情况下,对⽹⻚的某部分进⾏更新
如上图:车次信息在网页源码中不存在,更换查询的“出发/目的地及日期”时,通过ajax技术不对整个网页进行加载,只对查询的车次进行更新
2、获取ajax数据的方式
(1)通过“检查-Network”直接分析ajax调⽤的数据接⼝,找到真实的URL,然后通过代码请求这个数据接⼝
(2)使⽤Selenium+chromedriver模拟浏览器⾏为获取数据
二、selenium
1、selenium介绍
- selenium是⼀个web的⾃动化测试⼯具,最初是为⽹站⾃动化测试⽽开发的。selenium可以直接运⾏在浏览器上,它⽀持所有主流的浏览器,可以接收指令,让浏览器⾃动加载⻚⾯,获取需要的数据,甚⾄⻚⾯截屏。
- chromedriver是⼀个驱动Chrome浏览器的驱动程序,使⽤它才可以驱动浏览器。当然针对不同的浏览器有不同的driver。
- 浏览器驱动下载地址:(淘宝镜像)https://developer.aliyun.com/mirror/NPM?from=tnpm
- 将驱动程序的可执行文件拷贝到python目录下
2、PhantomJS常用语法
PahantomJS:是一个⽆头浏览器,也就是不包括显示页面、⽤户交互⻚⾯的浏览器(⼀个完整的浏览器内核,包括js解析引擎,渲染引擎,请求处理等)
from selenium import webdriver
# 1.加载网页驱动
driver = webdriver.PhantomJS()
# 2.打开网页
driver.get('http://www.baidu.com')
# 3.定位操作-搜索框
search = driver.find_element_by_id('kw')
# 4.输入关键字-搜索的内容
search.send_keys('pyhton')
# 5.点击搜索按钮"百度一下"
driver.find_element_by_id('su').click()
# 6.截屏
driver.save_screenshot('baidu.png') # 只能匹配.png格式
# 7.查看源码
print(driver.page_source) # 不带括号
# 8.查看当前请求的url
print(driver.current_url) # 不带括号
3、selenium的使用
3.1快速入门
from selenium import webdriver
import time
driver = webdriver.Chrome() # 加载chrome浏览器的驱动
driver.get('https://www.baidu.com') # 通过selenium打开百度
time.sleep(3) # 等待3秒钟
print(driver.current_url) # 打印当前的url
driver.quit() # 关闭浏览器的所有窗口
driver.close() # 关闭当前窗口(只有一个窗口将同时关闭浏览器)
3.2定位元素
注意:
- find_element 是获取第⼀个满⾜条件的元素, find_elements是获取所有满⾜条件的元素
- find后面()中的字符串,绝不能出现空格(否则会报错),可以只写一部分字符串
3.3操作表单元素
3.3.1 针对input标签
- send_keys(value):在输入框中填充数据
- clear():清除输⼊框中的内容
- click():鼠标单击功能
from selenium import webdriver
import time
driver = webdriver.Chrome()
driver.get('https://www.baidu.com')
inputTag = driver.find_element_by_id('kw') # 定位输入框
inputTag.send_keys('python') # 输入数据
searTag = driver.find_element_by_id('su') # 定位搜索按钮
searTag.click() # 点击搜索
time.sleep(3) # 等待3秒钟
inputTag.clear() # 清空搜索框
driver.close() # 关闭当前窗口
3.3.2 针对select标签(iframe)
select标签:不能直接点击,因为点击后还需要选中元素(如:下拉式菜单)。这时候selenium就专⻔为select标签提供了⼀个类-selenium.webdriver.support.ui.Select;将获取到的元素当成参数传到这个类中,创建对象,后续可使⽤这个对象进⾏选择。
iframe会嵌套页面的一些属性/元素(通过iframe中的另一个ip地址,嵌套整个页面或者页面的一部分,),如果要定位的元素存在于iframe中,那么直接在原始页面中去定位元素是定位不到的,需要切换到iframe中再去定位需要定位的元素。
from selenium import webdriver
from selenium.webdriver.support.ui import Select
driver = webdriver.Chrome()
driver.get('https://www.17sucai.com/pins/demo-show?id=5926')
# 1.切换到iframe中
driver.switch_to_frame(driver.find_element_by_id('iframe')) # 删除线表示此方法已过时,但还可以用
# 2.将获取到的元素当成参数传到类中创建对象
selectTag