Python爬虫与网络数据采集案例实践(微课视频版)课件 第6章 动态网页数据采集_第1页
Python爬虫与网络数据采集案例实践(微课视频版)课件 第6章 动态网页数据采集_第2页
Python爬虫与网络数据采集案例实践(微课视频版)课件 第6章 动态网页数据采集_第3页
Python爬虫与网络数据采集案例实践(微课视频版)课件 第6章 动态网页数据采集_第4页
Python爬虫与网络数据采集案例实践(微课视频版)课件 第6章 动态网页数据采集_第5页
已阅读5页,还剩79页未读 继续免费阅读

下载本文档

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

文档简介

第6章

动态网页数据采集学习目标知识目标(1)深入理解静态网页与动态网页的差异及其各自特性。(2)熟练掌握逆向分析法的基本原理及其应用方法。(3)熟悉Selenium插件与ChromeDriver的安装流程及配置要点。(4)掌握并灵活运用Selenium插件开展动态网页数据的采集工作。(5)熟悉使用逆向分析与Selenium实现动态网页数据提取的技术路径。学习目标能力目标(1)能够判别静态网页与动态网页,并能针对性地选用适宜的采集策略。(2)熟练运用逆向分析法对动态网页实施高效的数据采集操作。(3)能够完成Selenium插件的安装、配置,并运用其精准模拟网页自动化操作流程。(4)具备利用Selenium模拟复杂动态网页交互行为的能力,以满足多样化数据采集需求。(5)能够综合运用逆向分析法与Selenium插件达成动态网页数据的采集任务,以及提升数据采集实践技能。学习目标素质目标(1)培养对网页数据采集新技术的学习兴趣,形成主动探索和解决问题的习惯,以适应不断变化的网站技术。(2)锻炼分析和解决实际问题的能力,能够运用所学知识和技能,有条理地应对数据采集中遇到的各种挑战。(3)树立在数据采集工作中的规范意识和责任心,了解并遵守相关法律法规和网站使用协议,确保数据获取和使用的合法合规性。(4)提升在学习和实践过程中的沟通与协作能力,能够与他人交流技术心得、合作完成数据采集相关的任务。思维导图章节内容行业PPT模板/hangye/6.26.36.4使用逆向分析法采集动态网页使用Selenium采集动态网页拓展案例—采集非物质文化遗产信息6.1静态网页与动态网页的区分PATR6.1静态网页与动态网页的区分网页内容固定创建后通常不会改变,除非手动进行修改技术简单静态网页使用HTML、CSS和JavaScript编写,无需复杂脚本加载速度快无需服务器端处理,静态网页通常加载速度较快请求简单客户端直接获取存储在服务器上的HTML文件,不需要额外的服务器处理01OPTION03OPTION02OPTION04OPTION静态网页的特点1.静态网页静态网页是指网页内容固定、不需要通过服务器端脚本进行数据处理的网页。内容动态生成服务器根据请求参数和当前数据动态生成内容页面复杂需要处理用户请求和数据返回,动态网页的实现比静态网页复杂交互性强动态网页支持用户交互,比如搜索、数据提交等请求复杂涉及服务器端脚本处理、数据库查询等多个步骤01OPTION03OPTION02OPTION04OPTION动态网页的特点2.动态网页动态网页是指内容会根据用户请求或系统状态动态生成的网页。内容是否变化静态网页的内容固定,不会根据用户请求变化;动态网页的内容会根据用户请求或系统数据动态生成。技术实现静态网页仅使用HTML、CSS、JavaScript;动态网页需要使用服务器端语言(如PHP、ASP、JSP等)和数据库。请求处理方式静态网页的请求直接返回存储文件;动态网页的请求需要服务器端脚本处理。性能差异静态网页加载快,性能高;动态网页因服务器处理和数据库查询,性能相对较低。010302043.区分静态网页与动态网页(1)打开今日头条主页(/))。按“F12”打开开发者工具或者单击“更多工具”选项中的“开发者工具”选项。在开发者工具中的“元素”面板上显示“导航”栏目标题对应的HTML源码,如图6-2所示。6.14.判断静态网页(2)静态网页能够获得服务器直接返回的HTML源码,即用户需要获取的网页信息在网页源代码中能直接搜索到,如图6-3所示的“导航”栏目标题能够在网页源代码中查找到。由此可见今日头条主页中的“导航”栏目标题采用的是静态网页技术。6.14.判断静态网页(1)打开人民邮电出版社主页(/shopping/index),在页面上找到“新书推荐”图书信息,如图6-4所示。6.15.判断动态网页(2)按“F12”键打开开发者工具,在打开的开发者工具“元素”面板的HTML源码中可以查看到“新书推荐”图书信息,譬如“ChatGPT:人类新纪元”,如图6-5所示。6.15.判断动态网页(3)然而右击主页中的“查看网页源代码”选项,在打开的网页源码中却无法搜索到“ChatGPT:人类新纪元”这本新书信息,如图6-6所示。由此可以判断人民邮电出版社的“新书推荐”栏目采用了动态网页技术。6.15.判断动态网页PATR6.2使用逆向分析法采集动态网页逆向分析法,即通过分析前端网页数据加载过程中的请求和响应,来定位并提取目标数据。这种方法适用于无法直接通过网页结构找到数据的场景,特别是Ajax动态加载的数据。1.异步加载技术(Ajax)Ajax即异步JavaScript和XML,是指一种创建交互式网页应用的网页开发技术。通过在后台与服务器进行少量数据交换,AJAX可以使网页实现异步更新,即在无需重新加载整个网页的情况下,实现对网页的某部分内容进行更新。逆向分析法的使用6.2.1【例6-1】判断网页是否使用了异步加载技术。(1)打开简书主页(/),当用户手动翻动鼠标中间滚轮到页面末尾,可以看到“阅读更多”导航栏,如图6-7所示。点击“阅读更多”导航栏则加载新的网页内容而没有显示分页信息。逆向分析法的使用6.2.1【例6-1】判断网页是否使用了异步加载技术。虽然网页的内容在不断加载,然而网页的地址并没有发生改变,如图6-8所示。静态网页无法一次性加载如此庞大的信息,通过分析可判断该网页使用了异步加载技术。逆向分析法的使用6.2.1【例6-1】判断网页是否使用了异步加载技术。(2)进入Pexels主页(/zh-cn/)。读者可以通过下滑鼠标来不断刷新和加载图片,说明该网站使用了AJAX技术,通过AJAX技术实现下滑分页,如图6-9所示。

