3.2 开发简单的网络爬虫应用程序
在本节内容中,将通过几个简单实例让读者了解开发简易网络爬虫应用程序的方法,为后面综合实战项目的学习打下基础。
3.2.1 爬虫抓取某高校教师信息
实例文件jiao.py的功能,使用BeautifulSoup抓取某大学计算机与控制工程学院教师信息。教师列表页面的URL网址是http://computer.域名主页.edu.cn/news/?c=teacher&a=teacherlist,如图3-1所示。
图3-1 某大学官网计算机与控制工程学院教师信息
我们要抓取上述网页中所有教师的姓名信息和学位信息,打开谷歌浏览器按〈F12〉键进入调试模式,找到中间显示教师信息的对应源码(每一名教师信息的实现源码都相同),具体源码如下图3-2所示。
图3-2 显示教师信息的源码
由于我们想要抓取的是教师姓名和学位,所以,需要提取的源码信息有如下两个。
● lea_name下的第一个选项值。
● lea_js下的call选项值。
另外,上述教师信息页面采用了分页显示模式,具体源码如图3-3所示。因此要抓取完整的教师信息,还需要对分页模式进行处理。
图3-3 分页显示模式
编写实例文件jiao.py,具体实现代码如下所示。
源码路径:daima\3\3-1\jiao.py
通过上述代码会抓取并打印输出所有分页中的教师姓名信息和学位信息,执行后会输出抓取的教师信息:
3.2.2 抓取某吧的信息
本实例文件tieba.py的功能是抓取某吧中某个帖子的信息,具体说明如下所示。
源码路径:daima\3\3-2\tieba.py
● 对某吧的任意帖子进行抓取。
● 设置是否只抓取楼主发帖内容。
● 将抓取到的内容分析并保存到指定的记事本文件中。
(1)确定URL并抓取页面代码
我们的目标是抓取某吧中的指定帖子:http://tieba.域名主页.com/p/4931694016,下面对其分析。
● tieba.xxx.com:是某吧的二级域名,指向某吧的服务器。
● /p/4931694016:是服务器某个资源,即这个帖子的地址定位符。
● see_lz和pn:表示该URL的两个参数,see_lz表示只看楼主,pn表示帖子页码,等于1表示该条件为真。
针对某吧的地址,可以把URL分为两部分:一部分为基础部分,一部分为参数部分。例如,上面的URL的基础部分是http://tieba.域名主页.com/p/4931694016,参数部分是?see_lz=1&pn=1。
(2)抓取页面
熟悉了抓取URL的格式后,接下来开始用urllib库来抓取页面中的内容。其中,有些帖子指定给程序是否要只看楼主,所以把只看楼主的参数初始化放在类的初始化上,即init方法。另外,获取指定页码帖子的号数也传入该方法中。
(3)提取帖子标题
提取帖子的标题,只需在浏览器中审查元素,或者按〈F12〉键,查看页面源代码,找到标题所在的代码段即可,如下所示。
若要提取<h1>标签中的内容,由于h1标签太多,所以需要指定class确定唯一。正则表达式代码如下所示。
(4)提取帖子页数
帖子总页数功能可通过分析页面中共多少页元素来获取。获取帖子总页数的方法如下所示。
(5)提取正文内容
通过审查元素可以看到,在某吧每一层楼的主要内容都在<div id=”post_content_xxxx”></div>标签里面,所以可以编写如下所示的正则表达式代码。
获取页面所有楼层数据的实现代码如下所示。
(6)编写工具类Tool
编写工具类Tool对抓取的文本进行处理,也就是把各种各样复杂的标签剔除掉,还原精华内容。为了实现代码重用,将标签处理功能定义为类Tool,然后里面定义方法replace()替换各种标签。在类Tool中使用正则表达式技术实现标签过滤,如使用re.sub()方法对文本进行匹配替换。类Tool的具体实现代码如下所示。
到此为止,整个实例介绍完毕。实例文件tieba.py的主要实现代码如下所示。
执行后程序提示输入一个帖子的地址,如输入“4931694016”,然后询问“是否只获取楼主发言”和“是否写入楼层信息”。执行效果如图3-4所示。
图3-4 执行效果
在实例文件tieba.py的同级目录下生成一个与帖子标题相同的记事本文件“穆帅:半场休息时,我告诉拉什福德别在意浪费掉的机会!!.txt”,双击打开,会发现在里面存储了抓取的帖子“http://tieba.域名主页.com/p/4931694016”中的内容,如图3-5所示。
图3-5 抓取的内容
3.2.3 抓取XX百科
本实例文件baike.py能够抓取XX百科网站中的热门信息,具体功能如下所示。
● 抓取XX百科热门段子。
● 过滤带有图片的段子。
● 每按〈Enter〉键一次,显示一个段子的发布时间、发布人、段子内容和点赞数。
源码路径:daima\3\3-3\baike.py
(1)确定URL并抓取页面代码。
首先确定页面URL是http://www.域名主页.com/hot/page/1,其中,最后一个数字1代表当前的页数,可以传入不同的值来获得某一页的段子内容。编写代码设置要抓取的目标首页和user_agent值,具体实现代码如下所示。
执行后会打印输出第一页的HTML代码。
(2)提取某一页的所有段子。
获取HTML代码后,开始获取某一页的所有段子。首先审查一下元素,然后按浏览器的〈F12〉键,如图3-6所示。
图3-6 http://www.域名主页.com/hot/的源码
由此可见,每一个段子都是被<div class="articleGender manIcon">…</div>包含的内容。若要获取页面中的发布人、发布日期、段子内容以及点赞个数,需要删除带有图片的段子,确保只保存只含文本的段子。为了实现这一功能,使用正则表达式方法re.findall()寻找所有匹配的内容。编写的正则表达式匹配语句如下所示。
上述正则表达式是整个程序的核心,本实例的实现文件是baike.py,具体实现代码如下所示。
执行效果如图3-7所示,每按〈Enter〉键就会显示下一条热门段子信息。
图3-7 执行效果
3.2.4 爬虫抓取某网站的信息并保存到本地
本实例是使用BeautifulSoup抓取某网站中关键字为“小说”的文章信息,并将抓取到的信息保存到本地记事本文件中。编写实例文件article.py的具体思路如下所示:
1)在程序中设置两层循环,其中外循环用于逐个访问不同的页数,内循环用于逐个访问当前页面内的不同文章。
2)当内循环进入文章后,通过正则表达式依次获取文章标题、作者、译者和文章主体等信息。
3)每当内循环获取到一篇文章,就采用追加的方式将抓取到的信息写入指定的记事本文件中。
文件Spider_Guokr_article.py的具体实现代码如下所示。
源码路径:daima\3\3-4\article.py
抓取目标网站中关键字为“小说”的文章信息,并将抓取的信息保存到本地记事本文件中,如图3-8所示。
图3-8 抓取文章到并保存到本地记事本文件