




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第5章抓取动态网页数据《Python网络爬虫基础教程》学习目标/Target了解抓取动态网页的实现技术,能够说出Selenium有哪些特点掌握Selenium和WebDriver的安装与配置,能够独立安装Selenium和WebDriver掌握Selenium的基本使用,能够使用Selenium实现抓取动态网页数据的功能章节概述/Summary通常,网站上动态网页的比例要远远高于静态网页。相比于静态网页,动态网页不会在加载完成后立即显示所有的内容,而会受时间、环境等因素的影响发生改变。此时再使用第3章的技术已经无法满足需求。为了抓取动态网页,Python提供了Selenium库,通过该库可以模拟用户在浏览器上执行诸如单击按钮、输入文本等行为,获取网页上动态加载的数据。本章将针对抓取动态网页数据的内容进行介绍。目录/Contents5.15.25.3抓取动态网页的技术Selenium和WebDriver的安装与配置Selenium的基本使用5.4实践项目:采集集信达平台的短信服务日志信息抓取动态网页的技术5.1了解抓取动态网页的实现技术,能够说出Selenium的特点学习目标5.1抓取动态网页的技术对于动态网页的数据可以直接使用模拟浏览器运行的方式进行实现,这样做就可以不用管网页内部是如何使用JavaScript渲染页面的,也不用管Ajax请求中到底有没有加密参数,在浏览器中看到是什么样的内容,抓取的结果便是什么样的内容。Python中提供了许多模拟浏览器运行的库,包括Selenium、Splash、PyAutoGUI等。5.1抓取动态网页的技术SeleniumSplashPyAutoGUISelenium是一个开源的、便携式的自动化测试工具,它最初是为网站自动化测试而开发的,Selenium支持与所有主流的浏览器(如Chrome、Firefox、Edge、IE等)配合使用,也包括诸如PhantomJS、HeadlessChrome等一些无界面的浏览器。Selenium可以直接运行在浏览器中,模拟用户使用浏览器完成一些动作,包括自动加载页面、输入文本、选择下拉框、单击按钮、单击超链接等。不过,Selenium本身不带浏览器,它需要通过一个浏览器驱动程序WebDriver才能与所选浏览器进行交互。5.1抓取动态网页的技术SeleniumSplashPyAutoGUISplash用于JavaScript渲染服务,是一个带有HTTPAPI的轻量级Web浏览器,而且对接了Twisted(事件驱动型的网络引擎)和Qt5(进行QtC++软件开发基本框架的最新版本)。Splash实现了以下功能。采用异步方式并行处理多个网页渲染过程。获取渲染后页面的源代码或截图。通过关闭图像或使用AdblockPlus规则加快页面渲染速度。可执行特定的JavaScript脚本。可以通过Lua脚本控制页面的渲染过程。以HAR(HTTPArchive)格式呈现获取渲染的详细过程。5.1抓取动态网页的技术SeleniumSplashPyAutoGUIPyAutoGUI是一个用于自动化测试的库,它可以使用Python程序控制鼠标和键盘自动与其他应用程序交互,支持Windows、macOS
和Linux等平台。PyAutoGUI具有以下一些特点。移动鼠标并在其他应用程序的窗口中单击或键入文本。向应用程序发送按键,比如填写表格。截取屏幕截图并发送一张图像,在屏幕上找到它。定位应用程序的窗口,并移动、调整大小、最大化、最小化或关闭该窗口(目前仅适用于Windows)。5.1抓取动态网页的技术Selenium和WebDriver的安装与配置5.2掌握Selenium和WebDriver的安装,能够独立安装Selenium和WebDriver学习目标5.2Selenium和WebDriver的安装与配置在使用Selenium抓取动态网页的数据之前,我们需要先在计算机上安装Selenium,以及与Selenium一起配合使用的浏览器驱动WebDriver。为了避免后续在网络爬虫程序中重复指定WebDriver的执行路径,我们需要为WebDriver配置环境变量。5.2Selenium和WebDriver的安装与配置5.2Selenium和WebDriver的安装与配置
Selenium的安装Selenium的安装方式非常简单,可以直接使用pip命令安装,具体的安装命令如下。pipinstallselenium==3.141.0若命令行窗口中出现Successfullyinstalledselenium的提示信息,说明成功安装了Selenium库。5.2Selenium和WebDriver的安装与配置
WebDriver的安装每种浏览器都有一个特定的WebDriver。WebDriver称为驱动程序,通过驱动程序实现Selenium与浏览器之间的交互。浏览器驱动程序Chromium/ChromechromeDriverFirefoxgeckodriverEdgeMicrosoftWebDriverIEIEDriverServerOperaoperachromiumdriverSafarisafaridriver5.2Selenium和WebDriver的安装与配置需要说明的是,不同版本的浏览器驱动程序支持的浏览器版本也不同,在下载浏览器的驱动程序之前,需要先查看当前浏览器的版本号。5.2Selenium和WebDriver的安装与配置步骤1步骤2步骤3步骤4查看Chrome浏览器版本单击Chrome浏览器右上角的图标打开自定义及控制GoogleChrome的菜单,在该菜单中选择“帮助”→“关于GoogleChrome”打开关于Chrome页面。5.2Selenium和WebDriver的安装与配置步骤2步骤1步骤3步骤4访问chromedriver官网知道了Chrome浏览器的版本号后,便可以到chromedriver官方网站下载与Chrome浏览器版本对应的chromedriver的下载列表。5.2Selenium和WebDriver的安装与配置步骤3步骤1步骤2步骤4下载chromedriver单击与浏览器相应版本的ChromeDriver链接,进入chromedriver的下载页面。5.2Selenium和WebDriver的安装与配置步骤4步骤1步骤2步骤3安装chromedriver单击“chromedriver_win_32.zip”链接,下载ZIP格式的压缩包到本地,解压压缩包便可得到chromedriver.exe程序。5.2Selenium和WebDriver的安装与配置
WebDriver的配置将WebDriver配置到系统环境变量后,程序中再次使用WebDriver时,就不需要重复指定WebDriver的执行路径了。系统属性对话框添加安装路径Selenium的基本使用5.3掌握WebDriver类的使用,能够通过WebDriver类中的属性和方法操作浏览器和获取数据学习目标5.3.1WebDriver类的常用属性和方法5.3.1WebDriver类的常用属性和方法属性说明title获取当前页面的标题current_url获取当前页面的URL地址为模仿用户真实操作浏览器的过程,webdriver模块的WebDriver类(表示浏览器)中提供了一些执行诸如打开浏览器、关闭浏览器、刷新页面、前进、后退等入门操作的方法或属性。WebDriver类的常用属性如下所示。5.3.1WebDriver类的常用属性和方法方法说明get()根据指定URL地址访问页面maximize_window()设置浏览器窗口最大化forward()页面前进back()页面后退refresh()刷新当前页面save_screenshot()对当前浏览器窗口进行截图quit()会话结束时退出浏览器close()关闭当前窗口为模仿用户真实操作浏览器的过程,webdriver模块的WebDriver类(表示浏览器)中提供了一些执行诸如打开浏览器、关闭浏览器、刷新页面、前进、后退等入门操作的方法或属性。WebDriver类的常用方法如下所示。5.3.1WebDriver类的常用属性和方法WebDriver类常用方法、示例如下所示。fromseleniumimportwebdriverdriver=webdriver.Chrome()driver.get("")访问网站driver.maximize_window()浏览器最大化driver.back()#后退driver.forward()#前进
driver.refresh()#刷新后退、前进、刷新driver.save_screenshot('jd.png')保存图片5.3.1WebDriver类的常用属性和方法print(driver.title)获取标题print(driver.current_url)获取当前页URLWebDriver类常用方法、示例如下所示。掌握定位元素的使用,能够通过定位的方法获取数据学习目标5.3.2定位元素Selenium的WebDriver类中提供了定位元素的方法,这些方法按照元素的数量可以分为定位单个元素和定位多个元素。WebDriver类中定位单个元素的方法如下所示。5.3.2定位元素方法说明find_element()通过指定方式定位元素find_element_by_id()通过id属性定位元素find_element_by_name()通过name属性定位元素find_element_by_xpath()通过XPath的路径表达式定位元素find_element_by_link_text()通过链接文本定位元素find_element_by_partial_link_text()通过部分链接文本定位元素find_element_by_tag_name()通过标签名定位元素find_element_by_class_name()通过class属性定位元素find_element_by_css_selector()通过CSS选择器定位元素5.3.2定位元素下面演示如何使用Selenium定位元素。通过id属性定位元素driver=webdriver.Chrome()driver.get('/')#通过id属性定位元素element=driver.find_element_by_id('header-wrapper')#访问text属性输出元素的文本内容print(element.text)5.3.2定位元素下面演示如何使用Selenium定位元素。driver.get("/subject/30279836/comments?status=P")#通过class属性定位元素element=driver.find_element_by_class_name('short')print(element.text)通过class属性定位元素5.3.2定位元素下面演示如何使用Selenium定位元素。find_element(self,by=By.ID,value=None)find_element()方法是定位元素的通用方法,与其他几个方法相比,它有更加灵活使用方式,可以通过参数指定定位方式。value:表示元素的名称或属性的值。by:表示定位方式。通过指定方式定位元素5.3.2定位元素find_element()方法中的参数by表示定位方式,该参数支持的取值及其说明如下所示。取值说明By.ID通过id属性定位元素By.NAME通过name属性定位元素By.CLASS_NAME通过class属性定位元素By.TAG_NAME通过标签名定位元素By.LINK_TEXT通过链接文本定位元素By.PARTIAL_LINK_TEXT通过部分链接文本定位元素By.CSS_SELECTOR通过CSS选择器定位元素By.XPATH通过Xpath的路径表达式定位元素5.3.2定位元素下面演示如何使用Selenium定位元素。通过指定方式定位元素#导入By类frommon.byimportBy#通过id属性定位元素element=driver.find_element(by=By.CLASS_NAME,value='short')#访问text属性输出元素中的文本内容print(element.text)使用find_element()方法定位豆瓣电影的评论数据中class属性值为short的元素。掌握鼠标操作的使用,能够通过ActionChains类操作鼠标学习目标5.3.3鼠标操作常用的鼠标操作有双击、右击、拖曳、按住不动等,它们都封装为ActionChains类的方法。ActionChains类中常用的鼠标操作方法如下所示。5.3.3鼠标操作方法说明click()单击鼠标左键context_click()单击鼠标右键double_click()双击鼠标click_and_hold()按住鼠标左键move_to_element()鼠标悬停drag_and_drop()拖曳网页中选定元素并按住鼠标左键,移动到目标元素后释放鼠标按钮drag_and_drop_by_offset()拖曳网页中选定元素并按住鼠标左键,移动指定的偏移量后释放鼠标按钮move_by_offset()将鼠标移动到与当前鼠标位置的偏移处send_keys()发送某个键到当前焦点的元素release()释放按住的鼠标按钮perform()执行pause()暂停指定的时间,单位为秒下面演示使用Selenium实现单击鼠标左键、鼠标指针悬停、鼠标拖曳的功能。单击鼠标左键fromseleniumimportwebdriverfromselenium.webdriverimportActionChainsdriver=webdriver.Chrome()driver.get('/')driver.maximize_window()#定位到登录按钮对应的元素element=driver.find_element_by_id('s-top-loginbtn')ActionChains(driver).click(on_element=element).perform()5.3.3鼠标操作下面演示使用Selenium实现单击鼠标左键、鼠标指针悬停、鼠标拖曳的功能。fromselenium.webdriverimportActionChainsdriver=webdriver.Chrome()driver.get('/')#定位到JavaEE对应的元素element=driver.find_element_by_class_name('a_gd')#将鼠标移动到指定的元素位置后悬停并执行ActionChains(driver).move_to_element(element).perform()5.3.3鼠标操作鼠标指针悬停下面演示使用Selenium实现单击鼠标左键、鼠标指针悬停、鼠标拖曳的功能。鼠标拖曳fromselenium.webdriverimportActionChainsimporttimedriver=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)#等待2saction.perform()5.3.3鼠标操作掌握如何操作下拉列表框,能够通过Select类控制下拉列表框学习目标5.3.4下拉列表框操作Selenium中,Select类专门用于处理下拉框,该类提供了以下几个方法从下拉框中选择选项或取消选项。5.3.4下拉列表框操作select_by_index():根据索引选择下拉框中的选项,且索引是从0开始的。select_by_value():根据值选择下拉框中的选项,这里的值是<option>元素中value属性的值,而不是下拉框中选项的值。select_by_visible_text():根据文字选择下拉框中的选项,这里的文字是<option>元素的文本内容。deselect_all():取消全部选择。下面通过一个示例演示Selenium中Select类的使用,具体代码如下所示。5.3.4下拉列表框操作fromseleniumimportwebdriverfromselenium.webdriver.support.uiimportSelectdriver=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) #根据索引选择掌握如何操作弹出框,能够通过Alert类控制弹出框学习目标5.3.5弹出框处理Selenium中的Alert类用于处理这3类弹出框,不过在处理弹框之前需要先使用WebDriver类对象的switch_to.alert选中弹出框。5.3.5弹出框处理5.3.5弹出框处理要想处理警告框,Selenium的Alert类中提供了text属性和accept()方法,其中text属性用于获取警告框中的警告消息;accept()方法用于单击确定按钮。fromseleniumimportwebdriverimporttimedriver=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()#单击确认按钮警告框5.3.5弹出框处理要想处理确认框,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() #单击取消按钮确认框5.3.5弹出框处理要想处理提示框,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()#单击确定按钮提示框掌握如何切换页面,能够通过Selenium切换页面学习目标5.3.6页面切换在浏览器中可以同时打开多个窗口,但每次只能显示一个窗口的页面。若希望显示其他窗口的页面,则需要单击窗口上方的选项卡,达到页面切换的效果。例如,在浏览器中同时打开两个窗口,分别展示百度首页和百度新闻页面,当前窗口展示的页面为百度首页。单击百度新闻选项卡后,当前窗口展示的页面变为百度新闻页面5.3.6页面切换Selenium通过窗口句柄来区分浏览器的窗口,它为每个浏览器窗口分配了唯一句柄ID,通过这个句柄ID可以切换到指定的页面。Selenium的WebDriver类中提供了一些操作窗口句柄的属性或方法。5.3.6页面切换window_handles:获取所有窗口的句柄ID。current_window_handle:获取当前窗口的句柄ID。switch_to.window():跳转到指定窗口。下面通过示例演示如何使用Selenium实现页面切换,具体代码如下所示。5.3.6页面切换fromseleniumimportwebdriverimporttimedriver=webdriver.Chrome()driver.get('/')element=driver.find_element_by_link_text('新闻').click()print(f'当前窗口句柄为:{driver.current_window_handle}')#获取所有窗口的句柄IDprint(f'所有窗口句柄为:{driver.window_handles}')time.sleep(1)#跳转到第一个窗口driver.switch_to.window(driver.window_handles[0])掌握页面等待的使用,能够使用隐式等待和显示等待学习目标5.3.7页面等待Selenium提供了两种实现页面等待的方式,分别是隐式等待和显式等待,其中隐式等待是等待特定的时间,显式等待是指定某一条件,直到这个条件成立后才继续执行。5.3.7页面等待implicitly_wait(self,time_to_wait)隐式等待是设置一个全局最大等待时间,单位为秒(s)。隐式等待可以使用WebDriver类的implicitly_wait()方法实现,它使得WebDriver类的对象在定位元素时,每隔一段特定的时间就会轮询一次节点树,直到元素被发现为止。
隐式等待5.3.7页面等待implicitly_wait()方法中只包含一个参数time_to_wait,该参数表示等待的时长,单位为秒数。需要注意的是,隐式等待的时间一经设置,这个设置就会在WebDriver类对象的整个生命周期起作用。fromseleniumimportwebdriverdriver=webdriver.Chrome()driver.get('/')#隐式等待,设置等待时间为10sdriver.implicitly_wait(10)#聊天框是一个frame,需要切换到framedriver.switch_to.frame('chatIframe')element=driver.find_element_by_class_name('service')print(element.text)下面通过一个示例演示如何通过隐式等待的方式获取网页中的数据,具体代码如下。
隐式等待5.3.7页面等待WebDriverWait(driver,timeout,poll_frequency=POLL_FREQUENCY,ignored_exceptions=None)显式等待是设定等待条件并设置最长等待时间,如果超出等待时间还没有找到元素,那么便会抛出异常,在Selenium中,webdriver.support.ui模块的WebDriverWait类用于处理显式等待。
显式等待5.3.7页面等待driver:WebDriver的驱动程序。timeout:最长超时时间,默认以秒为单位。poll_frequency:休眠的间隔时间,默认为0.5秒。ignore_exceptions:超时后的异常信息,默认情况下抛出NoSuchElementException异常。WebDriverWait类的对象通常和until()或until_not()方法配合使用,这两个方法的作用相同,都用于在指定的时间内调用WebDriver对象定位元素,直到返回值不为False为止。until()或until_not()方法有两个参数method和message,其中参数method表示可调用的WebDriver对象;message表示设置的异常提示信息。
显式等待5.3.7页面等待fromseleniumimportwebdriverfromselenium.webdriver.support.uiimportWebDriverWaitdriver=webdriver.Chrome()driver.get('/')driver.switch_to.frame('chatIframe')element=WebDriverWait(driver,10).until(lambdax:x.find_element_by_class_name("service"))print(element.text)
显式等待5.3.7页面等待下面通过一个示例来演示通过显式等待的方式获取数据。多学一招在Selnium中,webdriver.support.expected_conditions模块提供许多内置等待条件,例如,判断页面元素是否加载到DOM中、元素是否可单击、标题内容是否包含某内容等。内置等待条件多学一招内置等待条件等待条件说明title_is判断页面标题是否为预期标题title_contains判断页面标题是否包含预期内容presence_of_element_located判断元素是否被加载到DOM中,传入定位元组,如(By.ID,"content")visibility_of_element_located判断元素是否可见,传入定位元组visibility_of判断元素是否可见,传入元素对象presence_of_all_elements_located判断是否至少有一个元素加载到DOM中text_to_be_present_in_element判断某个元素的text是否包含预期的内容多学一招内置等待条件等待条件说明text_to_be_present_in_element_value判断某个元素的value属性是否包含预期的内容frame_to_be_available_and_switch_to_it判断frame是否可切换invisibility_of_element_located判断某个元素是否不在DOM中element_to_be_clickable判断某个元素是否可见并且可以单击staleness_of判断某个元素是否仍在DOM中element_to_be_selected判断某个元素是否被选中alert_is_present判断页面中是否存在警告多学一招内置等待条件fromseleniumimportwebdriverfromselenium.webdriver.support.uiimportWebDriverWaitfromselenium.webdriver.supportimportexpected_conditionsasECfrommon.byimportBydriver=webdriver.Chrome()driver.get('/')driver.switch_to.frame('chatIframe')element=WebDriverWait(driver,10).until(EC.presence_of_element_located((By.CLASS_NAME,"service")))print(element.text)接下来,通过一个示例演示使用presence_of_element_located获取数据。实践项目:采集集信达平台的短信服务日志信息5.4掌握集信达网站短信服务日志数据的采集,能够使用Selenium定位元素并采集学习目标5.4采集集信达的短信服务日志信息随着企业业务扩张、短信规模化使用,传统短信平台的接入方式和单一的信息发送功能已不能满足现代企业管理的需求。入口统一、对接成本较小、操作与维护简单易行、稳定性和可靠性的移动信息化应用成为短信平台发展趋势。集信达平台就是融入这种趋势的一个简单易用的短信平台,能够保证短信准确且高效地发送。它提供多种对接方式,能够满足企业内部的各种需求。接下来,本节将使用Selenium抓取集信达平台上的短信服务日志信息。
项目需求5.4采集集信达的短信服务日志信息首先访问集信达平台的登录页面,此时可以使用平台上默认填写的账号密码进行登录。
项目目标5.4采集集信达的短信服务日志信息单击登录页面中“登录”按钮进入集信达平台的项目课程简介页面,在该页面中单击“体验项目”按钮进入集信达平台的首页页面。在集信达平台的首页页面的左侧菜单栏中选择“短信服务”→“服务日志”,进入短信服务日志页面。
项目目标5.4采集集信达的短信服务日志信息在短信服务日志页面中可以通过设置签名名称、模板名称、创建时间以及应用名称这4个筛选条件来搜索指定的数据,设置搜索签名名称和应用名称为“黑马头条”,此时单击“搜索”按钮后搜索到的数据。
项目目标5.4采集集信达的短信服务日志信息页面上的日志信息为需要采集的数据(1)登录集信达平台在浏览器中访问集信达平台,首先会看到该平台的登录页面。由于登录页面中的账号与密码是默认显示的,无须用户手动输入,所以我们只需要通过XPath的路径表达式定位到“登录”按钮对应的标签,再使用Selenium执行单击“登录”按钮的操作,即可进入集信达平台的项目课程简介页面。
项目分析5.4采集集信达的短信服务日志信息(2)单击体验项目在集信达平台的项目课程简介页面单击“体验项目”按钮即可进入集信达平台的首页页面。通过Xpath的路径表达式定位到体验项目按钮对应的标签,然后再使用Se
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论