逆向分析法的使用6.2.1用户想要抓取异步加载方法的网页数据,需要了解网页是如何加载这些数据的,该过程(方法)称为逆向工程(或逆向分析)。2.网络请求分析逆向分析的第一步是通过浏览器的开发者工具,分析动态网页在加载过程中向服务器发送的请求。这些请求通常包含关键信息,如数据接口地址、请求参数、HTTP头部信息等。逆向分析法的使用6.2.1【例6-2】通过人民邮电出版社“新书推荐”栏目中的图书信息采集来演示网络请求分析的步骤。(1)打开人民邮电出版社主页,找到数据加载的位置“新书推荐”栏目,点选该栏目中任意一本新书,右击“查看”打开浏览器开发者工具,读者在开发者工具的“元素”面板中可以查看到新书信息,如图6-10所示。然而在该网页的“网页源代码”中却无法搜索到新书信息,譬如“ChatGPT:人类新纪元”,见图6-6所示。由此可以判断“新书推荐”栏目采用了动态网页技术。逆向分析法的使用6.2.1(2)将开发者工具中的面板切换到“网络”面板,点击“Fetch/XHR”,按F5刷新页面,观察在页面加载过程中服务器返回给客户端的资源文件,找到与目标数据“新书推荐”相关的请求接口“getRecommendBookListForPortal?bookTagId=2725fe7b-b2c2-4769-8f6f-c95f04c70275”,如图6-11所示。逆向分析法的使用6.2.1【多学一招】

