《Python网络爬虫基础教程》课件 第5章 抓取动态网页数据_第1页
《Python网络爬虫基础教程》课件 第5章 抓取动态网页数据_第2页
《Python网络爬虫基础教程》课件 第5章 抓取动态网页数据_第3页
《Python网络爬虫基础教程》课件 第5章 抓取动态网页数据_第4页
《Python网络爬虫基础教程》课件 第5章 抓取动态网页数据_第5页
已阅读5页,还剩104页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第5章抓取动态网页数据《Python网络爬虫基础教程》学习目标/Target了解抓取动态网页的技术掌握Selenium和WebDriver的安装与配置,能够独立安装Selenium和WebDriver掌握Selenium的基本使用方法,能够使用Selenium实现抓取动态网页数据章节概述/Summary随着前端技术的发展,动态网页日益增多,这类网页的内容不会在加载时一次性完全呈现,而是会根据时间、用户交互行为或环境参数实时更新,此时仅依赖第3章介绍的技术已无法满足数据抓取需求。为了突破动态网页抓取的壁垒,Python提供了强大的Selenium库,该库通过模拟真实用户在浏览器中的操作,驱动浏览器完整执行JavaScript代码,进而获取动态渲染后的完整网页内容。本章将针对抓取动态网页数据的内容进行介绍。目录/Contents5.15.25.3抓取动态网页的技术Selenium和WebDriver的安装与配置Selenium的基本使用5.4实践项目:采集集信达平台的短信服务日志信息抓取动态网页的技术5.1了解抓取动态网页的技术,能够区分每种技术有哪些不同学习目标5.1抓取动态网页的技术早期Web开发以静态网页为主,其内容以固定HTML格式存储于服务器,用户访问时服务器直接返回预先生成的页面源码,比如传统企业官网首页、产品介绍页等。随着前端技术的发展,动态网页逐渐成为主流,这类网页不是一次性返回完整内容,而是在用户访问时实时生成核心数据,这些数据可能随时间推移刷新、根据用户交互触发更新或基于环境参数调整,这为数据抓取带来了全新挑战。5.1抓取动态网页的技术当浏览器加载动态网页时,首先向服务器请求包含基础页面结构的初始HTML文档,但核心数据通常不在其中,然后继续执行JavaScript代码,通过AJAX或Fetch等技术向后端异步请求获取真实数据,将其动态插入节点树的对应位置,触发浏览器重新渲染页面,从而实现内容的实时更新。因此,前面介绍的网络爬虫技术仅能获取初始源码,由于无法执行JavaScript代码,难以无法获取动态加载的内容。5.1抓取动态网页的技术对动态网页数据抓取,最直接方式是定位AJAX接口并直接调用,即通过浏览器开发者工具捕获网页加载时的AJAX请求,让网络爬虫模拟该请求获取数据,此方式绕开前端渲染逻辑,效果极高,但如果接口参数经过复杂加密或依赖浏览器环境,则直接调用可能无法获取。另一种主流方案是模拟浏览器行为,通过自动化工具驱动浏览器完整执行JavaScript代码,获取与用户实际看到一致的页面内容,避免因动态渲染导致的数据缺失问题。在Python中,Selenium、Playwright、Pyppeteer等库提供了强大的浏览器模拟功能。5.1抓取动态网页的技术SeleniumPlaywrightPyppeteerSelenium是开源的跨平台自动化工具,最初专为Web应用自动化测试设计,如今已广泛应用于网络爬虫领域,特别擅长处理动态网页的数据抓取,能够高度模拟真实用户在浏览器中的各类交互行为。Selenium可以与主流的浏览器深度集成,既支持Chrome、Firefox、Edge等带界面的浏览器,也兼容PhantomJS、HeadlessChrome等无界面浏览器,适配场景十分灵活。Selenium通过驱动程序能够启动并操控浏览器,让浏览器按照预设指令像人类操作一般自动完成一系列动作,例如,自动加载网页、输入文本、选中复选框、选择下拉菜单、单击按钮、滚动页面、切换窗口等。需要注意的是,Selenium本身不包含浏览器内核,必须依赖与浏览器版本匹配的驱动程序,才能实现对浏览器的启动与控制。5.1抓取动态网页的技术Playwright是微软推出的新一代跨平台浏览器自动化工具,全面支持Chromium、WebKit和Firefox三大主流内核,相比Selenium,它凭借异步编程架构实现了更高的执行效率,并提供了更简洁直观的API设计,大幅降低了自动化操作的编码复杂度。Playwright的优势主要有3个,一是轻量化无头模式,资源占用更低,尤其适合大规模并发抓取任务;二是智能等待机制自动处理元素加载,避免因动态渲染延迟导致的抓取失败;三是深度交互能力,支持拦截网络请求、修改请求头及执行JavaScript脚本。尽管Playwright具备后发技术优势,但其作为较新的工具,目前社区资源和成熟案例相比Selenium仍有一定差距,适合对性能要求高且愿意接受新技术的开发者使用。5.1抓取动态网页的技术SeleniumPlaywrightPyppeteerPyppeteer是一款专为Python设计的浏览器自动化工具,它基于Chromium内核并提供与Node.js版Puppeteer高度一致的API接口。作为轻量级解决方案,Pyppeteer无需额外安装浏览器驱动即可直接调用Chromium,通过Python的asyncio框架支持异步操作,可高效处理大量并发请求,特别适合高性能爬虫任务与自动化测试场景。不过,Pyppeteer仅支持Chromium内核浏览器,对Firefox、WebKit等其他浏览器内核的兼容性存在限制,在需要跨浏览器测试的场景中适用性有限。5.1抓取动态网页的技术SeleniumPlaywrightPyppeteer由于Selenium在互联网上拥有丰富的文档资源和活跃的社区支持,本书选择以其作为核心开发工具。Selenium通过WebDriver与浏览器内核深度协作,构建了功能完备的网络爬虫,尤其擅长处理依赖JavaScript渲染的动态网页。这种“工具+驱动”的架构设计,使其能够精准模拟真实用户操作,成为动态网页抓取中“所见即所得”的经典解决方案。5.1抓取动态网页的技术Selenium和WebDriver的安装与配置5.2掌握Selenium和WebDriver的安装,能够独立安装Selenium和WebDriver学习目标5.2Selenium和WebDriver的安装与配置在使用Selenium抓取动态网页数据前,需先在计算机上安装Selenium库及配套的浏览器驱动WebDriver。为避免在爬虫程序中重复指定WebDriver的执行路径,还需为其配置系统环境变量。接下来,分别对Selenium的安装、WebDriver的安装、WebDriver的配置进行介绍。5.2Selenium和WebDriver的安装与配置5.2Selenium和WebDriver的安装与配置Selenium的安装方式非常简单,直接通过pip命令安装即可,具体的安装命令如下。pipinstallselenium==4.32.0执行上述命令,若命令提示符窗口中出现“Successfullyinstalledselenium”的提示信息,则说明Selenium库及其相关依赖成功安装。1.Selenium的安装5.2Selenium和WebDriver的安装与配置WebDriver即驱动程序,用于实现Selenium与浏览器之间的通信,它通过标准化协议将Selenium的命令转换为浏览器可执行的操作指令,支持页面导航、元素交互、JavaScript执行等浏览器功能。由于不同浏览器内核的实现差异,每个浏览器需要使用专属的驱动程序,常见的浏览器及其对应的驱动程序如表所示。浏览器驱动程序Chromium或ChromeChromeDriverFirefoxGeckoDriverEdgeMicrosoftWebDriverOperaChromeDriverSafarisafaridriver2.WebDriver的安装5.2Selenium和WebDriver的安装与配置需要说明的是,不同版本的浏览器驱动程序支持的浏览器版本也不同,因此在下载浏览器的驱动程序之前,需要先查看当前浏览器的版本号。5.2Selenium和WebDriver的安装与配置步骤1步骤2步骤3步骤4查看Chrome浏览器版本单击Chrome浏览器右上角的按钮,在弹出的快捷菜单中选择“帮助”→“关于GoogleChrome”,打开“关于Chrome”页面。5.2Selenium和WebDriver的安装与配置步骤2步骤1步骤3步骤4访问chromedriver官网打开ChromeDriver官方网站,下载与Chrome浏览器版本对应的ChromeDriver。ChromeDriver的下载页面如图所示。5.2Selenium和WebDriver的安装与配置步骤3步骤1步骤2步骤4下载chromedriver在下载页面中单击超链接Stable,即可跳转到下载页面中与当前版本对应的内容区域,如图所示。5.2Selenium和WebDriver的安装与配置步骤4步骤1步骤2步骤3安装chromedriver复制下载页面中win64对应的“/chrome-for-testing-public/136.0.7103.94/win64/chromedriver-win64.zip”链接,在新的窗口中访问该链接,即可将下载ZIP格式的压缩包到本地。在这里,我们可以将压缩包下载到D:\chromedriver目录下,解压压缩包便可得到chromedriver.exe程序。5.2Selenium和WebDriver的安装与配置3.WebDriver的配置在程序中使用WebDriver时,通常需要显式指定其执行路径。然而,重复手动指定路径不仅繁琐,还可能因路径变更导致代码失效。为解决这一问题,建议将WebDriver配置到系统环境变量中。这样配置后,程序在运行时会自动从环境变量中查找驱动路径,无需在代码中重复指定,既提高了开发效率,也增强了代码的可维护性。下面以ChromeDriver为例,演示如何将ChromeDriver配置到系统环境变量中。5.2Selenium和WebDriver的安装与配置3.WebDriver的配置首先,在桌面上右击“此电脑”图标,在弹出的快捷菜单中选择“属性”,打开“系统”窗口。在该窗口的左侧列表中选择“高级系统设置”,弹出“系统属性”对话框。系统属性对话框如图所示。5.2Selenium和WebDriver的安装与配置3.WebDriver的配置然后,单击”系统属性对话框”的“环境变量”按钮,弹出环境变量对话框,在该对话框的系统变量中找到“Path”变量并双击,弹出编辑环境变量的对话框,将ChromeDriver的安装路径(chromedriver.exe文件所在的目录位置)添加到变量值中。添加完ChromeDriver安装路径的对话框如图所示。5.2Selenium和WebDriver的安装与配置3.WebDriver的配置为了确保ChromeDriver已经成功配置到环境变量中,可打开命令行窗口,在该窗口中输入chromedriver–version命令。若命令执行后出现ChromeDriver的当前版本,则说明环境变量配置成功。Selenium的基本使用5.3掌握WebDriver类的使用,能够通过WebDriver类中的属性和方法操作浏览器和获取数据学习目标5.3.1WebDriver类的常用属性和方法Selenium库的核心自动化能力集成于webdriver模块,该模块提供了非常重要的WebDriver类,用于承担驱动浏览器执行自动化任务的职责。该类封装了一系列功能强大的方法,不仅支持通过ID、XPath、CSS选择器等方式精准定位页面元素,还能实现模拟鼠标悬停、点击、拖曳等操作,以及处理下拉列表框选择、弹出框关闭、页面切换,甚至可通过智能等待机制应对动态加载场景。5.3.1WebDriver类的常用属性和方法5.3.1WebDriver类的常用属性和方法属性说明title获取当前页面的标题current_url获取当前页面的URLname获取当前浏览器的名称page_source获取当前页面的HTML源代码,包含JavaScript渲染后的内容为模拟用户真实操作浏览器的基本过程,WebDriver类提供了一些执行诸如打开浏览器、关闭浏览器、刷新页面、前进、后退等入门操作的方法或属性。WebDriver类的常用属性如表所示。5.3.1WebDriver类的常用属性和方法方法说明get()根据指定URL地址访问页面maximize_window()将浏览器窗口最大化,模拟用户单击浏览器的最大化按钮forward()在浏览器历史记录中前进一页,模拟用户单击浏览器的前进按钮back()在浏览器历史记录中后退一页,模拟用户单击浏览器的后退按钮refresh()刷新当前页面,模拟用户单击浏览器的刷新按钮或按下F5键save_screenshot()截取当前浏览器窗口的屏幕截图,并将其保存为指定路径的图片文件quit()完全关闭浏览器并终止驱动进程,释放相关系统资源close()关闭当前正在操作的标签页或窗口,而浏览器驱动会话仍保持运行为模拟用户真实操作浏览器的基本过程,WebDriver类提供了一些执行诸如打开浏览器、关闭浏览器、刷新页面、前进、后退等入门操作的方法或属性。WebDriver类的常用方法如表所示。5.3.1WebDriver类的常用属性和方法1.get()方法fromseleniumimportwebdriver#创建Chrome浏览器驱动对象driver=webdriver.Chrome()#访问百度首页driver.get("")get()方法用于根据指定URL加载并导航到对应的页面,模拟用户在浏览器地址栏输入网址并按下回车键的行为。例如,使用get()方法访问百度首页,具体代码如下。5.3.1WebDriver类的常用属性和方法2.maximize_window()方法driver.maximize_window()#将浏览器窗口最大化使用Selenium启动浏览器后,浏览器的窗口默认不会以最大化形式显示,此时可以调用maximize_window()方法将浏览器窗口最大化。例如,使用前面创建的Chrome浏览器驱动对象driver调用maximize_window()方法将百度首页所在的窗口最大化,具体代码如下。5.3.1WebDriver类的常用属性和方法3.forward()方法、back()方法和refresh()方法浏览器的左上方有3个常用的功能按钮,分别是←(后退)、→(前进)、(刷新),具体如图所示。当用户单击浏览器的后退按钮时,可以将浏览器页面切换至历史记录中的上一个页面;单击前进按钮,可以将浏览器页面切换至历史记录中的下一个页面;单击刷新按钮,可以使浏览器重新加载当前页面。5.3.1WebDriver类的常用属性和方法3.forward()方法、back()方法和refresh()方法在Selenium中,通过WebDriver类的对象调用forward()方法、back()方法、refresh()方法,可以让浏览器分别执行页面前进、页面后退和刷新的操作,示例代码如下。driver.get("")#访问百度首页driver.get("/")#访问京东首页driver.back()#后退到百度首页driver.forward()#前进到京东首页driver.refresh()#刷新当前页面运行代码,浏览器首先依次显示了百度首页、京东首页,执行页面后退操作后显示了百度首页,然后执行页面前进操作又显示了京东首页,最后刷新了京东首页。5.3.1WebDriver类的常用属性和方法4.title属性print(driver.title)#获取京东首页的标题文本WebDriver类的title属性用于获取当前浏览器页面的标题,即<title>元素的内容。例如,通过driver对象的title属性获取京东首页的标题文本,示例代码如下。京东(JD.COM)-正品低价、品质保障、配送及时、轻松购物!运行代码,输出如下结果。5.3.1WebDriver类的常用属性和方法5.current_url属性print(driver.current_url)#获取当前页面的完整URLWebDriver类的current_url属性用于获取当前浏览器页面的完整URL,即浏览器地址栏中显示的实际URL地址,包含协议、域名、路径和查询参数等完整信息。例如,使用driver对象获取京东首页的URL,具体代码如下。/运行代码,输出如下结果。5.3.1WebDriver类的常用属性和方法6.save_screenshot()方法#将当前页面保存为jd.pngdriver.save_screenshot('jd.png')WebDriver类的save_screenshot()方法用于截取当前浏览器窗口的完整截图,并将其保存为指定路径下的图片文件。截图成功则返回True,失败则返回False。例如,使用driver对象截取浏览器当前窗口显示的京东首页,具体代码如下。掌握定位元素的使用,能够通过定位的方法获取数据学习目标5.3.2定位元素在使用Selenium时,往往需要先定位到指定的元素,再执行相应的操作。例如,在向文本框中输入文字之前定位到文本框对应的元素<input>之后,对该元素对应的对象执行输入文本的操作。Selenium的WebDriver类主要提供了两个定位元素的方法,分别是find_element()和find_elements(),其中find_element()方法用于定位单个元素,返回第一个匹配到的WebElement对象,该对象用于描述网页上的一个元素,如果没有找到元素,则会抛出NoSuchElementException异常;find_elements()方法用于定位多个元素,返回所有匹配的WebElement对象组成的列表,如果未找到元素,则会返回一个空列表。5.3.2定位元素find_element()和find_elements()方法的用法基本相同,它们都需要接收两个参数by和value,其中第一个参数by用于指定定位策略,它的值必须是mon.by.By类提供的属性来设置,默认值为By.ID,表示通过元素的id属性定位;第二个参数value用于指定具体的定位值。为了帮助大家了解定位策略,下面通过一张表罗列By类常用的属性,具体如表所示。5.3.2定位元素属性说明ID通过元素的id属性定位NAME通过元素的name属性定位XPATH通过Xpath的路径表达式定位CSS_SELECTOR通过CSS选择器定位CLASS_NAME通过元素的class属性定位TAG_NAME通过元素的标签名(如div、a)定位LINK_TEXT通过超链接的完整文本定位5.3.2定位元素在HTML文档中,id属性用于为元素提供唯一标识符,确保每个id属性的值在文档中只出现一次。例如,百度新闻页面顶部的分类导航栏对应的是id属性值为header-link-wrapper的元素<div>,具体如图所示。1.通过id属性定位元素5.3.2定位元素在Selenium中,可以使用find_element()方法结合元素的id属性定位,只需要在该方法中指定定位策略为By.ID,以及目标元素id属性的值,会返回匹配到的第一个元素,示例代码如下。1.通过id属性定位元素fromseleniumimportwebdriverfrommon.byimportBydriver=webdriver.Chrome()driver.get('/')#通过id属性定位元素element=driver.find_element(by=By.ID,value='header-wrapper')#使用text属性获取元素的文本内容print(element.text)注册登录……(部分省略)音乐图片视频地图文库5.3.2定位元素在HTML文档中,class属性用于为元素指定一个或多个类名,这些类名通常作为CSS样式表的选择器,实现批量元素样式的统一管理。与id属性的唯一性不同,class属性的值可以在多个元素中重复使用,从而使多个元素具有相同的视觉或行为特征。例如,豆瓣电影网站中某条评论内容对应的是class属性值为short的元素<span>,具体如图所示。2.通过class属性定位元素5.3.2定位元素在Selenium中,可以使用find_element()方法结合元素的class属性定位,只需要在该方法中指定定位策略为By.CLASS_NAME,以及目标元素class属性的值。该方法会返回页面中匹配指定类名的第一元素,示例代码如下。fromseleniumimportwebdriverfrommon.byimportBydriver=webdriver.Chrome()driver.get("/subject/30279836/comments?percent_type=h&limit=20&status=P&sort=new_score")#通过class属性定位元素element=driver.find_element(by=By.CLASS_NAME,value='short')print(element.text)我终于知道迅的演技到底神在哪里了,所有人都在演的时候,她没有演,她就是。2.通过class属性定位元素掌握鼠标操作的使用,能够通过ActionChains类操作鼠标学习目标5.3.3鼠标操作在执行自动化任务时,除了基础的元素单击、输入等操作外,还需要模拟悬停、右击、拖曳、按住不放等鼠标操作。例如,触发下拉菜单的悬停显示、通过拖曳调整页面元素位置、对图片进行右键另存为等,都需要精准控制鼠标的行为轨迹。为此,Selenium提供了ActionChains类专门用于解决此类交互需求。5.3.3鼠标操作ActionChains表示动作链,用于封装一系列鼠标操作的复合动作,它将多个基础鼠标操作组合成一个完整的操作序列,比如鼠标移动、点击、拖拽等,通过链式调用的方式按照顺序执行,实现对鼠标事件的精细化控制。ActionChains类除了提供用于创建动作链对象的构造方法外,还封装了一系列鼠标操作相关的方法,常用的鼠标操作方法如表所示。5.3.3鼠标操作方法说明click()单击context_click()右击double_click()双击常用于触发快速操作click_and_hold()按住鼠标左键不放drag_and_drop()拖曳网页中选定的元素移动到目标元素后释放鼠标drag_and_drop_by_offset()拖曳网页中选定的元素以移动指定的偏移量,然后释放鼠标ActionChains表示动作链,用于封装一系列鼠标操作的复合动作,它将多个基础鼠标操作组合成一个完整的操作序列,比如鼠标移动、点击、拖拽等,通过链式调用的方式按照顺序执行,实现对鼠标事件的精细化控制。ActionChains类除了提供用于创建动作链对象的构造方法外,还封装了一系列鼠标操作相关的方法,常用的鼠标操作方法如表所示。5.3.3鼠标操作方法说明move_to_element()将鼠标指针移动到指定元素的中心位置,常用于触发悬停效果move_by_offset()将鼠标指针从当前位置移动指定的像素偏移量,用于精确控制鼠标轨迹release()释放鼠标perform()执行所有已经存储的操作pause()暂停指定的时间,单位为秒下面演示使用Selenium实现单击鼠标左键、鼠标指针悬停、鼠标拖曳的操作。单击鼠标左键5.3.3鼠标操作百度首页的右上角有一个“登录”按钮,用户通过鼠标左键单击该按钮后,会看到首页中间弹出登录对话框,具体如图所示。fromseleniumimportwebdriverfrommon.byimportByfromselenium.webdriverimportActionChainsdriver=webdriver.Chrome()driver.get('/')driver.maximize_window()#定位到首页顶部“登录”按钮element=driver.find_element(by=By.ID,value='s-top-loginbtn')#创建动作链对象,将鼠标移动到“登录”按钮上方单击左键,执行这个操作ActionChains(driver).click(on_element=element).perform()5.3.3鼠标操作使用ActionChains类的click()方法实现的登录效果,示例代码如下。单击鼠标左键下面演示使用Selenium实现单击鼠标左键、鼠标指针悬停、鼠标拖曳的操作。鼠标指针悬停5.3.3鼠标操作在某些页面中,鼠标指针悬停到某个内容上方时会展开一个新面板。例如,打开传智教育官网,将鼠标指针悬停在左侧精品课程菜单中AI智能应用开发(Java)上方,即展开了Java课程对应的面板,具体如图所示。fromseleniumimportwebdriverfrommon.byimportByfromselenium.webdriverimportActionChainsdriver=webdriver.Chrome()driver.get('/')#定位到Java对应的元素element=driver.find_element(by=By.CLASS_NAME,value='a_gd')#创建动作链对象,将鼠标移动到指定的元素位置后悬停,执行这个操作ActionChains(driver).move_to_element(element).perform()5.3.3鼠标操作使用ActionChains类的move_to_element()方法实现鼠标悬停效果,示例代码如下。鼠标指针悬停下面演示使用Selenium实现单击鼠标左键、鼠标指针悬停、鼠标拖曳的操作。拖曳鼠标5.3.3鼠标操作网站的登录页面中出现了滑动拼图验证码时,需要通过鼠标拖曳滑块至指定位置完成验证。例如,GitHub网站上某个登录页面中的滑动拼图验证码如图所示。fromseleniumimportwebdriverfrommon.byimportByfromselenium.webdriverimportActionChainsimporttimedriver=webdriver.Chrome()driver.get('https://portal.fuyunfeng.top/plugins_v2/index.html#/slider-verify-example')#定位到滑动拼图验证码的滑块element=driver.find_element(by=By.XPATH,value="//div[@id='circle']")action=ActionChains(driver)#创建动作链对象action.click_and_hold(element)#将鼠标移动到滑块上方按住鼠标左键不放action.drag_and_drop_by_offset(element,100,0)#拖曳滑块向右移动100像素time.sleep(2)#等待2秒钟action.perform()#执行上面的鼠标操作5.3.3鼠标操作使用ActionChains类的drag_and_drop_by_offset()方法实现拖曳滑块的效果,具体代码如下。拖曳鼠标掌握如何操作下拉列表框,能够通过Select类控制下拉列表框学习目标5.3.4下拉列表框操作在部分网页交互场景中,常常会遇到下拉列表框,用户可根据需求从中选择特定选项。在HTML文档里,<select>元素用于定义标准下拉列表框,而<select>内部的<option>元素则负责定义下拉列表框组件的可选项目。例如,使用<select>元素定义一个包含4个选项的下拉列表框,具体代码如下。5.3.4下拉列表框操作<!DOCTYPEhtml><htmllang="en"><body><select><optionvalue="volvo">比亚迪</option><optionvalue="saab">奇瑞</option><optionvalue="opel">一汽红旗</option><optionvalue="audi">荣威</option></select></body></html>将上页HTML代码保存到HTML文件并在浏览器中打开后,可以看到页面中显示一个下拉列表框,具体如图所示。5.3.4下拉列表框操作在Selenium中,webdriver.support.ui模块的Select类专门用于处理由<select>元素定义的下拉列表框,它提供了系列方法与下拉列表框交互操作,包括选择选项、取消选择等,关于这些方法的介绍如下。5.3.4下拉列表框操作select_by_index():根据索引选择下拉列表框中的选项,且索引是从0开始的。select_by_value():根据值选择下拉列表框中的选项,这里的值是<option>元素中value属性的值,而不是下拉列表框中选项的值。select_by_visible_text():根据文字选择下拉列表框中的选项,这里的文字是<option>元素的文本内容。deselect_all():取消全部选择,仅适用于支持多选的下拉列表框。实际操作下拉列表框时,需要先定义到<select>元素对应的下拉列表框,然后根据该元素创建Select类的对象,最后使用该对象的方法执行相应的交互操作。接下来,通过代码演示选择下拉框.html中下拉列表框的第2个选项,具体代码如下。5.3.4下拉列表框操作fromseleniumimportwebdriverfrommon.byimportByfromselenium.webdriver.support.uiimportSelectdriver=webdriver.Chrome()driver.get(r'C:\Users\itcast\Desktop\下拉框.html')element=driver.find_element(by=By.TAG_NAME,value='select')#定位到下拉列表框select=Select(element)#创建Select类的对象select.select_by_index(1)#根据索引选择下拉框中第2个选项掌握如何操作弹出框,能够通过Alert类控制弹出框学习目标5.3.5弹出框处理在网页交互中,弹出框是一种常见的界面元素,通常以浮动窗口的形式覆盖在页面上方,用于提示信息、询问用户操作或展示额外内容。若对弹出框不做任何处理,则用户无法对页面继续操作。在Selenium中,处理弹出框时需要先进行上下文切换,将控制权暂时从当前页面交给弹出框,待弹出框获得控制权后才能进行后续操作。这是因为弹出框属于浏览器底层的特殊控件,无法通过常规定位元素的方式操作。通过WebDriver对象的switch_to.alert属性可以切换上下文,切换后会返回一个Alert类的对象。5.3.5弹出框处理Alert类专门用于处理弹出框,封装了与弹出框交互的完整操作方法。根据功能差异,弹出框主要分为警告框、确认框和提示框三种类型,每种类型在交互逻辑上均有独特设计。针对不同类型弹出框的特性,Alert类提供了差异化的处理方式。接下来,分别对警告框、确认框和提示框的处理方式进行介绍。5.3.5弹出框处理警告框通常用于向用户显示重要提示或警告信息,当页面需要强制用户关注特定状态时触发。例如,某个文本框要求用户输入的内容不能为空,但用户未输入任何内容,此时浏览器会立即弹出警告框并显示提示文本。警告框如图所示。5.3.5弹出框处理1.警告框5.3.5弹出框处理要想处理警告框,Selenium的Alert类提供了text属性和accept()方法,其中text属性用于获取警告框内的警告信息;accept()方法用于模拟用户单击警告框内的“确定”按钮。接下来,通过一个示例实现处理警告框,具体代码如下。fromseleniumimportwebdriverfrommon.byimportByimporttimedriver=webdriver.Chrome()driver.get(r'C:\Users\itcast\Desktop\警告框.html')driver.find_element(by=By.TAG_NAME,value='button').click()alert=driver.switch_to.alert#切换至警告框print(alert.text)#输出警告框内的警告信息time.sleep(1)#等待页面加载alert.accept()#单击确定按钮,关闭警告框警告框确认框通常用于验证用户是否确认执行某些操作。与警告框不同的是,确认框提供“确定”和“取消”两个按钮。确认框如图所示。5.3.5弹出框处理2.确认框5.3.5弹出框处理要想处理确认框,Selenium的Alert类中提供了text属性、accept()方法和dismiss()方法。其中,text属性和accept()方法与警告框中它们的功能一致;dismiss()方法用于模拟用户单击“取消”按钮。接下来,通过一个示例实现处理确认框,具体代码如下。确认框fromseleniumimportwebdriverfrommon.byimportByimporttimedriver=webdriver.Chrome()driver.get(r'C:\Users\itcast\Desktop\确认框.html')element=driver.find_element(by=By.TAG_NAME,value='button').click()alert=driver.switch_to.alert#切换至确认框time.sleep(1)#等待页面加载alert.dismiss()#单击取消按钮提示框主要用于引导用户输入文本信息,常见于需要临时获取用户输入的场景,如登录时输入验证码、评论区提交留言等。与警告框、确认框不同,提示框内部除了提示文本外,还包含一个输入框和“确定”“取消”两个按钮。用户可在输入框中填写内容,点击“确定”按钮提交输入值,或点击“取消”按钮放弃操作。提示框如图所示5.3.5弹出框处理3.提示框5.3.5弹出框处理要想处理提示框,Selenium的Alert类提供了text属性、accept()方法、dismiss()方法和send_keys()方法。前3个属性或方法的作用与确认框中它们的功能一致,send_keys()方法用于接收用户输入的内容。接下来,通过一个示例实现处理提示框,具体代码如下。fromseleniumimportwebdriverfrommon.byimportByimporttimedriver=webdriver.Chrome()driver.get(r'C:\Users\itcast\Desktop\提示框.html')element=driver.find_element(by=By.TAG_NAME,value='button').click()alert=driver.switch_to.alert#切换至提示框time.sleep(1)#等待页面加载alert.send_keys('张三')#接收用户输入内容alert.accept()#单击确定按钮提示框掌握如何窗口切换,能够通过Selenium切换页面学习目标5.3.6窗口切换在浏览器中可同时打开多个窗口,但同一时间仅显示一个窗口的页面。若要切换到其他窗口,只需单击对应窗口的选项卡。例如,同时打开两个窗口分别展示百度首页和百度新闻页面,当前窗口显示百度首页,单击百度新闻的选项卡即可将百度新闻页面切换为当前显示页面,具体如图所示。5.3.6窗口切换Selenium通过窗口句柄唯一标识每个浏览器的窗口,每个窗口对应一个唯一的句柄ID,通过这个句柄ID可以切换到指定的页面。Selenium的WebDriver类提供了一些操作窗口句柄的属性和方法,关于它们的介绍如下。window_handles属性:返回包含所有窗口句柄ID的列表,用于获取当前打开的所有窗口。current_window_handle属性:用于获取当前窗口的句柄ID。switch_to.window()方法:根据句柄ID切换到指定窗口,实现页面焦点转移。5.3.6窗口切换通过一个示例演示如何使用Selenium实现页面切换的效果,具体代码如下。5.3.6窗口切换fromseleniumimportwebdriverfrommon.byimportByimporttimedriver=webdriver.Chrome()driver.get('/')#访问百度新闻页面element=driver.find_element(by=By.LINK_TEXT,value='网页').click()#定义到网页的链接并单击print(f'当前窗口句柄为:{driver.current_window_handle}')#获取当前窗口的句柄IDprint(f'所有窗口句柄为:{driver.window_handles}')#获取所有窗口的句柄IDtime.sleep(1)driver.switch_to.window(driver.window_handles[0])#根据句柄ID跳转到第一个窗口,即切换回百度新闻页面运行代码,可以看到浏览器在一个窗口中显示了百度新闻页面,在新的窗口中显示了百度首页,等待1秒后再次切换至百度新闻页面。与此同时,控制台输出了如下信息。5.3.6窗口切换当前窗口句柄为:9B55719C9247DB4D8EDA35D19D71B09E所有窗口句柄为:['9B55719C9247DB4D8EDA35D19D71B09E','EEF94D0E082BC568920A1C9AB6F85FE3’]掌握页面等待的使用,能够使用隐式等待和显示等待学习目标5.3.7页面等待随着AJAX技术在网页中的广泛应用,网络爬虫面临新的难题。由于网页元素的加载不再是同步进行,当爬虫程序试图获取某个元素时,若页面响应缓慢导致元素尚未加载完全,就会抛出NoSuchElementException异常。为有效解决该问题,Selenium提供了隐式等待和显式等待两种解决方案。隐式等待通过设置全局固定等待时间,让程序在规定时长内持续尝试获取元素;显式等待则更为灵活,可依据具体条件进行针对性等待,直到条件满足才继续执行后续操作。5.3.7页面等待5.3.7页面等待1.隐式等待隐式等待是一种全局自动等待机制,通过设置一个最长等待时间,让WebDriver在定位页面元素时自动轮询树形结构。如果在指定时间内元素被找到,则立即执行后续操作,不会因等待时间较大而增加额外的执行时间;若超时仍未找到,则抛出NoSuchElementException异常。隐式等待只需设置一次,会对整个WebDriver生命周期中的所有元素定位生效。implicitly_wait(self,time_to_wait)使用WebDriver类的implicitly_wait()方法实现隐式等待,该方法需要指定WebDriver在定位元素时的最大等待时间,它的声明如下。5.3.7页面等待implicitly_wait()方法接收一个time_to_wait参数,用于指定最长等待时间,单位为秒。需要注意的是,隐式等待的时间设置具有持续性,一旦设置,就会在当前WebDriver对象的整个生命周期内生效。这意味着从设置时刻起,该WebDriver对象后续执行的所有定位元素的操作都会自动应用这个等待策略,直到该WebDriver对象被销毁或隐式等待时间被重新设置为止,才会终止这个等待行为。1.隐式等待已知某网站提供了一个在线实时客服聊天功能,其聊天窗口并非在访问页面时立即显示,而是在用户停留页面一定时间后延迟弹出,主动提供客服支持服务。在线聊天窗口如图所示。5.3.7页面等待1.隐式等待5.3.7页面等待1.隐式等待通过代码演示如何使用隐式等待的方式获取在线聊天窗口中的第一段文字,具体代码如下。fromseleniumimportwebdriverfrommon.byimportBydriver=webdriver.Chrome()driver.get('/')#访问传智教育官网首页driver.implicitly_wait(10)#设置隐式等待,最大等待时间为10秒#切换至聊天窗口#聊天窗口通过<iframe>元素定义,该元素的唯一标识符是chatIframedriver.switch_to.frame('chatIframe')#定位到聊天窗口内中的聊天消息,返回第一条消息的文本element=driver.find_element(By.CLASS_NAME,value='service')print(element.text)5.3.7页面等待2.显式等待显式等待是一种智能等待机制,它允许程序在继续执行前,智能等待某个页面元素达到预期状态。与固定时间的等待不同,显式等待会动态检查预设条件,比如元素是否可见、可单击、存在于树形结构中等,并以轮询方式持续验证,一旦条件满足就立即执行后续操作,若超过设定的最大等待时间仍未满足条件,则抛出超时异常TimeoutException。这种等待方式能精准匹配动态网页内容的加载节奏,有效避免了不必要的等待时间。WebDriverWait(driver,timeout,poll_frequency=POLL_FREQUENCY,ignored_exceptions=None)在Selenium中,webdriver.support.ui模块的WebDriverWait类用于实现显式等待,在实现显式等待功能之前需要通过该类的构造方法创建一个等待对象,WebDriverWait类构造方法的声明如下。5.3.7页面等待driver:必选参数,表示当前操作的浏览器驱动程序,接收WebDriverWait类的对象。timeout:必选参数,用于指定最长等待时间,默认以秒为单位。poll_frequency:可选参数,用于指定检查预设条件的轮询间隔,默认值为0.5,表示每0.5秒检查一次条件是否满足。ignore_exceptions:可选参数,用于指定等待过程中需要自动忽略的的异常类型,默认情况下可忽略NoSuchElementException异常,即元素暂时不可见或不存在时抛出的异常。2.显式等待5.3.7页面等待2.显式等待WebDriverWait对象通常需要配合until()或until_not()方法使用,这两个方法都会在指定的时间内持续尝试检查预设条件,若超时则抛出TimeoutException异常,但遵循相反的判断逻辑。until()方法要求条件必须返回真值(持续检测直到条件成立),而until_not()方法则要求条件必须返回假值(持续检测直到条件不成立)。这两个方法都需要接收两个参数method和message,参数method接收一个可调用的对象;message用于自定义超时异常的提示信息。5.3.7页面等待通过代码演示如何通过显式等待的方式获取在线聊天窗口中的第一段文字,具体代码如下。fromseleniumimportwebdriverfrommon.byimportByfromselenium.webdriver.support.uiimportWebDriverWaitdriver=webdriver.Chrome()driver.get('/')#访问传智教育官网首页driver.switch_to.frame('chatIframe')#切换至聊天窗口#设置显式等待,在10秒钟内持续尝试定位聊天消息,直到找到或超时element=WebDriverWait(driver,10).until(lambdax:x.find_element(by=By.CLASS_NAME,value="service"))#输出元素的内容print(element.text)2.显式等待多学一招在Selenium中webdriver.support.expected_conditions模块提供了一套完整的预定义等待条件,这些条件专门用于配合显式等待,实现对动态页面元素的精准状态检测。例如,判断页面元素是否加载到树形结构中、元素是否可单击、标题内容是否包含预期内容等。内置等待条件多学一招内置等待条件等待条件说明title_is判断页面标题是否为预期标题title_contains判断页面标题是否包含预期内容presence_of_element_located判断元素是否存在于树形结构中visibility_of_element_located判断元素是否存在且可见visibility_of判断已经定位的元素是否可见presence_of_all_elements_located判断是否至少有一个元素存在于树形结构中text_to_be_present_in_element判断元素的内容是否包含预期的文本多学一招内置等待条件等待条件说明text_to_be_present_in_element_value判断元素的value属性是否包含预期的字符串frame_to_be_available_and_switch_to_it判断frame是否可切换invisibility_of_element_located判断元素是否不可见或不存在于树形结构中element_to_be_clickable判断元素是否可见且可单击staleness_of判断元素是否不再存在于树形结构中element_to_be_selected判断元素是否被选中alert_is_present判断页面中是否存在警告框多学一招内置等待条件内置等待条件本质上是可调用对象(即实现了__call__()方法,能像函数一样被直接调用的Python对象),既非单纯的方法也非普通函数,而是用于封装对各种元素状态的判断逻辑。通常情况下,内置等待条件以可调用形式存在,调用时必须传入WebDriver对象作为参数(通常由WebDriverWait自动传入),部分内置等待条件还需要接收额外的配置参数,并在条件得到满足时返回布尔值或元素对象。多学一招内置等待条件fromseleniumimportwebdriverfromselenium.webdriver.support.uiimportWebDriverWaitfromselenium.webdriver.supportimportexpected_conditionsasECfrommon.byimportBydriver=webdriver.Chrome()driver.get('/')driver.switch_to.frame('chatIframe')#设置显式等待,在10秒钟内持续尝试定位聊天消息,直到找到或超时#内置条件,判断类名为service的元素是否存在,即是否有聊天消息element=WebDriverWait(driver,10).until(EC.presence_of_element_located((By.CLASS_NAME,"service")))print(element.text)接下来演示如何通过显式等待配合内置等待条件的方式来等待聊天窗口的弹出,并获取聊天窗口中的第一段文本,具体代码如下。实践项目:采集集信达平台的短信服务日志信息5.4掌握集信达网站短信服务日志数据的采集,能够使用Selenium定位元素并采集学习目标5.4采集集信达的短信服务日志信息在数字化业务高速运转的当下,短信服务作为企业与用户连接的关键纽带,其稳定性与效率直接影响用户体验与业务流程。集信达平台作为专业的短信服务提供商,其沉淀的服务日志信息不仅包含创建时间、通道路由、签名模板等基础信息,还隐藏着耗时波动、状态异常等服务质量的关键线索。接下来,本节将运用前面所学的Selenium知识,实现集信达平台短信服务日志的自动化采集。5.4采集集信达的短信服务日志信息项目需求访问集信达平台的登录页面,按照平台的要求关注黑马程序员公众号,获取账号以及密码,获取后即可在登录页面填写账号与密码进行登录。填写账号与密码后的集信达平台登录页面如图所示。5.4采集集信达的短信服务日志信息项目目标输入账号与密码后,单击“登录”按钮进入集信达平台的首页,在首页左侧的菜单栏中选择“短信服务”→“服务日志”,进入短信服务日志页面,如图所示。5.4采集集信达的短信服务日志信息项目目标在短信服务日志页面中,默认显示的是接收日志的数据。我们可以通过设置签名名称、模板名称、创建时间以及应用名称这4个筛选条件来搜索指定的数据。在这里,设置“签名名称”为“闲云旅游”,应用名称为“TMS”,创建时间为默认指定的时间范围

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论