版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第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.数据采集需求本案例采集中国非物质文化遗产项目网站中“清单”页面中的非物质文化遗产数据,采集的字段包括项目序号、编号、非遗项目名称、非遗类别、公布时间、类型、申报地区或单位、保护单位等,如图6-39所示。分别使用逆向分析法和Selenium插件两种方法采集非物质文化遗产信息,并将采集的信息存储至Intangible_heritage.csv文件中。
拓展案例—采集非物质文化遗产信息6.42.采集思路分析(1)打开中国非物质文化遗产网主页,点选主页中的“清单”,然后翻到非物质文化遗产项目,见图6-39。(2)逆向分析法:打开开发者工具,切换到“网络”面板中的“Fetch/XHR”选项。手动翻页并观察“名称”列表中动态加载的文件,此处选中“/getProject.html?province=&rx_time=&type=&cate=&keywords=&category_id=16&limit=10&p=1”文件,同时单击“预览”选项,可以查看到服务器返回的非物质文化遗产信息,如图6-40所示。分析“名称”列表中文件并构建爬虫请求的URL。
拓展案例—采集非物质文化遗产信息6.42.采集思路分析(3)Selenium插件:由于非物质文化遗产信息不在主页的网页源代码中,如图6-41所示。因此,可以使用selenium插件模拟翻页和获取动态网页信息。
拓展案例—采集非物质文化遗产信息6.42.采集思路分析(4)
循环向非物质文化遗产主页发起请求,解析响应内容并提取非物质文化遗产的项目序号、编号、非遗项目名称、非遗类别、公布时间、类型、申报地区或单位、保护单位。(5)将采集到的非物质文化遗产信息存储至“Intangible_heritage.csv”文件中。3.采集代码实现(1)在“Chapter6code”包中新建一个名称为“拓展案例—采集非物质文化遗产信息”的Python文件,输入采集非物质文化遗产信息的爬虫代码,如图6-42所示。
拓展案例—采集非物质文化遗产信息6.4
拓展案例—采集非物质文化遗产信息6.4
拓展案例—采集非物质文化遗产信息
思考题
动态网页数据采集中的技术责任与社会影响?动态网页数据采集技术使得数据的获取更加灵活和广泛,但也带来了更多的技术与挑战。作为一名技术从业者,应如何理解和承担相应的责任?请思考以下问题:(1)技术应用的边界:在动态网页数据采集中,如何区分合法与非法的数据采集行为?如何利用技术手段,确保不侵犯他人合法权益?(2)技术伦理:面对复杂的动态网站结构,如何保证使用技术手段时不破坏网站的正常运行?在技术开发过程中,如何自觉遵守伦理规范?(3)社会影响:大规模的动态数据采集可能引发哪些社会问题,如数据滥用、隐私泄露等?如何在技术创新的同时,兼顾社会责任,减少负面影响?(4)自律与监督:如何通过自律规范自己的采集行为,同时积极参与行业监督和规范讨论,从行业和社会层面促进采集技术的合理应用?(5)正当使用:思考动态网页数据采集技术可以在哪些领域为社会带来积极影响,如数据分析、市场调研、公共服务等,如何确保技术的正向应用?通过这些思考,读者可以更好地理解动态网页数据采集技术在社会中的角色和影响,培养社会责任感和技术应用的边界意识。
实训案例
实训1采集知乎“发现栏目”帖子信息使用逆向分析法采集知乎发现主页(网址详见前言二维码)中“近期热点”和“潜力问题”两个栏目的帖子信息。本实训案例将采集这两个栏目下的“全部”、“数码”、“科技互联网”专栏,爬取每个专栏的小时榜、日榜和周榜等帖子信息,具体获取“近期热点”栏目帖子的标题、专题、标签、浏览总量、关注增量、浏览增量、回答增量和赞同增量等字段。以及采集“潜力问题”栏目帖子的标题、专题、标签、潜力值、24小时浏览增量、24小时浏览问题、24小时回答增量和24小时回答总量等字段信息。将采集到的“近期热点”和“潜力问题”两类帖子信息存储至名为“hot_post.csv”的文件中。
实训案例
实训2采集“爬虫工程师”招聘信息
本实训案例通过selenium插件模拟登录51job招聘网站,搜索并采集“爬虫工程师”岗位招聘信息。使用lxml库中的etree模块解析返回的爬虫工程师招聘信息网页,获取职位名称、公司名称、公司类型、企业类别、工资、经验要求、学历、地址、关键词等招聘信息。将采集的招聘信息存储到“job.csv”文件。
实训案例
实训3采集热播影视数据
乐视视频平台是中国领先的在线视频平台之一,提供丰富的电影、电视剧等内容。通过获取观众对热门和最新影视作品的评价、评分及播放量,用户可以深入了解观众的喜好。本案例采集该视频平台主页和详情页中热播电影/电视剧的作品名称、子名称、评分、类型、国家/地区、导演、演员、播放数、评论数、简介等字段信息。分别使用Selenium插件和逆向分析法采集每一部热播电影/电视剧的影视信息,并将采集的电影/电视剧信息存储至movie_TV.csv文件中。谢谢听聆第7章反爬策略与反反爬技巧学习目标知识目标(1)掌握反爬虫与反反爬虫的基本概念以及其发展脉络与历程。(2)了解不同类别反爬虫技术及其相应的应用场景与领域。(3)熟悉常见反爬虫工具与框架的操作使用方法。(4)理解反反爬虫技术原理及其应对策略与机制学习目标能力目标(1)能够识别与深入分析各类不同的反爬虫技术手段,并据此制定出有效的反反爬策略与举措。(2)可在实际实践场景中熟练应用反反爬虫技术,有效解决各类反爬虫措施的限制与干扰。(3)具备独立完成典型的反爬与反反爬攻防案例综合分析的专业能力。(4)能够通过综合案例及拓展案例的深入实践,有效提升实践动手操作能力,积累丰富的项目实践经验与技术储备。素质目标(1)培育针对反爬与反反爬技术的批判性思维模式以及良好的道德规范意识。(2)提高在复杂技术应用环境中解决实际问题的综合能力与素养。(3)增强对技术发展演进趋势的洞察能力以及对行业相关法律法规的感知与遵循意识。(4)培养团队协作精神与高效沟通能力,使其能够在数据采集项目实施过程中与团队成员紧密协同合作,共同达成数据采集需求目标并有效攻克各类技术挑战。思维导图章节内容行业PPT模板/hangye/7.27.37.4反爬虫技术反反爬虫技术拓展案例—采集招聘网岗位信息7.1反爬虫与反反爬虫的定义PATR01反爬虫与反反爬虫的定义反爬虫与反反爬虫反爬虫Anti-WebScraping反反爬虫Anti-Anti-Scraping爬虫技术逐渐成为一种常见的数据获取手段。然而,这种技术的广泛应用也带来了许多问题和风险,促使网站和平台采取反爬虫措施。随着反爬虫技术的广泛应用,数据获取变得越来越困难。这种对抗性的环境催生了反反爬技术的发展,其目的是绕过反爬虫措施,继续有效地进行数据抓取。反爬虫简介7.1.1反爬虫是指网站或系统通过一系列技术手段,阻止或限制爬虫程序(即自动化的网络数据抓取工具)访问获取其数据的行为。反爬虫技术的核心目标是区分人类用户与自动化程序,从而对自动化程序进行限制或阻止。01020304数据保护反爬虫技术的首要目的是保护网站上的敏感数据或专有数据,防止被未经授权的爬虫程序大规模抓取。通过反爬虫措施,网站可以控制哪些用户或程序能够访问特定的数据,确保数据的机密性和安全性。商业利益保护在竞争激烈的市场环境中,网站的数据(如价格、库存、用户评论等)可能成为竞争对手的重要情报通过反爬虫技术,网站可以防止竞争对手通过爬虫技术获取这些关键信息,从而保护自身的商业利益资源保护爬虫程序通常会频繁访问网站,消耗大量的服务器资源反爬虫技术通过限制这些请求的频率和数量,保护服务器资源,避免因为大量爬虫访问而导致网站性能下降或服务中断,保证正常用户的访问体验。防止滥用和恶意行为恶意爬虫可能被用于执行攻击性行为,如DDoS攻击、数据窃取或内容盗用。反爬虫技术通过检测并阻止这些恶意爬虫,确保网站免受潜在威胁的影响,维护网络安全。通过限制数据的自动化抓取,网站能够更好地控制数据的流向,避免因数据泄露或滥用而引发的法律风险目的反爬虫主要应用场景7.1.1电子商务网站电子商务平台上的商品价格、库存信息以及用户评价等数据对其业务至关重要。反爬虫技术防止竞争对手或其他未经授权的爬虫程序获取这些敏感数据,从而避免价格战或市场信息的不当泄露。防止恶意爬虫过度访问也有助于维持网站的正常运行,确保真实用户的购物体验不受影响。社交媒体平台社交媒体平台上的用户生成内容,如帖子、评论、图片和个人资料等,都是高度敏感的数据。反爬虫技术用于防止第三方公司或个人爬取这些数据,避免隐私泄露、内容盗用以及用户数据被用于不当用途。通过限制爬虫行为,社交平台能够更好地管理服务器资源,确保服务的稳定性。新闻与内容网站新闻网站和内容聚合平台通常会对其原创内容进行保护,防止其他网站未经授权地复制和分发这些内容。反爬虫技术通过检测并阻止自动化抓取行为,保护原创内容的版权和商业利益。防止爬虫大量抓取内容也有助于维护网站的流量和广告收益。金融与投资平台金融数据,包括股票价格、交易记录、市场分析报告等,通常是金融和投资平台的核心资产。反爬虫技术保护其数据免受未经授权的爬取,从而防止潜在的市场操纵或信息不当使用。平台也依赖反爬虫来确保数据的准确性和实时性,避免因爬虫过载导致的数据延迟或错误。教育与学术资源库在线教育平台和学术资源库通常包含大量的教材、研究论文、课程视频等重要内容。反爬虫技术被用于防止这些资源被大规模爬取和非法传播,从而保护知识产权和学术成果。反爬虫技术还可以帮助管理网站流量,确保用户在访问高峰期也能顺畅获取所需的学习资源。政府和公共服务网站政府门户网站和公共服务平台提供的公共数据和服务信息具有高度的公共性和敏感性。反爬虫技术用于防止未经授权的访问,确保数据的安全性和准确性限制自动化爬取行为,防止因恶意爬虫导致的服务中断或信息泄露招聘和求职平台招聘网站和求职平台上存储着大量的职位信息和求职者数据反爬虫技术保护其数据库免受大规模的爬取,防止数据被滥用或被竞争对手挪用防止恶意爬虫访问,保持平台的正常运营,确保招聘方和求职者能够顺利进行职位发布和求职操作。反反爬虫简介7.1.2反反爬虫是指爬虫程序为了绕过网站的反爬虫措施,继续执行数据抓取任务而采取的技术策略。01020304数据获取需求反反爬虫的首要动机是数据获取需求的不断增长。在大数据时代,企业和研究机构对于数据的依赖性显著增强。通过反反爬虫技术可以绕过反爬虫措施获取的数据,支持市场分析、产品优化以及学术研究等多种用途。提升数据抓取效率面对复杂的反爬虫机制,传统的爬虫技术往往无法高效获取数据。反反爬虫技术通过各种优化手段,提升了数据抓取的效率和成功率,以满足高需求的业务应用。技术挑战反反爬虫是一种技术挑战,部分开发者将破解反爬虫机制视为一种成就感的来源。这种动机推动了反反爬技术的不断创新,使其能够应对日益复杂的反爬虫策略商业竞争恶获取竞争对手的关键信息如市场数据、产品动向等,可能会为企业带来显著的竞争优势。反反爬虫技术成为一些公司在商业竞争中获取优势的重要手段。动机及应用技术对抗的动态过程随着技术的不断进步,反爬虫措施在不断演变,增加了多层次、复杂的防护策略,以应对开发者使用的新型爬虫技术,形成动态稳定的技术对抗。反爬虫措施的演进面对不断强化的反爬虫策略,反反爬虫技术也需不断创新,开发新的绕过手段甚至工具,确保对数据资源的有效获取,推动数据采集现代化。反反爬虫技术的创新法律与道德问题在技术创新的同时,需重视法律法规在数据采集中的应用,确保行事合规,以维护合法权益。合规性不仅关乎法律责任,也是公司声誉的重要组成部分。鼓励对抗技术的开发与应用应建立在道德基础上,确保不会侵犯他人权益。培养技术人员的道德意识,从而在技术使用与法律之间找到合理的平衡。数据获取的合法性道德意识的培养反爬虫与反反爬虫的技术对抗可以看作是一个持续的动态过程。在这个过程中,网站不断改进其反爬虫策略,而爬虫开发者则相应地提升反反爬虫技术。这种“攻防战”推动了技术的不断演进,也对互联网安全和数据采集的方式产生了深远影响。反爬虫与反反爬技虫术不仅仅是技术层面的对抗,还涉及法律和道德问题。在追求技术创新的同时,如何平衡数据获取的合法性和道德性,是我们需要认真思考的课题。小结PATR02反爬虫技术COMTENS010203静态页面反爬虫技术动态页面反爬虫技术反爬虫技术实践反爬虫技术静态页面反爬虫技术7.2.1IP封锁和速率限制是最基础的反爬虫手段。通过监控访问请求的IP地址和请求频率,系统可以识别出异常的访问模式。判断:当某个IP地址在短时间内发送了大量请求,可能表明该IP正在使用爬虫程序抓取内容方案:将可疑的IP地址加入黑名单,设置单个IP的访问频率上限1.IP封锁和速率限制http{includemime.types;default_typeapplication/octet-stream;#IP黑名单配置
deny00;#阻止这个IP00访问
deny5;#阻止另一个IP5访问
allowall;#允许其他IP访问
server{listen80;server_name;location/{root/usr/share/nginx/html;indexindex.htmlindex.htm;}}}静态页面反爬虫技术主要针对内容相对固定、没有动态交互的网页进行防护。静态页面通常由服务器生成一次后,直接提供给用户浏览,内容不会因用户操作而发生变化容易成为爬虫程序的目标静态页面反爬虫技术的主要策略和方法如下:【例7-1】Nginx配置IP封锁静态页面反爬虫技术7.2.1原理:每次网页请求都会携带一些HTTP请求头信息,这些信息包括User-Agent、Referer、Accept-Language等字段。判断:爬虫程序往往会使用默认或伪造的请求头信息,这些信息有时与正常用户浏览器发出的请求存在差异。检查请求中的User-Agent字段,将不符合正常浏览器行为的User-Agent,识别为爬虫。方案:如果发现不符合正常浏览器行为的User-Agent,则可以采取阻止或进一步验证的措施。验证请求的来源页面(Referer),识别直接访问特定内容的爬虫行为。2.HTTP请求头分析http{server{
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026广西南宁市第十中学星光校区(初中部)招聘1人笔试参考题库及答案详解
- 2026年江西省南昌市工会人员招聘考试参考试题及答案详解
- 2026年河北省邯郸市医疗系统事业编人员招聘笔试备考题库及答案详解
- 2026年琼中黎族苗族自治县消防救援局面向社会招录政府专职消防员6人考试参考题库及答案详解
- 2026年福州市晋安区政务服务中心(窗口人员)招聘笔试模拟试题及答案详解
- 2026年武汉市汉阳区工会人员招聘考试参考题库及答案详解
- 2026年吕梁地区工会人员招聘考试参考试题及答案详解
- 2026年柳州市城中区医疗系统事业编人员招聘笔试备考试题及答案详解
- 2026年涪陵区黔江区政务服务中心(窗口人员)招聘考试备考试题及答案详解
- 2026年吉安市青原区政务服务中心(窗口人员)招聘考试备考题库及答案详解
- 仓库钥匙责任管理制度
- 物流安全管理培训课件
- 生产净化车间管理制度
- (高清版)DG∕TJ 08-55-2019 城市居住地区和居住区公共服务设施设置标准
- 《城轨信号基础设备维护》课件-任务1 常见的道岔转辙机设备 ZYJ7型电动液压转辙机结构与工作原理
- 军体拳第一套全套图文教程
- 家庭医生签约服务评估方案
- 10J113-1内隔墙-轻质条板(一)
- 基于学生创新素养培育的实践活动研究课题申报评审书
- 全民健康养生餐饮连锁店项目策划书
- 建筑消防设施维护保养报告
评论
0/150
提交评论