读者也可以在“搜索文本框”中输入要查找的新书名称,如输入“ChatGPT”,按回车键即可在“搜索文本框”的下方看到与目标数据“ChatGPT:人类新纪元”新书相关的请求URL:/recommendBook/getRecommendBookListForPortal?bookTagId=2725fe7b-b2c2-4769-8f6f-c95f04c70275。如图6-12所示。逆向分析法的使用6.2.13.数据结构解析找到如图6-12所示的相关请求后,需要解析请求返回的响应内容的数据结构。通常,这些数据以JSON格式返回,可以直接通过解析获取所需信息。【例6-3】通过人民邮电出版社“新书推荐”栏目中的图书信息采集来演示数据结构解析的步骤。(1)选择“新书推荐”相关请求URL:/recommendBook/getRecommendBookListForPortal?bookTagId=2725fe7b-b2c2-4769-8f6f-c95f04c70275,查看其返回的响应,如图6-13所示。逆向分析法的使用6.2.1逆向分析法的使用6.2.1(2)使用json.loads()解析JSON数据,找到目标数据。(3)确定需要采集的新书信息:picPath、bookName和bookId,并将采集的新书信息保存到newBook.csv文件中,为编写爬虫代码做好准备。4.模拟请求与数据获取【例6-4】根据例6-2和例6-3的步骤分析得到的人民邮电出版社“新书推荐”请求接口和返回的响应数据的数据结构,编写爬虫代码模拟浏览器向“新书推荐”请求URL发起请求,解析和提取所需的新书信息:picPath、bookName和bookId。逆向分析法的使用6.2.11. importrequests2. importjson3. importos4. 5. url=('/recommendBook/getRecommendBookListForPortal?'6. 'bookTagId=2725fe7b-b2c2-4769-8f6f-c95f04c70275')#"新书推荐"请求的URL7. save_path='./bookPic'#创建图片保存路径8. ifnotos.path.exists(save_path):9. os.mkdir(save_path)10. rqq=requests.get(url)#发起请求逆向分析法的使用6.2.111. res=rqq.content.decode('utf-8')#查看返回的数据是一个JSON格式的数据12. datas=json.loads(res)#使用loads转换,转换后的数据是一个字典格式的数据13. fordataindatas['data']:14. bookInfo={15. 'bookId':data['bookId'],#提取新书的Id16. 'bookName':data['bookName'],#提取新书的名称17. 'picPath':data['picPath']#提取新书的封面图片的超链接18. }19. print(bookInfo)#输出新书信息到控制台20. #【多学一招】

向图片链接发起请求,并将图片下载到本地21. picUrl=data['picPath']#获取新书的封面图片的超链接22. picData=requests.get(picUrl)#向新书图片链接发起请求并获取图片内容23. fp=open(save_path+"/"+data['bookName']+'.jpg','wb')#将书名作为图片名称24. fp.write(picData.content)#保存新书封面的图片25. fp.close()运行例6-4的源代码,用户可以在底部的“Run”窗口看到采集到的“新书推荐”栏目中的新书信息,如图6-14所示。同时,在左侧项目结构区的当前工程目录Chapter6code中的bookPic目录中看到采集到的新书封面图片,如图6-15所示。逆向分析法的使用6.2.1综合案例—采集简书大学堂精选好课1.数据采集需求本案例采集简书大学堂精选好课中的“热门”专题中的文章信息,采集的字段包括主页上每篇文章的作者ID、文章标题、点赞人数和全部评论,如图6-16所示,以及文章详细页上的打赏人数和收录专题的前五个,如图6-17所示。采集到的文章信息存储到mongoDB数据库服务器中mydb数据库下的jianshu集合中。6.2.2综合案例—采集简书大学堂精选好课6.2.2

(a)打赏人数

