三、Selenium框架
这里主要以selenium自动化测试框架在爬虫中的应用,selenium能够大幅降低爬虫的编写难度,但是也同样会大幅降低爬虫的爬取速度。
1.selenium介绍
- Selenium是一个Web的自动化测试工具,最初是为网站自动化测试而开发的,Selenium可以直接调用浏览器,它支持所有主流的浏览器,可以接收指令,让浏览器自动加载页面,获取需要的数据,甚至页面截屏等。
2.效果展示
- python代码能够自动的调用谷歌浏览器或phantimjs无界面浏览器,控制其自动访问网站
from selenium import webdriver
# 如果driver没有添加到了环境变量,则需要将driver的绝对路径赋值给executable_path参数
driver = webdriver.Chrome(executable_path='D:\Chrome_webdriver\chromedriver.exe')
# 如果driver添加了环境变量则不需要设置executable_path
#driver = webdriver.Chrome()
# 向url发起请求
driver.get("https://www.baidu.com")
# 把网页保存为图片
driver.save_screenshot("baidu.png")
# 退出模拟浏览器
driver.quit() # 一定要退出! 不退出会有残留进程!
- 有头浏览器与无头浏览器的使用场景
- 通常在开发过程中我们需要查看运行过程中的各种情况所以通常使用有头浏览器
- 在项目完成进行部署的时候,通常平台采用的系统都是服务器版的操作系统,服务器版的操作系统必须使用无头浏览器才能正常运行。
3.selenium的作用和工作原理
- 利用浏览器原生的API,封装成一套更加面向对象的Selenium WebDriver API,直接操作浏览器页面里的元素,甚至操作浏览器本身(截屏,窗口大小,启动,关闭,安装插件,配置证书之类的。)
- python代码 —(调用)—>浏览器厂商提供的webdriver—(调用)—>浏览器
- webdriver本质是一个web-server,对外提供webapi,其中封装了浏览器的各种功能
- 不同的浏览器使用各自不同的webdriver
4.selenium的安装以及简单使用
- 安装模块
- pip install selenium
- 安装driver
- 1.获取浏览器版本
- 2.根据浏览器版本下载驱动 https://npm.taobao.org/mirrors/chromedriver/
- 3.配置
- windows 环境变量 我的电脑-属性-高级-环境变量
- 将下载下来的可执行文件添加到系统的环境变量path中
- 或者
- 直接将下载下来的可执行文件添加到参数executable_path中
from selenium import webdriver
import time
# 1.创建浏览器对象
driver = webdriver.Chrome(executable_path='D:\Chrome_webdriver\chromedriver.exe')
# 2.控制浏览器发送请求
driver.get("https://www.baidu.com")
# 在百度搜索框中搜索'python'
driver.find_element_by_id('kw').send_keys('python')
# 点击'百度搜索'
driver.find_element_by_id('su').click()
time.sleep(6)
# 3. 退出浏览器
driver.quit()
- webdriver.Chrome(executable_path="./chromedriver")中的executable参数指定的是下载好的chromedriver文件的路径
- driver.find_element_by_id(“kw”).send_keys(“python”) 定位id属性值是"kw"的标签,并向其输入字符串"python"
- driver.find_element_by_id(“su”).click() 定位id属性是"su"的标签,并单击
- click函数作用是:触发标签的js的click事件
5.selenium提取数据
driver对象的常用属性和方法
- driver.page.source 当前标签页浏览器渲染之后的网页源代码
- driver.current_url 当前标签的url
- driver.close() 关闭当前标签页,如果只有一个标签页则关闭整个浏览器
- driver.quit() 关闭浏览器
- driver.forward() 页面前进
- driver.back() 页面后退
- driver.screen_shot(img_name) 页面截图 (常用于验证是否运行或者验证码截图)
- driver.title 网页标题
6.selenium元素定位
在selenium中可以通过多种方式来定位标签,返回标签元素对象
- find_element_by_id(返回一个元素)
- find_element(s)_by_class_name(根据类名获取元素列表)
- find_element(s)_by_xpath(返回一个包含元素的列表)
- find_element(s)_by_link_text(根据链接文本获取元素列表)
- find_element(s)_by_partial_link_text(根据链接包含的文本获取元素列表)
- find_element(s)_by_tag_name(根据标签名获取元素列表)给【rvtgb//
- find_element(s)_by_css_selector(根据css选择器来获取元素列表)
find_element和find-elements的区别:
- 多了个s就返回列表,没有s就返回匹配到的第一个标签对象
- find_element匹配不到就抛出异常,find_elements匹配不到会返回空列表
- by_link_text和by_partial_link_text的区别:全部文本和包含某个文本
- 以上函数使用的方法
- driver.find_element_by_id(“id_str”)
7.标签对象提取文本内容和属性值
find_element仅仅能够获取元素,不能够直接获取其中的数据,所以需要以下的方法
- 获取文本element.text
- 通过定位获取的标签对象的text属性,获取文本内容
- 获取属性值element.get_attribute(“属性名”)
- 通过定位获取的标签对象的get_attribute函数,传入属性名,来获取属性的值