《Python网络爬虫技术案例教程》全套教学课件_第1页
《Python网络爬虫技术案例教程》全套教学课件_第2页
《Python网络爬虫技术案例教程》全套教学课件_第3页
《Python网络爬虫技术案例教程》全套教学课件_第4页
《Python网络爬虫技术案例教程》全套教学课件_第5页
已阅读5页,还剩869页未读 继续免费阅读

下载本文档

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

文档简介

.Python网络爬虫.Python网络爬虫.Python网络爬虫.Python网络爬虫.Python网络爬虫Python网络爬虫技术案例教程PythonWangluoPachongJishuAnliJiaocheng全套可编辑PPT课件COMMITTEDCOMMITTEDCOMMITTECOMMITTECONTENTS目录COMMITTED第1章网络爬虫入门

第2章爬虫基础第3章网页解析基础第4章爬取动态加载数据第5章反爬虫策略第6章模拟登录和处理验证码

第7章爬取App和PC客户端第8章爬虫框架Scrapy第9章分布式爬虫第10章项目实战.Python网络爬虫.Python网络爬虫.Python网络爬虫.Python网络爬虫.Python网络爬虫第1章

网络爬虫入门本章导读在当今这个数据大爆炸的信息时代,用户与网络的沟通本质上是数据的交换,这导致了互联网信息数据量的爆发式增长。海量的互联网数据蕴含着巨大的价值,用户如何自动高效地从互联网中获取感兴趣的信息并有效地应用是一个亟待解决的问题。在这样的环境和需求的影响下,网络爬虫应运而生,它为互联网数据的采集提供了新的方法。本章从网络爬虫概述入手,介绍网络爬虫的相关基础知识,包括网络爬虫的原理、分类和应用,网络爬虫工作流程,网络爬虫协议,以及搭建Python开发环境等内容。学习目标理解网络爬虫的原理、分类和应用。掌握网络爬虫的工作流程。了解网络爬虫协议。能在Windows系统中搭建Python开发环境。1.1网络爬虫概述1.2网络爬虫工作流程1.3网络爬虫协议第1章网络爬虫入门1.4搭建Python开发环境.Python网络爬虫.Python网络爬虫.Python网络爬虫.Python网络爬虫.Python网络爬虫1.1网络爬虫概述SectionTitle1.1网络爬虫概述1.1.1网络爬虫原理网络爬虫又称为“网络蜘蛛”,是一个用来实现自动采集网络数据的程序。如果将互联网比作一张蜘蛛网,互联网上的一个个网页比作蜘蛛网上的一个个节点,那么网页与网页之间的链接关系可以比作节点间的连线,而网络爬虫就可以比作在网上爬来爬去的蜘蛛。蜘蛛爬到一个节点相当于访问了该网页,提取了信息,然后顺着节点间的连线继续爬行到下一个节点,这样周而复始,蜘蛛就可以爬遍整个网络的所有节点,抓取数据。1.1网络爬虫概述总的来说,网络爬虫的基本原理可用图1-1描述。图1-1网络爬虫基本原理1.1网络爬虫概述(1)预先设定一个或若干个初始网页的URL,将初始URL加入待爬取URL列表中。(2)从待爬取列表中逐个读取URL,并将URL加入已爬取URL列表中,然后下载网页。(3)解析已下载的网页,提取所需的数据和新的URL,并存储提取的数据。(4)将新的URL与已爬取的URL列表进行比对,检查该网页是否已爬取,如果网页没有被爬取,则将新的URL放入待爬取URL列表的末尾,等待读取。(5)如此往复,直到待爬取URL列表为空或者满足设定的终止条件,最终达到遍历网页的目的。1.1网络爬虫概述统一资源定位符(UniformResourceLocator,URL)是对可以从互联网上得到的资源位置和访问方法的一种简洁表示,是互联网上标准资源的地址。1.1网络爬虫概述1.1.2网络爬虫分类网络爬虫按照系统结构和工作原理的不同,大致可以分为四类:系统结构和工作原理的不同通用网络爬虫聚焦网络爬虫增量式网络爬虫深层网络爬虫1.1网络爬虫概述(1)通用网络爬虫又称全网爬虫,是根据网络爬虫的基本原理实现的,它所爬取的目标会从初始设定的URL扩充到全网。通用网络爬虫主要应用于门户网站、搜索引擎和大型网络服务提供商的数据采集。1.1网络爬虫概述(2)聚焦网络爬虫爬取的目标是与预先定义好的主题相关的网页。与通用网络爬虫相比,聚焦网络爬虫只选择爬取与主题相关的网页,极大地节省了硬件和网络资源,它主要应用于对特定领域信息有需求的场景。聚焦网络爬虫在通用网络爬虫的基础上,需要对提取的新URL进行过滤处理,过滤掉与目标主题无关的网页,且根据一定的相关性搜索策略,确定待爬取URL列表的读取顺序。1.1网络爬虫概述(3)增量式网络爬虫爬取的目标是有更新的已下载网页和新产生的网页。爬虫程序监测网站数据更新的情况,然后在需要的时候只爬取发生更新或新产生的网页。这样,可有效减少数据下载量,及时更新已爬取的网页,但是增加了爬行算法的复杂度和实现难度。增量式网络爬虫主要应用于网页内容会时常更新的网站,或者不断有新网页出现的网站。1.1网络爬虫概述(4)深层网络爬虫爬取的目标是不能通过静态链接获取的,隐藏在搜索表单后的,只有用户提交一些关键词才能获得的网页,如用户注册后才可显示内容的网页。1.1网络爬虫概述1.1.3网络爬虫应用每个独立的搜索引擎都有自己的爬虫程序,爬虫程序每天连续地爬取相关网站,提取信息保存到索引数据库中,如Google爬虫Googlebot、百度爬虫Baiduspider、必应爬虫Bingbot