(b)收录专题综合案例—采集简书大学堂精选好课2.采集思路分析(1)打开简书大学堂精选好课中的“热门”专题主页(/c/e048f1a72e3d?utm_medium=index-banner-s&utm_source=desktop)。(2)打开Chrome浏览器的开发者工具,单击Network选项卡,选中Fetch/XHR选项,鼠标向下滑动,读者可以在Name列表中看到翻页的网页文件,如图6-18所示,由此可以判断该网页采用AJAX技术实现分页。6.2.2综合案例—采集简书大学堂精选好课2.采集思路分析(3)选中XHR中的第一个加载页,将其对应的RequestURL为:/c/e048f1a72e3d?order_by=added_at&page=2,如图6-19所示。在地址栏打开该RequestURL,用户可以发现能正常的加载网页内容。6.2.2综合案例—采集简书大学堂精选好课(4)选中XHR中的第一个加载页,将其对应的RequestURL中page=2修改为page=1,即地址为/c/e048f1a72e3d?order_by=top&page=1,此时,用户可以浏览简书大学堂精选好课中“热门”专题中第一个页面的文章信息,发现简书大学堂精选好课的page值到6(见图6-19),由此构造爬虫需要采集的的URL地址列表。(5)本次爬虫在详细页进行,因此需要先采集详细页的网址。通过判断元素是否在网页源代码中来识别异步加载技术,可以判断打赏次数、收录专题这两个信息采用了异步加载技术。打开Chrome浏览器的开发者工具,单击Network选项卡,选中XHR项,可以找到打赏和收录专题的请求网址。6.2.2综合案例—采集简书大学堂精选好课(6)打赏人数的RequestURL中有一串数字,如图6-20所示。同时在网页源代码中能找到这串数字,如图6-21所示,由此可以通过获取网页源代码中的数字来构造URL。该URL返回的数据为JSON格式,如图6-22所示,因此用户可以通过JSON库获取打赏人数。6.2.2综合案例—采集简书大学堂精选好课(7)以同样的方法,找到收录专题的RequestURL,如图6-23所示。该RequestURL返回的数据也为JSON格式,在collections键中的title键所对应的值即为收录专题,如图6-24所示。6.2.2综合案例—采集简书大学堂精选好课(8)使用Requests库循环向图6-20的简书大学堂精选好课中“热门”专题每一个页面的爬虫地址发起请求,解析和提取主页上的作者ID、文章标题、点赞人数和全部评论。(9)循环向每篇文章的详情页发起请求,解析和提取详情页中的打赏人数和前五个收录专题。(10)将采集到的文章信息存储到mongoDB数据库服务器中mydb数据库下的jianshu集合中。6.2.2综合案例—采集简书大学堂精选好课3.采集代码实现(1)在PyCharm中,右击“Chapter6Code”的包,在快捷菜单中选择New->PythonFile命令,新建一个名称为“综合案例—采集简书大学堂精选好课”的Python文件。(2)在“综合案例—采集简书大学堂精选好课”Python文件中输入采集文章信息的爬虫代码,如图6-25所示。6.2.2综合案例—采集简书大学堂精选好课3.采集代码实现6.2.2综合案例—采集简书大学堂精选好课3.采集代码实现(3)单击工具栏上的“”按钮,运行采集简书大学堂精选好课文章信息的爬虫代码,当在底部“Run”窗口中显示爬虫运行结果,如图6-26所示。可以打开mongoDB数据库服务器中mydb数据库下的jianshu集合,读者可以查看到采集到的简书大学堂精选好课文章信息。6.2.2PATR6.3使用Selenium采集动态网页Selenium插件和浏览器驱动的安装1.Selenium的概述Selenium是一个开源浏览器自动化工具,允许用户编写脚本控制浏览器进行各种操作,如访问网页、点击按钮、搜索内容、填写表单等。Selenium支持多种编程语言,如Python、Java、C#等,并兼容主流浏览器,如Chrome、Firefox、Safari等。Selenium的核心组件包括如下三个。(1)SeleniumWebDriver:与浏览器通讯,控制浏览器行为。(2)支持库:为不同编程语言提供的接口库,如Python的Selenium库。(3)浏览器驱动程序(如ChromeDriver):特定浏览器的驱动,充当SeleniumWebDriver与浏览器之间的桥梁。6.3.1Selenium插件和浏览器驱动的安装2.Selenium插件的安装

在浏览器中安装Selenium插件,就可以对网络界面进行测试。Selenium直接运行在浏览器中,就像真正的用户在操作一样。在命令行或者PyCharm的“Terminal”窗口输入如下命令安装Selenium插件。pipinstallselenium6.3.1Selenium插件和浏览器驱动的安装3.浏览器驱动的安装为了使Selenium能够与浏览器交互,需要下载并配置相应的浏览器驱动程序。下面以Chrome浏览器、驱动程序为ChromeDriver为例。(1)访问ChromeDriver的下载页面:https://googlechromelabs.github.io/chrome-for-testing/。(2)查看本地计算机中的Chrome浏览器版本(如图6-27),选择相匹配的ChromeDriver版本,并下载适用于操作系统(Windows、MacOS、Linux)的文件。

6.3.1Selenium插件和浏览器驱动的安装3.浏览器驱动的安装此处选择与ChromeVersion:135.0.7049.84版本相匹配的win64位ChromeDriver驱动程序,如图6-28所示。

