学习目标/Target
了解抓取动态网页的实现技术,能够说出Selenium有哪些特点
掌握Selenium和WebDriver的安装与配置,能够独立安装Selenium和WebDriver
掌握Selenium的基本使用,能够使用Selenium 实现抓取动态网页数据的功能
章节概述/Summary
通常,网站上动态网页的比例要远远高于静态网页。相比于静态网页,动态网页不会在加载完成后立即显示所有的内容,而会受时间、环境等因素的影响发生改变。此时再使用第3章的技术已经无法满足需求。为了抓取动态网页,Python提供了Selenium库,通过该库可以模拟用户在浏览器上执行诸如单击按钮、输入文本等行为,获取网页上动态加载的数据。本章将针对抓取动态网页数据的内容进行介绍。
1.抓取动态网页的技术
对于动态网页的数据可以直接使用模拟浏览器运行的方式进行实现,这样做就可以不用管网页内部是如何使用JavaScript渲染页面的,也不用管Ajax请求中到底有没有加密参数,在浏
览器中看到是什么样的内容,扒双的A本心如什么样的内容。Python中提供了许多模拟浏
览器运行的库,.包括Selenium .Splash、PyAutoGUI等。
Selenium Splash PyAutoGUI
Selenium是一个开源的、便携式的自动化测试工具,它最初是为网站自动化测试而开发的, Selenium支持与所有主流的浏览器(如
Chrome、Firefox、Edge、E等)配合使用,也包括诸如PhantomJS、 Headless Chrome等一些无界面的浏览器。
Selenium可以直接运行在浏览器中,模拟用户使用浏览器完成一些动作,包括自动加载页面、输入文本、选择下拉框、单击按钮、单击超链接等。不
过,Selenium本身不带浏览器,它需要通过一个浏览器驱动程序WebDriver才能与所选浏览器进行交互。
2.Selenium和WebDriver的安装与配置
Selenium的安装
Selenium的安装方式非常简单,可以直接使用pip命令安装,具体的安装命令如下。
pip install selenium==3.141.0
若命令行窗口中出现Successfully installed selenium的提示信息,说明成功安装了
Selenium库。
WebDriver的安装
每种浏览器都有一个特定的WebDriver。WebDriver称为驱动程序,通过驱动程序实现Selenium 与浏览器之间的交互。
查看Chrome浏览器版本
单击Chrome浏览器右上角的︰图标打开自定义及控制Google Chrome的菜单,在该菜单中选择“帮助”→“关于Google Chrome”打开关于Chrome页面。
步骤1:
访问chromedriver官网
知道了Chrome浏览器的版本号后,便可以到chromedriver官方网站下载与Chrome浏览器版本对应的chromedriver的下载列表。
步骤2:
下载
chromedriver
单击与浏览器相应版本的ChromeDriver链接,进入chromedriver的下载页面。
步骤3:
安装chromedriver
单击“chromedriver_win_32.zip”链接,下载ZIP格式的压缩包到本地,解压压缩包便可得到chromedriver.exe程序。
步骤4:
将WebDriver配置到系统环境变量后,程序中再次使用WebDriver时,就不需要重复指定WebDriver的执行路径了。
Selenium的基本使用
3.WebDriver类的常用属性和方法
为模仿用户真实操作浏览器的过程,webdriver模块的WebDriver类(表示浏览器)中
提供了一些执行诸如打开浏览器、关团浏览器、刷新贝且、刚匹、旧e寸八J来1"或属性。WebDriver类的常用属性如下所示。
为模仿用户真实操作浏览器的过程, webdriver模块的WebDriver类(表示浏览器)中提供了一些执行诸如打开浏览器、关闭浏览器、刷新页面、前进、后退等入门操作的方法或属性。WebDriver类的常用方法如下所示。
WebDriver类常用方法、示例如下所示。
WebDriver类常用方法、示例如下所示。
4.定位元素
Selenium的 WebDriver类中提供了定位元素的方法,这些方法按照元素的数量可以分为定位单个元素和定位多个元素。WebDriver类中定位单个元素的方法如下所示。
下面演示如何使用Selenium定位元素。
通过id属性定位元素
driver = webdriver.Chrome()
driver.get('http://news.baidu.com/')# 通过id 属性定位元素
element = driver.find_element_by_id('header-wrapper')#访问text属性输出元素的文本内容
print(element.text)
通过class属性定位元素
driver.get(" https://movie.douban.com/subject/30279836/comments?status=P")#通过class属性定位元素
element = driver.find_element_by_class_name('short')print(element.text)
下面演示如何使用Selenium定位元素。
通过指定方式定位元素
find_element()方法是定位元素的通用方法,与其他几个方法相比,它有更加灵活使用方式,可以通过参数指定定位方式。
find_element(self, by=By.ID, value=None)
value:表示元素的名称或属性的值。
by:表示定位方式。
find_element()方法中的参数by表示定位方式,该参数支持的取值及其说明如下所示。
下面演示如何使用Selenium定位元素。
通过指定方式定位元素
使用find_element()方法定位豆瓣电影的评论数据中class属性值为short的元素
导入By类
from selenium.webdriver.common.by import By#通过id属性定位元素
element = driver.find_element(by=By.CLASS_NAME, value='short')#访问text属性输出元素中的文本内容
print(element.text)
5.鼠标操作
常用的鼠标操作有双击、右击、拖曳、按住不动等,它们都封装为ActionChains类的方法。ActionChains类中常用的鼠标操作方法如下所示。
下面演示使用Selenium 实现单击鼠标左键、鼠标指针悬停、
鼠标拖曳的功能。
单击鼠标左键
from selenium import webdriver
from selenium.webdriver import ActionChainsdriver = webdriver.Chrome()
driver.get('https:// www.baidu.com/')driver.maximize_window()
# 定位到登录按钮对应的元素
element = driver.find_element_by_id('s-top-loginbtn')ActionChains(driver).click(on_element=element).perform()
下面演示使用Selenium 实现单击鼠标左键、鼠标指针悬停、
鼠标拖曳的功能。
鼠标指针悬停
from selenium.webdriver import ActionChainsdriver = webdriver.Chrome()
driver.get('http:// www.itcast.cn/")#定位到JavaEE对应的元素
element = driver.find_element_by_class_name('a_gd')#将鼠标移动到指定的元素位置后悬停并执行
ActionChains(driver).move_to_element(element).perform()
下面演示使用Selenium 实现单击鼠标左键、鼠标指针悬停、鼠标拖曳的功能。
鼠标拖曳
from selenium.webdriver import ActionChainsimport time
driver = webdriver.Chrome()
driver.get(‘'https://portal.fuyunfeng.top/plugins_v2/index.html#/slider-verify-example')# 定位元素
element = driver.find_element_by_xpath(" //div[@id='circle']")action = ActionChains(driver)
#创建鼠标移动对象
action.click_and_hold(element)
#按住鼠标左键
action.drag_and_drop_by_offset(element, 100,0)# 向右拖曳100像素time.sleep(2)
#等待2s
action.perform()
6.下拉列表框操作
Selenium中,Select类专门用于处理下拉框,该类提供了以下几个方法从下拉框中选择选项或取消选项。
select_by_index()∶根据索引选择下拉框中的选项,且索引是从О开始的。
select by_value()∶根据值选择下拉框中的选项,这里的值是<option>元素中value属性的值,而不是下拉框中选项的值。
select_by_visible_text()∶根据文字选择下拉框中的选项,这里的文字是<option>元素的文本内容。
deselect_all()∶取消全部选择。
下面通过一个示例演示 Selenium中 Select类的使用,具体代码如下所示。
from selenium import webdriver
from selenium.webdriver.support.ui import Selectdriver = webdriver.Chrome()
driver.get('C:/Users/sun/Desktop/下拉列表框.html')#找到下拉框元素
element = driver.find_element_by_tag_name('select')select = Select(element)
#选择下拉框中第2个选项select.select_by_index(1)
#根据索引选择
7. 弹出框处理
要想处理警告框,Selenium的Alert类中提供了text属性和accept()方法,其中text属性用于获取警告框中的警告消息; accept()方法用于单击确定按钮。
警告框:
from selenium import webdriverimport time
driver = webdriver.Chrome()
driver.get('C:/Users/admin/Desktop/警告框.html')
element = driver.find_element_by_tag_name('button').click()alert = driver.switch_to.alert #选中警告框
print(alert.text)
#输出警告框文本内容
time.sleep(1)
#等待页面加载
alert.accept()
#单击确认按钮
要想处理确认框,Selenium的Alert类中提供了text属性、accept()方法和dismiss()方法,其中text属性和accept()方法与警告框中的作用相同dismiss()方法用于单击“取消”按钮。
确认框:
driver.get('C:/Users/admin/Desktop/确认框.html')
element = driver.find_element_by_tag_name('button').click()alert = driver.switch_to.alert#选中确认框
time.sleep(1)
#等待页面加载
alert.dismiss()
#单击取消按钮
要想处理提示框,Selenium的Alert类中提供了text属性、accept()方法、dismiss()方法和send_keys()方法,前三个属性或方法的作用与确认框中的作用相同, send_keys()方法用于接收用户输入的内容。
提示框:
driver.get('C:/Users/admin/Desktop/提示框.html')
element = driver.find_element_by_tag_name('button').click()alert = driver.switch_to.alert# 选中提示框
time.sleep(1)
#等待页面加载
alert.send_keys('张三')
#接收用户输入内容
alert.accept(
#单击确定按钮
内置等待条件
接下来,通过一个示例演示使用presence_of_element_located获取数据。
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as ECfrom selenium.webdriver.common.by import By
driver = webdriver.Chrome()
driver.get('http://www.itcast.cn/')driver.switch_to.frame('chatlframe')
element = WebDriverWait(driver, 10).until(EC.presence_of_element located(By.CLASS_NAME,"service"-》)print(element.text)
5.4采集集信达的短信服务日志信息
项目实现
分析完如何抓取数据后,使用Selenium库抓取集信达平台上的短信服务日志信息,具体步骤如下1)导入程序中所需使用的库或模块。
( 2)定义JiXinDa类,并在该类中添加两个属性,这两个属性分别是url和driver 。
( 3)在JiXinDa类中,定义 login_to_find()方法,用于处理从访问登录页面到搜索短信服务日志页面的整个操作过程。
(4)在JiXinDa类中,定义get_data()方法,该方法用于分别从网页表格的表头和表格行中提取数据,并将表头数据和表格行数据组合成字典后进行返回。
(5)在JiXinDa类中,定义 save_data()方法,该方法会将抓取的网页数据保存到本地的jixinda.json。
(6 )在JiXinDa类中定义用于启动网络爬虫程序的run()方法。
( 7 )在main语句中创建JiXinDa类的对象,并调用run()方法启动网络爬虫。
小结:
在本章中,我们首先介绍了抓取动态网页的实现技术,介绍了Selenium和WebDriver的安装与配置,接着介绍了Selenium的基本使用,包括入门操作、定位元素、鼠标和键盘操作、下拉列表框操作等,最后运用本章知识开发了一个采集集信达平台短信服务日志信息的项目。希望读者通过本章内容的学习,能够掌握抓取动态网页所需的技术。