等。此外,有些搜索引擎对应不同的业务还有不同的爬虫,如百度图片爬虫Baiduspider-image、百度新闻爬虫Baiduspider-news等。搜索引擎在用户输入搜索信息后并不是直接搜索整个互联网,而是对预先建立好的索引数据库进行检索。1.1网络爬虫概述企业用户在采集和分析数据时也时常会借助网络爬虫。例如,爬取产品的用户信息进行分析,以确定目标客户群体;爬取同类产品的销售信息进行分析,以制定营销策略等。当然,普通用户也可以根据自己关注的主题采集所需要的数据,把浏览网站或App时所见到的数据都通过爬虫程序保存下来,实现可见即可得。例如,爬取网站上的图片、学术网站的论文、团购网站的价格及点评、各种电商平台的商品信息、招聘网站的招聘信息等数据。1.1网络爬虫概述(4)深层网络爬虫爬取的目标是不能通过静态链接获取的,隐藏在搜索表单后的,只有用户提交一些关键词才能获得的网页,如用户注册后才可显示内容的网页。1.2网络爬虫工作流程.Python网络爬虫.Python网络爬虫.Python网络爬虫.Python网络爬虫.Python网络爬虫SectionTitle1.2网络爬虫工作流程网络爬虫是一个自动化的程序,它的工作流程非常简单。爬虫程序首先发送请求,获取网页响应的内容,然后解析网页内容,最后将提取的数据存储到文件或数据库中。总结起来,其工作流程可以分为爬取网页、解析网页和存储数据三个步骤,如图1-2所示。图1-2网络爬虫工作流程1.2网络爬虫工作流程1.2.1爬取网页爬虫程序首先要做的工作是爬取网页,即获取网页的源代码。源代码里包含了网页的有用信息,所以只要把源代码爬取下来,就可以从中提取想要的信息。爬虫程序向网站的服务器发送一个HTTP请求,服务器返回给爬虫程序包含所需数据的HTTP响应(即网页源代码)。Python提供了许多与网络爬虫相关的库,其中,在爬取网页方面有urllib、requests、selenium库等。1.2网络爬虫工作流程1.2.2解析网页爬取网页后,接下来就是解析网页了。解析网页是用户根据网页结构,分析网页源代码,从中提取想要的数据。它可以使杂乱的数据变得条理清晰,以便用户后续处理和分析。解析网页万能的方法是正则表达式,但是构造正则表达式比较复杂且容易出错,所以Python根据网页节点属性、CSS选择器及XPath语法提供了网页的解析库,如beautifulsoup4、lxml库等。使用这些库,用户可以高效快速地解析网页。1.2网络爬虫工作流程1.2.3存储数据解析网页提取数据后,一般要将提取到的数据保存起来以便后续使用。保存数据的方式有很多种,可以将其简单保存到JSON或CSV文件中,也可以保存到数据库中,如MySQL和MongoDB等。1.3网络爬虫协议.Python网络爬虫.Python网络爬虫.Python网络爬虫.Python网络爬虫.Python网络爬虫SectionTitle1.3网络爬虫协议1.3.1网络爬虫合法性虽然互联网世界已经通过自己的规则建立了一定的道德规范(Robots协议),但法律部分还在建立和完善中。从目前的情况来看,如果抓取的数据用于个人使用或科学研究,那么基本上是不违法的;但如果数据用于其他用途,尤其是转载或商业用途,那么根据爬取网站数据的不同情况有不同的后果,严重的将会引起民事纠纷甚至触犯法律。因此,用户在爬取数据时应避免以下几个方面的问题。1.3网络爬虫协议应避免以下几个方面的问题(1)侵犯著作权。(2)侵犯商业秘密。(3)侵犯个人隐私。(4)构成不正当竞争。(5)侵入计算机系统,构成刑事犯罪。1.3网络爬虫协议百度与大众点评不正当竞争纠纷案是百度公司因使用技术手段抓取并使用大众点评内容而被认定为构成不正当竞争的案例。本案在2016年被列为“影响中国互联网法制进程十大案例”之一。大众点评是上海汉涛信息咨询有限公司(下称“汉涛公司”)向网络用户提供商户基本信息及点评信息的生活服务App。北京百度网讯科技有限公司(下称“百度公司”)使用技术手段在大众点评等App上抓取了商户的基本信息及点评信息,用户使用其运营的百度地图App查询位置时,无须跳转至大众点评界面,就可直接在百度地图界面获取商户的基本信息和点评信息。汉涛公司以百度公司等相关主体构成不正当竞争向法院起诉。在本案审理过程中,法院将《反不正当竞争法》第二条作为主要裁判依据,并最终认定百度公司构成不正当竞争。1.3网络爬虫协议1.3.2Robots协议Robots协议(又称“爬虫协议”)的全称是“网络爬虫排除标准”(Robotsexclusionprotocol)。网站管理者可以通过它来表达是否希望爬虫程序自动获取网站信息的意愿。管理者可以在网站根目录下放置一个robots.txt文件,并在文件中列出哪些链接不允许爬虫程序获取。当爬虫程序访问一个网站时,它会首先检查该网站根目录下是否存在robots.txt文件,如果存在,爬虫程序就会按照该文件中的内容来确定访问范围;如果不存在,爬虫程序就能够访问网站上所有没被保护的网页。1.3网络爬虫协议robots.txt文件遵循一定的格式,下面以知乎的robots.txt文件为例进行介绍。访问/robots.txt,可以查看完整代码(这里仅截取部分代码进行分析),如图1-3所示。图1-3知乎的robots.txt文件部分代码1.3网络爬虫协议“User-agent:Googlebot-Image”表示这部分代码针对谷歌图片爬虫,禁止或允许谷歌图片爬虫爬取某些文件;如果代码为“User-agent:*”,则表示针对所有搜索引擎的爬虫程序。“Disallow:/appview/”表示禁止爬取网站根目录的appview文件夹下的文件。1.3网络爬虫协议“Disallow:/*?guide*”表示禁止爬取网站中所有包含guide的网址。“Allow:/search-special”表示允许爬取网站根目录下所有以search-special开头的文件夹和文件。1.3网络爬虫协议当然,如果要禁止爬虫程序爬取网站中的所有内容,可以用更简单的方法。例如,淘宝网不允许百度的爬虫程序访问其网站下所有的目录,其robots.txt文件内容如图1-4所示。图1-4淘宝网的robots.txt文件1.3网络爬虫协议在百度里搜索淘宝就会显示“由于该网站的robots.txt文件存在限制指令(限制搜索引擎抓取),系统无法提供该页面的内容描述”,如图1-5所示。图1-5百度搜索淘宝官网的显示情况1.4搭建Python开发环境.Python网络爬虫.Python网络爬虫.Python网络爬虫.Python网络爬虫.Python网络爬虫SectionTitle1.4搭建Python开发环境学习Python网络爬虫首先需要搭建Python开发环境,一般情况下,用户可以直接下载并安装Python,也可以通过Anaconda安装Python。本节介绍安装Anaconda和PyCharm编辑器,来搭建Python开发环境的方法,从而开始网络爬虫的开发之旅。

1.4搭建Python开发环境Anaconda是一个开源的Python发行版本,它包含了Conda、Python等超过180个科学包及其依赖项。PyCharm是一款非常优秀的Python编辑器,带有一整套可以帮助用户在使用Python语言开发时提高效率的工具,如调试、语法高亮、Project管理、代码跳转、智能提示、自动完成、单元测试、版本控制等。1.4搭建Python开发环境1.4.1安装Anaconda1.下载步骤一:访问/,在打开的Anaconda主页中选择“Products”→“IndividualEdition”选项,如图1-6所示。图1-6Anaconda主页

访问/,1.4搭建Python开发环境步骤二:打开下载页面,向下拖动滚动条,直到出现Anaconda安装版本信息,选择“Windows”→“Python3.7”→“64-BitGraphicalInstaller”选项,下载安装软件,如图1-7所示。图1-7下载Anaconda1.4搭建Python开发环境2.安装步骤一:双击下载好的Anaconda3-2020.02-Windows-x86_64.exe文件,在打开的对话框中单击“Next”按钮,如图1-8所示。图1-8欢迎安装

1.4搭建Python开发环境步骤二:显示“LicenseAgreement”界面,单击“IAgree”按钮,如图1-9所示。图1-9同意安装许可1.4搭建Python开发环境步骤三:显示“SelectInstallationType”界面,在“Installfor”列表中勾选“JustMe”单选钮,单击“Next”按钮,如图1-10所示。如果系统创建了多个用户而且都使用Anaconda,则勾选“AllUsers”单选钮。图1-10选择用户1.4搭建Python开发环境步骤四:显示“ChooseInstallLocation”界面,直接使用默认路径,单击“Next”按钮,如图1-11所示。

图1-11设置安装路径1.4搭建Python开发环境步骤五:显示“AdvancedInstallationOptions”界面。在“AdvancedOptions”列表中勾选“AddAnaconda3tomyPATHenvironmentvariable”和“RegisterAnaconda3asmydefaultPython3.7”复选框,单击“Install”按钮,如图1-12所示。图1-12设置系统环境1.4搭建Python开发环境步骤六:安装完成后单击“Next”按钮,最后单击“Finish”按钮,完成Anaconda3的安装。勾选“AddAnaconda3tomyPATHenvironmentvariable”表示把Anaconda3加入环境变量;勾选“RegisterAnaconda3asmydefaultPython3.7”表示将Anaconda3注册为默认安装的Python3.7。1.4搭建Python开发环境3.验证步骤一:单击“开始”按钮,选择“Anaconda3”→“AnacondaPrompt”选项,如图1-13所示。图1-13启动AnacondaPrompt

1.4搭建Python开发环境步骤二:单击“开始”按钮,选择“Anaconda3”→“AnacondaPrompt”选项,如图1-13所示。

图1-14Anaconda库名和版本号列表

1.4搭建Python开发环境1.4.2安装PyCharm1.下载访问/pycharm/download/#section=windows,在打开的下载页面中单击“Community”下的“Download”按钮,下载社区版,如图1-15所示。图1-15下载PyCharm1.4搭建Python开发环境2.安装步骤一:解压下载好的安装包,双击pycharm-community-2020.1.1.exe文件,运行安装程序。步骤二:根据安装提示进行安装即可。1.4搭建Python开发环境在“InstallationOptions”对话框中勾选所有复选框,如图1-16所示。图1-16设置安装选项1.4搭建Python开发环境3.使用步骤一:启动PyCharm,打开“ImportPyCharmSettings”对话框,勾选“Donotimportsettings”单选钮,单击“OK”按钮,如图1-17所示。图1-17PyCharm导入设置1.4搭建Python开发环境步骤二:

打开“CustomizePyCharm”对话框,勾选“Light”单选钮,单击“SkipRemainingandSetDefaults”按钮,如图1-18所示。图1-18设置用户界面主题1.4搭建Python开发环境步骤1和步骤2中的对话框只在PyCharm首次使用时会显示,进行配置后,再次使用时就不需要再进行配置了。1.4搭建Python开发环境步骤三:打开“WelcometoPyCharm”对话框,选择“CreateNewProject”选项,如图1-19所示。图1-19创建新项目1.4搭建Python开发环境步骤四:打开“NewProject”对话框,在“Location”编辑框中设置项目保存的路径,并将项目命名为“Test”;在“Newenvironmentusing”下拉列表中选择默认的“Virtualenv”选项;在“Baseinterpreter”中选择Anaconda安装目录下的python.exe,单击“Create”按钮,如图1-20所示。图1-20配置新项目环境1.4搭建Python开发环境Virtualenv是一个虚拟环境管理器,它可以创建多个虚拟环境,为不同项目提供独立的Python运行环境,以解决不同项目间多版本的冲突问题。在不继承全局安装包的情况下,在Virtualenv环境中安装所需要的包时,会自动安装到该虚拟环境下,不会对其他项目环境有任何影响。1.4搭建Python开发环境步骤五:

打开“PyCharm”窗口。右击项目名“Test”,在弹出的快捷菜单中选择“New”→“PythonFile”选项,新建一个Python文件,如图1-21所示。图1-21新建Python文件1.4搭建Python开发环境步骤六:打开“NewPythonfile”对话框,将文件命名为“HelloWorld”,双击“Pythonfile”选项,如图1-22所示。图1-22命名文件1.4搭建Python开发环境Python程序的源文件扩展名为“.py”。如果要在PyCharm的项目中导入已经编写好的源文件,可以将源文件放到项目文件夹根目录下,这样源文件可显示在项目中。1.4搭建Python开发环境步骤七:进入“HelloWorld.py”代码编辑界面,在程序编辑区输入代码,如图1-23所示。图1-23编写程序1.4搭建Python开发环境步骤八:在菜单栏中选择“Run”→“Run”选项,打开“Run”对话框,然后选择“HelloWorld”选项,运行程序,在窗口下方即可显示运行结果,如图1-24所示。图1-24运行“HelloWorld”示例实战演练——使用PyCharm配置Conda环境.Python网络爬虫.Python网络爬虫.Python网络爬虫.Python网络爬虫.Python网络爬虫SectionTitle实战演练——使用PyCharm配置Conda环境使用PyCharm配置Conda环境1.实战分析Anaconda集成了Conda、Python及很多安装好的工具包,其中Conda是一个开源的包和环境管理器,它允许用户可以同时安装若干不同版本的Python及其依赖包,并能够在不同的环境之间切换。同时,使用Conda安装新的工具包时,可以实现自动下载并安装,使用非常方便。2.实战目标安装了Anaconda后,使用PyCharm配置运行环境时,可以选择Conda环境,从而实现创建不同Python版本的开发环境。3.实战步骤具体步骤详见教材或扫码观看。.Python网络爬虫.Python网络爬虫.Python网络爬虫.Python网络爬虫.Python网络爬虫感谢观看Thanksforwatching.Python网络爬虫.Python网络爬虫.Python网络爬虫.Python网络爬虫.Python网络爬虫Python网络爬虫技术案例教程PythonWangluoPachongJishuAnliJiaochengCOMMITTEDCOMMITTEDCOMMITTECOMMITTECONTENTS目录COMMITTED第1章网络爬虫入门

第2章爬虫基础第3章网页解析基础第4章爬取动态加载数据第5章反爬虫策略第6章模拟登录和处理验证码

第7章爬取App和PC客户端第8章爬虫框架Scrapy第9章分布式爬虫第10章项目实战.Python网络爬虫.Python网络爬虫.Python网络爬虫.Python网络爬虫.Python网络爬虫第2章

爬虫基础本章导读网络爬虫工作流程中的第一步就是爬取网页,只有爬取网页获得了网页的源代码,才能提取其中的有效信息。而爬取网页首先就需要向Web服务器发送构造的HTTP请求,从而获得包含所需数据的HTTP响应。本章从HTTP基本原理入手,介绍网络爬虫爬取网页的基础知识,包括HTTP请求和HTTP响应、urllib库、requests库和字符编码等内容。学习目标理解HTTP的基本原理。了解urllib库的使用方法。掌握requests库的使用方法。了解Python中的字符编码。能使用urllib库和requests库构造HTTP请求实现网页的爬取。2.1HTTP基本原理2.2urllib库2.3requests库第2章爬虫基础2.4字符编码.Python网络爬虫.Python网络爬虫.Python网络爬虫.Python网络爬虫.Python网络爬虫SectionTitle2.1HTTP基本原理2.1HTTP基本原理2.1HTTP基本原理在浏览器中输入一个URL,按回车键后便会在浏览器中显示网页内容。实际上,这个过程是浏览器向Web服务器发送了一个HTTP请求;Web服务器接收到这个请求后进行解析和处理,然后返回给浏览器对应的HTTP响应;浏览器再对HTTP响应进行解析,从而将网页呈现了出来。下面以使用GoogleChrome浏览器打开百度的搜索页面为例来展示HTTP请求和响应的过程。HTTP基本原理2.1HTTP基本原理打开GoogleChrome浏览器,右击页面空白处,在弹出的快捷菜单中选择“检查”选项,打开浏览器的开发者工具窗口,然后选择“Network”选项。访问/,即可在开发者工具窗口中显示请求记录(见图2-1),其中每一条记录都代表一次发送请求和接收响应的过程。2.1HTTP基本原理图2-1GoogleChrome浏览器显示HTTP请求记录2.1HTTP基本原理图2-2HTTP请求和响应的详细信息在记录列表中,选择“”选项,然后在其右侧打开的界面中选择“Headers”选项,即可显示HTTP请求和响应的详细信息,如图2-2所示。2.1HTTP基本原理2.1.1HTTP请求请求的网址(RequestURL)请求方法(RequestMethod)请求头(RequestHeaders)请求体(RequestBody)2.1HTTP基本原理表2-2Content-Type和POST提交数据方式的关系1.请求的网址请求的网址即URL,它可以唯一确定请求的资源。图2-2中的“RequestURL”部分即为请求的网址(/)。Content-Type提交数据的方式application/x-www-form-urlencoded表单数据multipart/form-data表单文件application/json序列化JSON数据text/xmlXML数据2.1HTTP基本原理常见的请求方法有两种:GET方法和POST方法。(1)GET方法,请求指定的网页信息,并返回网页内容,提交的数据最多只有1024字节。(2)POST方法,向指定资源提交数据并进行请求处理(如提交表单或上传文件)。数据都包含在请求体中,提交的数据没有字节限制。2.请求方法2.1HTTP基本原理图2-2中的“RequestMethod”部分即为请求方法(GET方法)。可以看出,平时打开网站一般使用的是GET方法,也就是请求页面;如果是向网站提交数据(如登录网站),就用到了POST方法。还有一些其他的请求方法,如HEAD、PUT、DELETE、CONNECT、OPTIONS和TRACE等,在实际编写爬虫程序时很少用到,此处不再介绍。2.1HTTP基本原理请求头是请求的重要组成部分,在编写爬虫程序时,大部分情况下都需要设定请求头。不同请求的请求头包含的内容不同,应用时应根据实际需求设定。图2-2中的“RequestHeaders”部分即为请求头。常见的请求头及其说明如表2-1所示。3.请求头表5-2-4pstree命令中常用选项的含义请求头说明Accept指定客户端可识别的内容类型Accpet-Encoding指定客户端可识别的内容编码Accept-Language指定客户端可识别的语言类型Cookie网站为了辨别用户身份进行会话跟踪而存储在用户本地的数据,主要功能是维持当前访问会话Host指定请求的服务器的域名和端口号User-Agent使服务器识别客户端使用的操作系统及版本、浏览器及版本等信息,实现爬虫时加上此信息,可以伪装为浏览器Content-Type请求的媒体类型信息Content-Length请求的内容长度Referer包含一个URL,用户以该URL代表的页面出发访问当前请求页面2.1HTTP基本原理表2-1常见的请求头及其说明2.1HTTP基本原理其中,“Content-Type”确定了POST请求提交数据的方式,如表2-2所示。Content-Type提交数据的方式application/x-www-form-urlencoded表单数据multipart/form-data表单文件application/json序列化JSON数据text/xmlXML数据表2-2Content-Type和POST提交数据方式的关系2.1HTTP基本原理请求体中的内容一般是POST请求中的表单数据,而GET请求的请求体为空。例如,使用账户登录百度网站可看到POST请求中的请求体(“FormData”部分),如图2-3所示。4.请求体图2-3POST请求中的请求体2.1HTTP基本原理2.1.2HTTP响应HTTP响应可以分为三部分内容:响应状态码(ResponseStatusCode)响应头(ResponseHeaders)响应体(ResponseBody)2.1HTTP基本原理状态码英文名称说明100Continue服务器已收到请求的一部分,正在等待其余部分,应继续提出请求200OK服务器已成功处理了请求302MoveTemporarily服务器要求客户端重新发送一个请求304NotModified此请求返回的网页未修改,继续使用上次的资源404NotFound服务器找不到请求的网页500InternalServerError服务器遇到错误,无法完成请求表2-3常见的响应状态码1.响应状态码响应状态码表示服务器的响应状态,常见的响应状态码如表2-3所示。2.1HTTP基本原理图2-2HTTP请求和响应的详细信息图2-2中的“StatusCode”部分即为响应状态码(200OK)。在爬取网页时,爬虫程序可以根据状态码判断服务器的响应状态,如果状态码为200,则表明返回数据成功,可以进行下一步的处理。2.1HTTP基本原理响应头说明Content-EncodingWeb服务器支持的编码类型Content-Language响应体的语言Content-Length响应体的长度Content-Type返回内容的媒体类型Date原始服务器消息发出的时间表2-4常见的响应头及其说明2.响应头响应头包含了服务器对请求的应答信息,图2-2中的“ResponseHeaders”部分即为响应头。常见的响应头及其说明如表2-4所示。响应头说明Expires响应过期的日期和时间Last-Modified请求资源的最后修改时间Set-Cookie设置HTTPCookieLocation重定向接收到请求的URL位置2.1HTTP基本原理图2-4响应体3.响应体响应体包含响应的正文数据。例如,请求网页时,响应体是网页的网页源代码;请求图片时,响应体是图片的二进制数据。在图2-2中选择“Response”选项,可显示响应体,如图2-4所示。.Python网络爬虫.Python网络爬虫.Python网络爬虫.Python网络爬虫.Python网络爬虫SectionTitle2.2urllib库2.2urllib库2.2.1案例引入——爬取有道在线翻译网站的数据【例2-1】爬取有道在线翻译网站的内容(网址/),输出爬取到的信息。【问题分析】

首先构造HTTP请求,然后将HTTP响应的各部分进行输出。2.2urllib库【参考代码】

importurllib.request #导入request模块url='/' #定义url字符串#构造HTTP请求,并将返回的结果赋值给responseresponse=urllib.request.urlopen(url)print('响应类型:',type(response)) #输出响应类型print('响应状态码:',response.getcode()) #输出响应状态码#输出编码方式print('编码方式:',response.getheader('Content-Type'))print('请求的URL:',response.geturl()) #输出请求的URLresp=response.read().decode('utf-8') #读取网页内容并解码print('网页内容:\n',resp #输出网页内容2.2urllib库直接用urllib.request模块的urlopen()函数获取网页,返回的网页内容数据格式为bytes类型,需要利用decode()函数解码,转换成str类型。2.2urllib库【运行结果】程序的运行结果如图2-5所示。图2-5例2-1程序的运行结果2.2urllib库2.2.2urllib库简介urllib库是Python内置的标准库,不需要额外安装即可使用,它包含如下四个模块。(1)request:模拟发送HTTP请求。(2)error:处理HTTP请求错误时的异常。(3)parse:解析、拆分和合并URL。(4)robotparser:解析网站的robots.txt文件。2.2urllib库2.2.3发送请求request模块提供了基本的构造HTTP请求的方法,同时它还可以处理授权验证(authentication)、重定向(redirection)、Cookie会话及其他内容。本小节主要介绍通过urlopen()函数和Request()函数构造HTTP请求的方法。2.2urllib库2.2.3发送请求1.urlopen()函数urlopen()函数可以构造基本的HTTP请求,其函数原型如下:urlopen(url,data=None,[timeout,]*,cafile=None,capath=None,cadefault=False,context=None)2.2urllib库(1)url:请求的URL。可以是一个表示URL的字符串,也可以是一个Request类型的对象。这是必传参数,其他都是可选参数。(2)data:请求体信息(如在线翻译,在线答题等提交的内容)。data默认值是None,表示以GET方式发送请求;当用户给出data参数时,表示以POST方式发送请求。(3)timeout:设置网站的访问超时时间,单位为秒。如果请求超出了设置的时间而没有得到响应,就会抛出异常。如果不指定该参数,就会使用全局默认时间。(4)cafile、capath、cadefault:用于实现可信任CA证书的HTTP请求,基本很少使用。(5)context:实现SSL加密传输,基本很少使用。2.2urllib库Request类型的对象是调用urllib.request.Request()函数返回的对象,见本小节的Request()函数部分。urlopen()函数的data参数必须是bytes(字节流)类型,如果是字典类型,可以先用urllib.parse模块的urlencode()函数编码,见2.2.5小节。2.2urllib库调用函数后,返回一个HTTPResponse类型的对象,该对象提供的方法和属性如表2-5所示。方法和属性说明getcode()/status获取响应状态码get_url()获取请求的URLgetheaders()获取响应头信息,返回二元组列表getheader(name)获取特定响应头信息info()获取响应头信息,返回字符串read()/readline()读取响应体表2-5HTTPResponse类型对象提供的方法和属性2.2urllib库urlopen()函数既可以实现GET请求(见例2-1),又可以通过设置data参数实现POST请求。【例2-2】爬取有道在线翻译网站,实现翻译的过程,输出爬取到的信息。【问题分析】首先,在GoogleChrome浏览器中访问/;然后,打开浏览器的开发者工具窗口,选择“Network”选项;接着,在翻译页面中输入需要翻译的内容,如“苹果”,单击“翻译”按钮;最后,在开发者工具窗口的请求记录中选择“translate_o?smartresult=dict&smartresult=rule”选项,即可查看HTTP请求的URL和请求体(即为url和data参数),如图2-6所示。2.2urllib库图2-6有道在线翻译的POST请求信息2.2urllib库【参考代码】

importurllib.request #导入request模块url='/translate?smartresult=dict&'\'smartresult=rule' #定义url字符串datavalue={'i':'苹果','from':'AUTO','to':'AUTO','smartresult':'dict','client':'fanyideskweb','salt':'15924715113269','sign':'5c3a992ac57ed879b7678ff05bb3ec44','ts':'1592471511326',2.2urllib库'bv':'c74c03c52496795b65595fdc27140f0f','doctype':'json','version':'2.1','keyfrom':'fanyi.web','action':'FY_BY_REALTlME'} #定义datavalue参数#编码datavalue参数datavalue=urllib.parse.urlencode(datavalue).encode('utf-8')#构造HTTP请求,并将返回的结果赋值给responseresponse=urllib.request.urlopen(url,data=datavalue)resp=response.read().decode('utf-8') #读取网页内容并解码print(resp) #输出网页内容2.2urllib库有道在线翻译网站存在反爬虫机制,在编写爬虫程序时需要将url中的“_o”去掉。2.2urllib库【运行结果】程序的运行结果如图2-7所示。返回的响应体中包含了翻译的内容和结果,如果想要修改翻译的内容,只需要修改data参数中“i”的值。图2-7例2-2程序的运行结果2.2urllib库2.Request()函数当HTTP请求信息较复杂时,可用Request()函数进行设置,其函数原型如下:Request(url,data=None,headers={},origin_req_host=None,unverifiable=False,method=None)2.2urllib库(1)url:请求的URL。(2)data:请求体信息,其使用方法与urlopen()函数中的data参数相同。(3)headers:请求头信息,如User_Agent、Cookie和Host等,是字典类型。(4)origin_req_host:客户端的host名称或者IP地址。(5)unverifiable:表示这个请求是无法验证的,在默认情况下设置为False。(6)method:请求方法,如GET、POST等,是字符串类型。调用函数后,返回一个Request类型的对象,然后再通过urlopen()函数构造完整的HTTP请求。当服务器有反爬虫机制时,可通过设置headers参数伪装成浏览器去访问网站。2.2urllib库【例2-2】

通过设置headers参数伪装成浏览器爬取有道在线翻译网站的内容(网址/),输出爬取到的信息。importurllib.request #导入request模块url='/' #定义url字符串#设置headersvalue参数,伪装成浏览器headersvalue={'User-Agent':'Mozilla/5.0(WindowsNT10.0;''Win64;x64)AppleWebKit/537.36''(KHTML,likeGecko)Chrome/''83.0.4103.97Safari/537.36'}2.2urllib库#创建Request对象,并将返回的结果赋值给requestrequest=urllib.request.Request(url,headers=headersvalue)#构造HTTP请求,并将返回的结果赋值给responseresponse=urllib.request.urlopen(request)resp=response.read().decode('utf-8') #读取网页内容并解码print(resp) #输出网页内容2.2urllib库【运行结果】程序的运行结果如图2-8所示。图2-8例2-3程序的运行结果2.2urllib库2.2.4处理异常error模块提供了request模块产生的异常处理方法,它主要包含了URLError和HTTPError两个类。(1)URLError类是error异常模块的基类,可以捕获request模块产生的异常,它具有一个reason属性(返回异常的原因)。(2)HTTPError类是URLError类的子类,专门处理HTTP请求的异常,它具有3个属性,分别为reason(返回异常原因)、code(返回HTTP状态码)和headers(返回请求头)。因为HTTPError是URLError的子类,并不能处理父类支持的异常处理,所以一般对两种异常分开捕获,可先捕获子类的异常,再捕获父类的异常。2.2urllib库【例2-3】

爬取不存在的网站内容(如/api.htm),输出异常原因。【问题分析】访问一个不存在的网页时,会出现异常现象,程序可以通过捕获异常,输出异常原因,从而避免程序因为异常终止运行。2.2urllib库【参考代码】

importurllib.request #导入request模块importurllib.error #导入error模块try: #处理异常#构造HTTP请求,并将返回的结果赋值给responseresponse=urllib.request.urlopen('/api.htm')excepturllib.error.HTTPErrorase: #捕获HTTP请求的异常#输出HTTP请求的异常原因、状态码和请求头print('异常原因:',e.reason)print('状态码:',e.code)print('请求头:\n',e.headers)2.2urllib库【参考代码】

excepturllib.error.URLErrorase: #捕获URL异常 print(e.reason) #输出URL异常原因else: #如果没有异常则输出“RequestSuccessfully” print('RequestSuccessfully')2.2urllib库【运行结果】程序的运行结果如图2-9所示。图2-9例2-4程序的运行结果2.2urllib库2.2.5解析URLparse模块提供了解析URL的方法,包括URL的拆分、合并和转换,其方法如表2-6所示。功能函数说明拆分urlparse(urlstring)将URL拆分为六个部分,分别是scheme、netloc、path、params、query和fragmenturlsplit(urlstring)将URL拆分为五个部分,分别是scheme、netloc、path、query和fragment表2-6解析URL的方法2.2urllib库功能函数说明合并urljoin(url1,url2)将基础链接url1和新链接url2合并,分析url1的scheme、netloc、path内容,并补充url2缺失的部分urlunparse(parts)将可迭代对象parts合并为URL,parts长度为7urlunsplit(parts)将可迭代对象parts合并为URL,parts长度为6转换

urlencode(query)将字典形式的数据转换为URL后面的查询字符串parse_qs(qs)将URL后面的查询字符串转换为字典parse_qsl(qs)将URL后面的查询字符串转换为列表quote(str)将URL中的中文字符转换为URL编码unquote(str)将URL编码转换为中文字符,进行解码表2-6解析URL的方法(续)2.2urllib库【例2-5】解析“/?path=file&keyfrom=Nav-doc”,输出返回结果。importurllib.parse #导入parse模块#定义url字符串url='/?path=file&keyfrom=Nav-doc'print(urllib.parse.urlparse(url)) #拆分url并输出结果#合并url并输出结果print(urllib.parse.urljoin('/','?path=file&keyfrom=Nav-doc'))#定义params字符串params={'path':'file','keyfrom':'Nav-doc'}【参考代码】

2.2urllib库#编码params参数,合并url并输出结果print('/?'+urllib.parse.urlencode(params))query='path=file&keyfrom=Nav-doc' #定义query字符串print(urllib.parse.parse_qs(query)) #将query字符串转换成字典print(urllib.parse.parse_qsl(query)) #将query字符串转换成列表keyword='网络爬虫' 定义keyword中文字符串#将中文字符转换为URL编码,合并后赋值给urlurl='/?wd='+urllib.parse.quote(keyword)print(url) #输出URL编码的url#将URL编码转换为中文字符并输出结果print(urllib.parse.unquote(url))2.2urllib库【运行结果】程序的运行结果如图2-10所示。图2-10例2-5程序的运行结果2.2urllib库2.2.6分析Robots协议robotparser模块提供了分析网站Robots协议的RobotFileParser类,它可以通过分析网站的robots.txt文件来判断某网页是否能被爬取。RobotFileParser类提供了多种方法,常用的方法如下。2.2urllib库(1)set_url():设置robots.txt文件的URL。(2)read():读取robots.txt文件并进行分析。(3)can_fetch():第一个参数为User_Agent,第二个参数为要爬取网页的URL,判断该网页是否能被爬取。(4)parse():解析robots.txt文件中某些行的内容。(5)mtime():返回上次抓取和分析robots.txt文件的时间。(6)modified():将当前时间设置为上次抓取和分析robots.txt文件的时间。2.2urllib库【例2-3】解析有道在线翻译的robots.txt文件(网址/robots.txt),判断百度爬虫是否可以爬取有道网页翻译(/web2/index.html)和有道人工翻译网页(/?path=fast&keyfrom=Nav-fast),输出判断结果。【问题分析】首先创建RobotFileParser类对象,然后通过set_url()方法设置robots.txt文件的URL,接着利用read()方法读取robots.txt文件并进行分析,最后利用can_fetch()方法判断网页是否可以爬取,返回结果(True或False)。2.2urllib库importurllib.robotparser #导入robotparser模块#创建RobotFileParser类对象rprp=urllib.robotparser.RobotFileParser()#设置robots.txt文件的URLrp.set_url('/robots.txt')rp.read() #读取robots.txt文件并进行分析user_agent='Baiduspider' #定义爬虫名称#定义有道网页翻译的urlurl='/web2/index.html'【参考代码】

2.2urllib库#判断是否可以爬取有道网页翻译并输出判断结果print(rp.can_fetch(user_agent,url))#定义有道人工翻译网页的urlurl='/?path=fast&keyfrom=Nav-fast'#判断是否可以爬取有道人工翻译网页并输出判断结果print(rp.can_fetch(user_agent,url))2.2urllib库【运行结果】程序的运行结果如图2-11所示。图2-11例2-6程序的运行结果.Python网络爬虫.Python网络爬虫.Python网络爬虫.Python网络爬虫.Python网络爬虫SectionTitle2.3requests库2.3requests库2.3.1案例引入——爬取豆瓣网站的数据【例2-7】爬取豆瓣网的内容(网址/),输出爬取到的信息。【问题分析】使用get()函数发送HTTP请求,然后将HTTP响应的各部分进行输出。2.3requests库importrequests #导入requests模块#发送HTTP请求,并将返回结果赋值给rr=requests.get('/')print('响应类型:',type(r)) #输出响应类型print('请求的URL:',r.url) #输出请求的URLprint('响应状态码:',r.status_code) #输出响应状态码print('请求头:',r.request.headers) #输出请求头【参考代码】

2.3requests库【运行结果】程序的运行结果如图2-12所示。图2-12例2-7程序的运行结果2.3requests库2.3.2安装requests库上一小节学习了urllib库的基本用法,使用起来比较烦琐,而requests库是对urllib库的进一步封装,使用更加便捷。requests库可以实现很多功能,包括URL获取、HTTP长连接和连接缓存、HTTP会话、浏览器式的SSL验证、身份认证、Cookie会话、文件分块上传、流下载、HTTP(S)代理功能、连接超时处理等。requests库不是Python内置的标准库,使用之前需要安装。安装步骤如下。安装requests库2.3requests库步骤一:启动PyCharm,在菜单栏中选择“File”→“Settings”选项,如图2-13所示。图2-13设置项目

2.3requests库步骤二:

打开“Settings”对话框,选择“Project:conda_Test”→“ProjectInterpreter”选项,然后在显示的列表框的右侧单击“+”按钮,如图2-14所示。图2-14选择安装项目2.3requests库步骤三:打开“AvailablePackages”对话框,在搜索栏中输入“requests”,然后在显示的列表中选择“requests”选项,单击“InstallPackage”按钮,如图2-15所示。图2-15选择安装库2.3requests库步骤四:等待安装,安装成功后,对话框中将显示“Package'requests'installedsuccessfully”(见图2-16),关闭“AvailablePackages”对话框,单击“Settings”对话框的“OK”按钮完成安装。图2-16显示安装成功提示2.3requests库如果需要卸载库,可在“Settings”对话框的已安装库列表中选择该库,然后单击右侧的“-”按钮进行卸载。2.3requests库2.3.3请求方法requests库提供了几乎所有的HTTP请求方法,其中最常用的是GET方法和POST方法。请求方法2.3requests库1.GET方法urlopen()函数可以构造基本的HTTP请求,其函数原型如下:(1)url:请求的URL。这是必传参数,其他都是可选参数。(2)params:字典或字节序列,作为参数增加到url中。(3)**kwargs:控制访问的参数,如headers、cookies、timeout和proxies等。调用函数后,返回一个Response类型的对象,该对象提供的属性和方法如表2-7所示。get(url,params=None,**kwargs)2.3requests库具体例子参见例2-7。属性/方法说明status_code获取响应状态码headers获取响应头request.headers获取请求头url获取请求的URLencoding获取从HTTPheaders中猜测的响应内容编码方式apparent_encoding获取从响应内容分析出的编码方式content获取二进制类型的响应内容,会自动解码gzip和deflate编码的响应内容text获取文本类型的响应内容json()返回JSON类型数据raise_for_status()若是status_code不是200,则会抛出异常表2-7Response类型对象提供的属性和方法2.3requests库2.POST方法POST方法通过post()函数实现,其函数原型如下:(1)url:请求的URL。这是必传参数,其他都是可选参数。(2)data:字典、字节序列或文件对象,作为请求体的内容。(3)json:JSON格式的数据,作为请求体的内容。(4)**kwargs:控制访问的参数,如params、headers、cookies、timeout和proxies等。post()函数同样返回一个Response类型的对象。post(url,data=None,json=None,**kwargs)2.3requests库【例2-8】模拟登录豆瓣网站,输出响应对象的信息。【问题分析】首先,在GoogleChrome浏览器中访问/,打开豆瓣网的登录界面;然后,打开浏览器的开发者工具窗口,选择“Network”选项;接着,在豆瓣网的登录界面输入用户名和密码,登录豆瓣网;最后,在开发者工具窗口的请求记录中选择“basic”选项,即可显示HTTP请求的URL和请求体(即为url和data参数),如图2-17所示。2.3requests库图2-17登录豆瓣网的POST请求信息2.3requests库FormData部分为提交的表单数据,其中,name为账户名,password为密码,remember为是否记住密码,false表示不记住密码。2.3requests库importrequests #导入requests模块datavalue={'name':'11111','password':'222222','remember':'false'} #定义datavalue参数#定义url字符串url='/j/mobile/login/basic'#发送HTTP请求,并将返回结果赋值给rr=requests.post(url,data=datavalue)【参考代码】

2.3requests库print(type(r)) #输出返回对象类型print(r.url) #输出请求的URLprint(r.status_code)

#输出返回状态码print(r.request.headers)

#输出请求头2.3requests库【运行结果】程序的运行结果如图2-18所示。图2-18例2-8程序的运行结果2.3requests库requests库实现HTTP其他基本请求的方法如下:requests.put('/') #PUT请求requests.delete('/') #DELETE请求requests.head('/') #HEAD请求requests.options('/') #OPTIONS请求2.3requests库2.3.4传递URL参数有时网站会通过URL来传递查询参数,这时可使用get()函数或post()函数的params参数进行设置。传递URL参数2.3requests库【例2-9】在豆瓣网中查询与Python相关的内容,输出url值。【问题分析】

首先以字典形式定义params参数,然后将其传递到“/search”中,最后获取url(/search?q=Python)。importrequests #导入requests模块paramsvalue={'q':'Python'} #定义字典形式的paramsvalue参数值#将paramsvalue作为参数增加到url中并发送请求,将返回结果赋值给rr=requests.get('/search',params=paramsvalue)print(r.url) #输出url2.3requests库【运行结果】程序的运行结果如图2-19所示。图2-19例2-9程序的运行结果2.3requests库2.3.5定制请求头在requests库中,get()或post()函数可以直接传递字典形式的User_Agent信息给headers参数实现定制请求头。定制请求头【例2-9】

通过定制请求头爬取豆瓣网站的内容(网址/),输出爬取到的信息。2.3requests库mportrequests #导入requests模块url='/' #定义url字符串headersvalue={'User-Agent':'Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/83.0.4103.97Safari/537.36'} #设置请求头的User-Agent信息#不设置headers,发送HTTP请求,并将返回结果赋值给rr=requests.get(url)【参考代码】

2.3requests库print(r.status_code) #输出返回状态print(r.request.headers) #输出请求头#设置headers,发送HTTP请求,并将返回结果赋值给rr=requests.get(url,headers=headersvalue)print(r.status_code) #输出返回状态print(r.request.headers) #输出请求头2.3requests库【运行结果】程序的运行结果如图2-20所示。图2-20例2-10程序的运行结果2.3requests库从图2-20可以看出,例2-10第一次发送HTTP请求时,请求头中的User_Agent信息为Python的requests库的版本信息,表示爬虫程序发送该请求,且返回状态码是418,表示禁止爬虫程序爬取该网站;而第二次设置为浏览器信息,返回状态码为200,表示伪装成浏览器后成功爬取网站。所以,设置请求头参数是应对反爬虫机制的一种有效方法。2.3requests库2.3.6设置Cookie例2-8中利用post()函数登录了豆瓣网页,但是如果想要爬取豆瓣网站登录后的内容,还需要用到get()函数去请求页面,这时候可直接利用Cookie来维持登录状态。设置Cookie2.3requests库Cookie可以帮助用户记录访问Web页面时的个人信息,并保存在客户端,当用户再次访问同一Web页面时,Cookie可以提供上次用户访问信息。2.3requests库【例2-11】

通过设置Cookie爬取用户登录状态下豆瓣网站内容(网址/),输出爬取到的信息。【问题分析】

登录豆瓣网,在GoogleChrome浏览器的开发者工具窗口中复制“RequestHeaders”中“Cookie”信息(见图2-21),将其设置到程序的headers参数中。2.3requests库图2-21用户状态下豆瓣网的“Cookie”信息2.3requests库importrequests #导入requests模块headersvalue={ 'User-Agent':'Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/83.0.4103.97Safari/537.36','Cookie':'ll="108288";bid=FU35Y0eS-KI;_vwo_uuid_v2=D18B3319C1E99BBB6569C2519D7E87F51|5e9046ac929cff3665e02f4d7f9f68d7;__yadk_uid=5fkfy

温馨提示

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

评论

0/150

提交评论