6.3.1Selenium插件和浏览器驱动的安装(3)在浏览器向/chrome-for-testing-public/135.0.7049.84/win64/chromedriver-win64.zip发起请求,下载ChromeDriver驱动程序。(4)解压下载的ChromeDriver,将chromedriver.exe复制到Python安装目录下,即与python.exe同一目录,如图6-29所示。

6.3.1Selenium插件和浏览器驱动的安装【例6-5】测试Selenium插件和ChromeDriver的安装与配置。在PyCharm环境中输入例6-5代码并运行测试,如果代码正常运行并自动打开Chrome浏览器向百度新闻网发起请求,并在浏览器窗口显示“Chrome正受到自动测试软件的控制”,如图6-30所示,这表明已经安装和配置好Selenium插件和ChromeDriver。

6.3.11. fromseleniumimportwebdriver#导入webdriver驱动程序2. 3. driver=webdriver.Chrome()#创建一个chrome浏览器对象4. driver.get("/")#发起请求

Selenium插件的使用1.WebDriver类的常用属性和方法webdriver模块的WebDriver类提供的打开浏览器、关闭浏览器、刷新页面、前进、后退等操作的方法或属性,可用于模拟用户操作浏览器。WebDriver类的常用方法如下表6-1所示。

6.3.2方法说明get()根据指定URL地址访问页面maximize_window()设置浏览器窗口最大化forward()页面前进back()页面后退refresh()刷新当前页面save_screenshot()对当前浏览器窗口进行截图quit()会话结束时退出浏览器close()关闭当前窗口Selenium插件的使用2.页面等待(1)隐式等待

隐式等待是一个全局设置,定义了WebDriver在查找元素时的最大等待时间,单位为秒(s)。可以通过WebDriver类的implicitly_wait()方法实现隐式等待。这个设置使得WebDriver在查找元素时,会每隔一段特定的时间轮询一次节点树,直到找到目标元素为止。implicitly_wait()方法的语法格式如下:implicitly_wait(self,time_to_wait)在方法中,time_to_wait参数表示等待的时长,单位为秒。

6.3.2Selenium插件的使用【例6-6】向目标网站如百度新闻网发起请求,通过设置隐式等待10秒让浏览器加载网页内容。

6.3.21. fromseleniumimportwebdriver2. 3. driver=webdriver.Chrome()#启动chrome浏览器4. driver.get('/')#通过浏览器对象向目标网站发起请求5. driver.implicitly_wait(10)#隐式等待,设置等待时间为10s6. print(driver.page_source)#输出响应内容7. driver.close()Selenium插件的使用2.页面等待(2)显式等待

显式等待是一种设定具体等待条件并指定最长等待时间的机制。如果在超出设定的时间内仍然无法找到元素,则会抛出异常。在Selenium中,可以使用webdriver.support.ui模块中的WebDriverWait类来处理显式等待。WebDriverWait方法的语法格式如下:WebDriverWait(driver,timeout,poll_frequency=POLL_FREQUENCY,ignored_exceptions=None)WebDriverWait类的对象通常与

until()或until_not()方法配合使用。这两个方法的作用相同,都是在指定的时间内调用WebDriver对象来定位元素,直到返回值不为False为止。6.3.2Selenium插件的使用【例6-7】向目标网站如百度新闻网发起请求,通过设置显式等待10秒直到浏览器加载完网页的底部内容。

