Python程序设计基础 课件 第十章 网络爬虫_第1页
Python程序设计基础 课件 第十章 网络爬虫_第2页
Python程序设计基础 课件 第十章 网络爬虫_第3页
Python程序设计基础 课件 第十章 网络爬虫_第4页
Python程序设计基础 课件 第十章 网络爬虫_第5页
已阅读5页,还剩23页未读 继续免费阅读

下载本文档

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

文档简介

第十章网络爬虫网络爬虫又称为网络蜘蛛,是一种高效的信息收集工具,能够对海量的信息进行自动抓取和筛选。网络爬虫通过requests库和beautifulsoup4库抓取互联网站上的信息并形成一个本地的备份,再借助其他的Python模块,将数据信息进行提取和可视化,方便用户进行分析。本章将用三节内容来介绍网络爬虫的相关知识:10.1程序包requests10.2程序包beautifulsoup410.3网络爬虫实例第十章网络爬虫程序包requests库是一个http请求库,该程序包可以模拟用户向网站服务器发出访问请求,得到服务器响应之后,通过服务器返回的requests对象“爬取”网页信息。程序包requests属于Python语言的外部库,需要用户自行下载。在PyCharm软件中,单击菜单“文件|设置”,找到“项目:ZYPrj03”下的“Python解释器”,这里的“ZYPrj03”为本书使用的项目名(对于不同的用户项目名会不相同),然后,单击左上部的“+”号弹出“可用软件包”窗口,在其中输入“requests”,然后,下载并安装该软件包。如果使用VisualStudio集成开发环境,则需要在控制台执行命令“pipinstallrequests”安装程序包requests。10.1程序包requests通常情况下,网站服务器使用的都是HTTP或者HTTPS协议,这两种协议的请求方式均为GET方式和POST方式。在爬取网页信息之前,需要先了解该网站访问的请求方式,之后,才能使用网络爬虫。在下表中列举了程序包requests中的常用方法。10.1程序包requests爬取一个网页信息的步骤为:首先,向该网页发送HTTP请求,网页响应后会返回一个response对象,网页的响应信息就储存在该对象中;然后,调用response对象中的属性,将其中的响应信息输出。下表列举了response对象的响应信息属性。10.1.1get方法下面的实例将对上表中常用的参数举例说明:10.1.1get方法第1行装载程序包requests,并命名其别名为req。第3~4行将网址赋给url1,该网页为一个月球的照片。第5行将网址赋给url2,该网址为“听力课堂”关于月球moon的翻译。第6~7行使用get方法“爬取”网址url1和url2的信息,这两行代码均调用程序包requests中的get方法,向指定的网址url1和url2分别发出GET方式的请求,在得到网页响应信息之后,网页会返回response对象,将返回的两个response对象分别保存在变量re1和re2中。第8行创建一个只写二进制文件moon.jpg。第9行向文件moon.jpg写入对象re1的响应内容。第10行关闭photo文件对象。执行程序后,工程所在目录下将生成一个moon.jpg文件。第11~15行输出re1对象(响应信息)的头部、状态码和状态,和re2对象(响应信息)的编码和文本信息。调用post方法可以向指定的网址发送POST请求,且该请求将包含的数据一起发送至网址,适用于向指定的网页发送特定的数据内容,例如上传图片文件等。post方法有三种常用的携带数据方式:表单方式(默认方式)json方式文件方式10.1.2post方法下面的实例将介绍上述三种方式的具体用法:10.1.2post方法第1行装载requests程序包,并命名为别名req;第2行装载程序包json。第4行将网址赋给url,该网址为一个测试HTTP请求与响应服务的网址。第5行将一个字典数据赋给dat1;第6行将一个json对象赋给dat2;第7行将一个字典数据赋给dat3,这里的文件zydat.txt为当前工程所在目录中的文本文件,其内容为“Addmyfile”。第8行调用post方法爬取数据,这里是调用post方法携带着指定的表单数据信息向网页发送POST请求,将网页返回的response对象保存在对象re1中。第9行调用post方法携带json对象数据向网页发送POST请求,将网页返回的response对象分别保存在对象re2中。第10行调用post方法携带文本数据信息向网页发送POST请求,将网页返回的response对象保存在对象re3。第11~13行输出re1对象、re2对象和re3对象中的文本数据。调用程序包requests中的请求方法链接网页时,会出现多种多样的异常情况,弄清每一种异常情况的提示语句,才能解决和避免异常。下表中列举了几种常见的异常情况。10.1.3网页链接异常情况为了避免程序因为得不到服务器响应而陷入无限等待,可以对参数timeout进行赋值,设置程序等待响应的时间。若在指定的时间内除了基本的应答字节,程序没有得到服务器反馈的字节数据,程序将会结束等待,自动抛出一个异常。调用程序包requests连接网页,将其HTML页面转换为字符串存储在文档中之后,需要对HTML页面的内容进行处理。程序包beautifulsoup4用于解析Web页面的HTML或者XML,将HTML文档转换为一个树形结构的文档,并将解析结果打包封装,配置了相应的方法对其进行访问。程序包beautifulsoup4还具有一个强大的功能,即可以根据HTML或者XML的语法来创建一个文档树。程序包beautifulsoup4是外部软件包,在使用前需要进行安装,安装方法类似于第10.1节介绍了程序包requests的安装方法。如果使用VisualStudio集成开发环境,需要在“命令提示符”窗口下使用命令“pipinstallbs4”安装程序包beautifulsoup4。对网页中所需的信息进行定位并爬取,需要了解HTML/XML页面的格式结构。程序包beautifulsoup4解析的HTML/XML页面的格式是一个树形结构,其中包含了几种结点对象,常用的四种对象有:Tag、BeautifulSoup、NavigableString和Comment。这里重点介绍Tag对象和BeautifulSoup对象。10.2程序包beautifulsoup4Tag对象是程序包beautifulsoup4中常用的对象,Tag对象中包含的标签和HTML中的标签相同。下表列举了Tag对象中常用的标签。在HTML页面中标签是成对使用的,其格式为:“<标签>内容部分</标签>”。可以随意打开一个网页,在页面的空白处单击鼠标右键,在其弹出菜单中选择“查看网页源代码”,或者按下“F12”键,即可查看到该网页的HTML代码。10.2.1Tag对象和BeautifulSoup对象调用beautifulsoup4库中的BeautifulSoup()方法可创建一个BeautifulSoup对象,该对象中包含了解析树的全部信息,实质上也属于一种Tag对象,但是BeautifulSoup对象比Tag对象的性能更强大,不仅可以对文档树进行搜索操作,还可以遍历整个文档树。了解了HTML的语法格式之后,仿照HTML页面的语法格式,可以自定义一个简单的BeautifulSoup对象。10.2.1Tag对象和BeautifulSoup对象自定义的BeautifulSoup对象的HTML格式与网页源代码一致,说明BeautifulSoup对象创建成功。调用主体内容对象(这里为bs)的text属性可获取自定义的页面内容。在HTML格式中,HTML的每一种标签都有四个基本属性。下表介绍了这四个属性的类型及其含义。10.2.1Tag对象和BeautifulSoup对象下面的实例介绍了上表中的标签属性及其用法:第3~7行将一段HTML网页代码赋给对象ht。第8行调用BeautifulSoup方法创建一个BeautifulSoup对象,“html.parser”表示使用HTML的语法格式模拟创建一个HTML页面,然后,用对象ht对页面的格式以及内容进行设置,将创建好的BeautifulSoup对象赋值给对象soup。第9行调用BeautifulSoup对象中的属性p,将BeautifulSoup对象中的第一个<p>标签内容赋值给变量p1。第10行调用<p>标签的name属性,得到<p>标签的名字,再调用print方法输出name属性。第11行调用<p>标签的attrs属性,得到<p>标签的所有属性,再调用print方法输出这些属性。第12行调用<p>标签的string属性,得到<p>标签的文本内容,再调用print方法输出这些文本信息。第13行调用<p>标签的contents属性,得到<p>标签的所有子标签,再调用print方法输出其内容。第14~18行使用find_all方法获取对象soup中的全部<p>标签,依次输出每个标签的名称、属性、文本内容和子标签信息。10.2.1Tag对象和BeautifulSoup对象在学习了程序包requests和beautifulsoup4之后,就可以实现一个简单的网页数据爬取程序。这里将爬取“豆瓣读书”网站中的一本书的评论数据。下图是“豆瓣读书”网上关于《呐喊》的一部分书评,该网页的网址为“/subject/1449351/comments/”。10.2.2应用实例在网页上,按下“F12”键查看一下网页的源代码,将发现短评数据的格式形如“<spanclass="short">鲁迅如果不被赋予那么多政治色彩,单看作品也是一个优秀的毒舌家的</span>”。第3~7行将一段第4~6行定义了字符串对象h。由于调用requests中的get方法连接网页时,建议设置一个headers参数,防止网页设置有反爬虫的装置,因此,这里模拟了一个用户访问网页的headers参数。第7~8行调用requests中的get方法,向网址的服务器发送请求,并将服务器返回的响应赋值给对象r。第9行调用程序包bs4中的BeautifulSoup方法,将响应数据转换为字符串形式,再调用lxml接口解析该响应信息,创建一个BeautifulSoup对象,赋给soup。第10行调用BeautifulSoup中的find_all方法查找响应信息中所有标签名为“span”属性为“short”的标签,并将查找的结果赋值给对象pattern。第11行“ls=[]”创建一个空的列表ls。第12~14行为一个for结构,借助变量e对对象pattern的元素进行遍历,在循环体中调用print函数输出标签中的文本信息,并调用append方法将标签中的文本信息添加到列表ls中。第15行调用open函数创建一个文件名为“zybookrev.txt”的文件对象,设置为写入模式,并赋给文件对象fp。第16~17行为一个for结构,借助i对列表ls进行遍历,调用文件对象fp的write方法,将列表ls中的文本数据逐个写入文件fp中。第18行关闭文件对象fp。下面的实例使用程序包requests和beautifulsoup4爬取该页面的书评(其观点与本书作者无关):10.2.2应用实例从网络中爬取所需的信息,关键的一步在于准确找出储存信息的标签,例如上述的第10.2.2节中爬取的书评信息,其保存在<span>标签中,爬取到数据后只需解析这个标签的内容。而使用程序包requests连接网页服务器以及使用程序包beautifulsoup4解析HTML页面的方法是“固定”的语句。本节将介绍程序包requests与beautifulsoup4和其他Python程序包配合使用,实现图片和新闻信息的爬取与处理方法。10.3网络爬虫实例在第10.2.2节的图中,每个短评均附有一个头像图片,利用程序包requests和beautifulsoup4可以爬取这些图片。下面的程序段介绍了爬取图片的方法,将爬取的图片保存在当前工程所在目录下的子目录pic下面。10.3.1图片爬取实例第3行装载模块os,其中包含了文件夹操作相关的方法。第5行将字符串“pic”赋给path,这里的path用作子目录名。第6行调用os.path.exists方法判断当前工程所在目录下有没有一个名称为path(即pic)的子目录,如果返回False表示没有该子目录,则第7行调用makedirs方法创建该子目录。第8~12行的含义与上一个实例中的第4~8行的含义相同。第13行调用程序包bs4中的BeautifulSoup方法,先将响应数据转换为字符串形式,再调用html解析该响应信息,创建一个BeautifulSoup对象,赋给对象soup。第14行输出提示信息“正在查找/下载网页中的图片”。第15行创建空列表ls。第16~18行为一个for结构,用于获取网页中各个图片的网址并将其网址保存在列表中。该for循环借助变量e对img标签的信息进行遍历,在循环体中对变量e调用get方法获取标签中的src属性中的图片网址,并将网址信息保存在变量addr中,然后,调用append方法将标签中的图片网址添加到列表ls中。10.3.1图片爬取实例代码的第一部分:第19行令n为0。第20~25行为一个for结构。使用for循环借助变量e对列表ls进行遍历,在循环体中:第21行表示每循环一次整型变量n自动加1,这里的n用作爬取的图像的存储文件名,当n=1时,存储的文件名为“001.jpg”。第22行,调用requests中的get方法向网址e发送访问请求,并给参数timeout赋值,设置等待响应时间为10ms。第23行调用open函数在pic子目录内创建一个新的文件对象,并借助变量n对文件对象进行命名,再将文件对象设置为写入操作,最后把创建的文件对象赋值给fp,这里“{0:03}”中冒号前的“0”为位置参数,对应于format方法中的第0个参数,即format方法的第0个参数(这里为n)放置在该位置处;冒号后面的“03”表示长度为3个字符,若不够3个字符,则以“0”填充。第24行调用write方法将爬取的图片信息以二进制的形式写入到文件fp中。第25行调用close方法关闭fp对象。第26行输出提示信息“图片下载完成”。10.3.1图片爬取实例代码的第二部分:由这个实例可知,网页图片的爬取过程如下:(1)设置好headers、网址以及其他需要使用的参数,调用requests中的get方法和BeautifulSoup方法对网页进行连接和解析,建立一个BeautifulSoup对象。(2)在要爬取信息的网页中,通过单击鼠标右键弹出菜单的“查看网页源代码”或按下“F12”键,在网页源代码中查找保存该信息的标签名。例如,要爬取的图片的网址信息保存在<img>标签中的“src”属性中。(3)调用find_all方法收集所有<img>标签的信息,并借助于for循环遍历这些标签信息,每次循环中对选中的标签调用get方法,获取标签中的“src”属性的数据,把获取到的图片地址添加到列表中。(4)利用os模块的makedirs方法创建一个文件夹用于保存图片。一般地,借助于for循环和get方法依次访问图片网址并获取图片,将图片(名称编号后)保存在刚创建的文件夹中。10.3.1图片爬取实例目前,互联网是获取新闻的主要渠道。这里针对“网易新闻(国际)”网页(网址为:/world/),利用网络爬虫爬取其中的新闻标题,然后,对爬取的新闻标题进行可视化处理,突出当前发生的热门新闻事件。下面的实例展示了新闻标题的爬取和可视化方法。10.3.2新闻标题爬取与可视化第3行装载模块re。第4行装载模块wordcloud,并赋以别名wc,模块wordcloud用于生成词云。第6行装载模块jieba,该模块为中文分词工具程序包。第7行装载模块imageio,并赋以别名im,该模块为图像视频读写库。这里需要在PyCharm中安装wordcloud、jieba、imageio程序包,安装方法与安装requests相同。第9~14行的含义与上一个实例中的第8~13行相同。第15行为response对象中的属性encoding赋值“utf-8”,表示将网页编码设置为“utf-8”。代码的第一部分:10.3.2新闻标题爬取与可视化第16行调用正则表达式的compile函数创建一个pattern对象,用于对HTML转换的文本信息进行筛选,把储存新闻标题的标签筛选出来。通过查看“网易新闻(国际)”网页(网址为:/world/)的源代码,可知每个标题的格式形如“<div><ahref="/news/article/HD1ARIPD00018AP2.html">下周来华访问的外国元首,创下两个纪录</a></div>”,这里的“'.html">(.*?)</a></div>'”匹配的字符串形如为:以“.html">”开头、以“</a></div>”结尾中间包括任意长度字符串,“(.*?)”表示以非贪心模式匹配任意长度的字符串。第17行调用re中的findall函数,利用对象pattern对标签进行筛选,查找出全部新闻的标题,赋给对象pt。第18行定义空列表newslist。代码的第二部分:10.3.2新闻标题爬取与可视化第19~20行为一个for结构,将pt中的标题字符串添加到列表newslist中。第21行利用for循环读取事先创建的需要去除的词的文本文件,调用line.strip()将文本文件中的换行符全部删除,再调用函数set生成一个集合。该集合用于除去标题中的介词(只保留名词)。这里的“停用词”文件stopwords.txt的部分内容如图所示。第22行“words=[]”定义空列表words。第23~29行为一个for结构,用于提取列表newslist中的标题信息的实词。第24行如果e只包含空格,则第25行跳转到第23行继续下一次循环。第26行提取e(这里的e为一个新闻标题)中的分词。第27~29行为一个for结构,用集合stop_words将分完词的标题去除介词等虚词(只保留名词等实词),并将实词添加到列表words中。第28行中的“flag=='n'”表示只取名词。代码的第三部分:10.3.2新闻标题爬取与可视化第30行读入一幅图像作为词云的形状。这里使用了中国地图。这张图像来自“http://3/a-43324378.html”(请使用网页上的“下载PNG元素”下载)。读者也可以使用其他(背景透明的)图形文件,但需要将使用的图形文件保存在当前工程所在的目录。第31行调用join函数,将words中的所有词连接成一个字符串,且任两个词间用空格分隔。第32~35行“调用WordCloud方法生成一个词云,其中,“font_path='simhei.ttf'”设置文字字体为“simhei.ttf”;“backg

温馨提示

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

最新文档

评论

0/150

提交评论