6.3.21. fromseleniumimportwebdriver2. fromselenium.webdriver.support.uiimportWebDriverWait3. fromselenium.mon.byimportBy#新增必要导入4. fromselenium.webdriver.supportimportexpected_conditionsasEC#新增条件等待5. 6. driver=webdriver.Chrome()7. driver.get('/')8. 9. try:10. #修改后的显式等待(使用By定位器)11. element=WebDriverWait(driver,10).until(12. EC.presence_of_element_located((By.CLASS_NAME,"cy"))13. )14. print(element.text)15. finally:16. driver.quit()#建议添加退出操作Selenium插件的使用3.内置等待条件在Selenium中,webdriver.support.expected_conditions模块提供了多种内置等待条件,如表6-2所示。6.3.2方法含义title_is标题是某些内容title_contains标题包含某些内容presence_of_element_located元素加载出,传入定位元组,如(By.ID,'p')visibility_of_element_located元素可见,传入定位元组visibility_of传入元素对象presence_of_all_elements_located所有元素加载出text_to_be_present_in_element某个元素文本包含某些文字text_to_be_present_in_element_value某个元素值包含某些文字frame_to_be_available_and_switch_to_it_frame加载并切换框架invisibility_of_element_located元素不可见element_to_be_clickable元素可点击staleness_of判断一个元素是否仍在DOM,可判断页面是否已经刷新element_to_be_selected元素可选择,传元素对象element_located_to_be_selected元素可选择,传入定位元组element_selection_state_to_be传入元素对象以及状态,相等返回True,否则返回Falseelement_located_selection_state_to_be传入定位元组以及状态,相等返回True,否则返回Falsealert_is_present是否出现AlertSelenium插件的使用4.定位元素find_element()方法是定位元素的通用方法,可以通过参数指定定位方式。find_element()方法的语法格式如下:find_element(self,by=By.XX,value=None)value:表示元素的名称或属性的值。by:表示定位方式,该参数支持的取值及其说明如表6-3所示。6.3.2取值说明By.ID通过id属性定位元素By.NAME通过name属性定位元素By.CLASS_NAME通过class属性定位元素By.TAG_NAME通过标签名定位元素By.LINK_TEXT通过链接文本定位元素By.PARTIAL_LINK_TEXT通过部分链接文本定位元素By.CSS_SELECTOR通过CSS选择器定位元素Selenium插件的使用【例6-8】使用Selenium插件模拟向百度新闻网发起请求,演示使用find_element()方法定位百度新闻网中的“导航”栏标题名称、第一条热点新闻。

6.3.21. fromseleniumimportwebdriver2. frommon.byimportBy3. 4. driver=webdriver.Chrome()#启动chrome浏览器5. driver.get('/')#通过浏览器对象发起请求6. driver.implicitly_wait(10)#隐式等待,设置等待时间为10s7. #(1)通过id定位导航栏元素8. element_id=driver.find_element(By.ID,'header-link-wrapper')9. print(element_id.text)#输出定位到的导航栏文本内容10. #(2)通过class_name定位第一条热点新闻11. element_class=driver.find_element(By.CLASS_NAME,'hdline0')12. print(element_class.text)#输出定位到的第一条热点新闻Selenium插件的使用5.鼠标操作Selenium插件的常用鼠标操作有双击、右击、拖曳、按住不动等,它们都封装为ActionChains类的方法。ActionChains类中常用的鼠标操作方法如表6-4所示。6.3.2方法含义click(on_element=None)单击元素。click_and_hold(on_element=None)按住鼠标左键在元素上。context_click(on_element=None)右键单击元素。double_click(on_element=None)双击元素。drag_and_drop(source,target)按住源元素并拖动到目标元素然后释放。drag_and_drop_by_offset(source,xoffset,yoffset)按住源元素并拖动到指定偏移位置然后释放。move_to_element(to_element)移动鼠标到元素上。move_by_offset(xoffset,yoffset)将鼠标移动到指定的坐标(相对于当前的位置)。move_to_element_with_offset(to_element,xoffset,yoffset)将鼠标移动到元素上的指定偏移位置。perform()执行所有存储的操作。release(on_element=None)释放按住的鼠标按钮。send_keys()发送某个键到当前焦点的元素Selenium插件的使用【例6-9】使用Selenium插件模拟向百度新闻网发起请求,演示单击鼠标左键、鼠标指针悬停等鼠标操作。

6.3.21. fromseleniumimportwebdriver2. frommon.byimportBy3. fromselenium.webdriverimportActionChains#导入库4. 5. driver=webdriver.Chrome()6. driver.get('/')#发起请求7. driver.maximize_window()#窗口最大化8. #(1)定位到登录按钮对应的元素9. element=driver.find_element(By.ID,'passLog')10. ActionChains(driver).click(on_element=element).perform()11. #(2)定位搜索框并输入搜索关键词“爬虫”12. element=driver.find_element(By.CLASS_NAME,'word')#定位到搜索框13. element.send_keys("爬虫")#向搜索框发送“爬虫”关键字14. #(3)将鼠标移动到指定的元素搜索框后悬停并执行15. ActionChains(driver).move_to_element(element).perform()16. input("PressEntertoclosethebrowser...")#输入任意内容才关闭浏览器17. driver.quit()Selenium插件的使用【例6-10】使用Selenium插件模拟向https://portal.fuyunfeng.top/plugins_v2/index.html#/slider-verify-example主页发起请求,演示鼠标拖曳操作。6.3.21. fromseleniumimportwebdriver2. frommon.byimportBy3. fromselenium.webdriverimportActionChains4. 5. importtime6. driver=webdriver.Chrome()7. driver.get('https://portal.fuyunfeng.top/plugins_v2/index.html#/slider-verify-example')8. element=driver.find_element(By.XPATH,"//div[@id='circle']")#xpath定位滑块元素9. action=ActionChains(driver)#创建鼠标移动对象10. action.click_and_hold(element)#按住鼠标左键11. action.drag_and_drop_by_offset(element,100,0)#向右拖曳100像素12. time.sleep(10)#等待2s13. action.perform()14. input("PressEntertoclosethebrowser...")#输入任何内容才关闭浏览器15. driver.quit()Selenium插件的使用6.页面切换Selenium插件通过窗口句柄来区分浏览器的窗口,它为每个浏览器窗口分配了唯一句柄ID,通过这个句柄ID可以切换到指定的页面。Selenium插件的WebDriver类中提供了如下几个操作窗口句柄的属性或方法。(1)window_handles:获取所有窗口的句柄ID。(2)current_window_handle:获取当前窗口的句柄ID。(3)switch_to.window():跳转到指定窗口。6.3.2Selenium插件的使用【例6-11】演示如何使用Selenium插件实现“新浪主页”、“新浪新闻”主页面的切换。6.3.21. fromseleniumimportwebdriver2. frommon.byimportBy3. importtime4. 5. driver=webdriver.Chrome()6. driver.get('/')7. #定位到“新闻”元素并单击,8. element=driver.find_element(By.LINK_TEXT,'新闻').click()9. print(f'当前新浪主页窗口的句柄为:{driver.current_window_handle}')10. #获取所有窗口的句柄ID11. print(f'所有窗口的句柄为:{driver.window_handles}')12. time.sleep(5)13. #跳转到第一个窗口14. driver.switch_to.window(driver.window_handles[0])15. input("PressEntertoclosethebrowser...")#输入任何内容才关闭浏览器16. driver.quit()Selenium插件的使用7.填充表单并输入文本HTML表单包含了表单元素,而表单元素指的是不同类型的input元素、复选框、单选按钮、提交按钮、输入框等。填写表单数据后,需要向服务器提交表单。使用element.send_keys(text)方法可以向表单元素中输入文本。【例6-12】演示如何使用Selenium插件实现在清华大学出版社主页模拟搜集“数据分析”图书,并采集“数据分析”图书的书名、作者、ISBN和定价,如图6-31所示。6.3.2Selenium插件的使用打开开发者工具,定位图6-31所示的搜索框并输入“数据分析”关键字,如图6-32所示。定位搜索按键并单击,采集如图6-31所示的“数据分析”图书信息,代码如下。6.3.2Selenium插件的使用6.3.21. fromseleniumimportwebdriver2. fromselenium.webdriver.supportimportexpected_conditionsasEC3. fromselenium.webdriver.support.uiimportWebDriverWait4. frommon.byimportBy5. fromlxmlimportetree6. importtime7. 8. #打开搜索页面窗口、定位搜索框、传送搜索关键字、模拟单击搜索框、移动到第二个弹窗9. #(1)打开搜索页面窗口10. driver=webdriver.Chrome()#启动Chrome浏览器11. driver.get('/index.html')#清华大学出版社主页面页面12. wait=WebDriverWait(driver,10)#显示等待10秒13. before=driver.current_window_handle#获取selenium渲染后的当前窗口的句柄14. #(2)定位搜索框15. search_btn=driver.find_element(By.XPATH,'//*[@id="input_key"]')16. #(3)输入搜索关键字:数据分析17. search_btn.send_keys('数据分析')18. time.sleep(3)19. confirm_btn=wait.until(20. EC.element_to_be_clickable(#等待搜索按钮的定位成功21. (By.XPATH,'/html/body/div[1]/div[1]/div[2]/div/div[4]/input')22. )23. )Selenium插件的使用6.3.224. #(4)单击搜索按钮25. confirm_btn.click()26. #(5)driver移动到第二个窗口(即返回的数据分析图书信息)27. driver.switch_to.window(driver.window_handles[1])#window_handles会列出当前所有窗口,window_handles[1]表示移动到第二个弹窗28. time.sleep(10)#暂停10秒,在此期间浏览器不会关闭29. html=driver.page_source#返回“数据分析”图书的响应内容30. dom=etree.HTML(html)#解析成DOM树31. bookNames=dom.xpath('//*[@id="csproduct"]/li/a/span/@title')#获取书名32. authors=dom.xpath('//*[@id="csproduct"]/li/a/p[1]/text()')#获取作者33. ISBNs=dom.xpath('//*[@id="csproduct"]/li/a/p[2]/text()')#ISBN34. prices=dom.xpath('//*[@id="csproduct"]/li/a/p[3]/text()')#定价35. forbookName,author,ISBN,priceinzip(bookNames,authors,ISBNs,prices):36. bookInfo={37. 'bookName':bookName,38. 'author':author,39. 'ISBN':ISBN,40. 'price':price41. }42. print(bookInfo)#输出图书信息43. driver.quit()#关闭浏览器6.3.41.数据采集需求本案例采集pexels网站上某类图片数据,根据用户输入某类需要采集的图片关键字,例如输入“flower”搜索关键字,则采集与flower相关主题的两个页面图片数据,如图6-33所示。使用Selenium插件获取图片数据,并将采集到的图片保存到当前工程目录的“photos文件夹中。

综合案例—采集图片数据6.3.42.采集思路分析(1)打开pexels网站主页()),手动向下滑动鼠标,发现网站中的图片是动态加载的,由此可判断该网站采用了异步加载技术。(2)选中Fetch/XHR选项,鼠标向下滑动浏览网站中的图片信息,可以发现在Network选项卡的“Name”列表中会动态加载一些文件,如图6-34所示。

综合案例—采集图片数据6.3.42.采集思路分析(3)打开图6-34所示的“Name”列表第一个包含有“page”的加载文件,在Headers选项卡中可以看到RequestURL,如图6-35所示。

综合案例—采集图片数据6.3.42.采集思路分析(4)尝试删除图6-35中的RequestURL部分字符串,把RequestURL简写为:/zh-cn/search/flower/?page=2,此时在浏览器地址栏中向该RequestURL发起请求也能正常返回图片信息,如图6-36所示。(5)继续手动向下滑动进行翻页,会发现在Headers的“Name”列表中的RequestURL只是page后面的数字每次加1,由此可构建出爬虫地址列表urls以爬取多个页面上的图片数据。综合案例—采集图片数据6.3.42.采集思路分析(6)打开谷歌开发者工具,定位网页上的一张图片,在“Elements”面板上可看到该图片的超链接,当鼠标移到该链接上可看到该图片的缩略图,如图6-37所示。

综合案例—采集图片数据6.3.42.采集思路分析在浏览器中打开图6-37所示的图片的超链接“/photos/372166/pexels-pho…jpeg?auto=compress&cs=tinysrgb&w=1260&h=750&dpr=2”,在浏览器中可以看到该图片被正确加载,因此读者可以通过向图片超链接发起请求来获取图片。(8)使用Selenium插件模拟向pexels主页发起请求,循环采集图片数据。(9)将采集到的图片保存到当前工程目录下的“photos”文件夹中。

综合案例—采集图片数据6.3.43.采集代码实现(1)在PyCharm中,右击“Chapter6Code”的包,在快捷菜单中选择New->PythonFile命令,新建一个名称为“综合案例—采集图片数据”的Python文件。(2)在“综合案例—采集图片数据”Python文件中输入采集图片的爬虫代码,如图6-38所示。

综合案例—采集图片数据6.3.43.采集代码实现综合案例—采集图片数据PATR6.4拓展案例—采集非物质文化遗产信息6.41.数据采集需求本案例采集中国非物质文化遗产项目网站中“清单”页面中的非物质文化遗产数据,采集的字段包括项目序号、编号、非遗项目名称、非遗类别、公布时间、类型、申报地区

温馨提示

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

评论

0/150

提交评论