Python爬虫实例之抓取猫眼电影排行

引言

本节我们利用requests库和正则表达式来抓取猫眼电影TOP的相关内容。requests比urllib使用更加方便,而且目前我们还没有系统学习HTML解析库,所以这里就选用正则表达式来作为解析工具。

本节目标

本节中,我们要提取猫眼电影TOP的电影名称、时间、评分、图片等信息,提取的站点URL如图所示:

提取的结果会以文件的形式保存下来。

抓取分析

在我们抓取之前,请确保已经正确安装好了requests库。我们打开我们需要爬取的站点就可以查看到榜单信息,如上图所示。

排名第一的电影是霸王别姬,页面中显示的有效信息有影片名称、主演、上映时间、上映地区、评分、图片等信息。

将网页滚动到最下方,可以发现有分页的列表,直接点击第2页,观察页面的URL和内容发生了怎样的变化,如图所示:

我们可以看到此时页面的URL多了一部分的参数,那就是offset=10,而且目前显示的结果是排行11-20名的电影,我们可以初步判断这是一个偏移量的参数。再点击下一页,发现页面的URL中的offset参数变成了20,而显示的结果是排行21-30的电影。

由此可以总结出规律,offset代表偏移量,如果偏移量为n,则显示的电影序号就是n+1到n+10,每页显示10个。所以,如果想要获取TOP电影,只需要分开请求10次,而10次的offset参数分别设置为0,10,20……90即可,这样获取不同的页面之后,再用正则表达式提取出相关信息,就可以得到TOP的所有电影信息了。

抓取首页

接下来用代码实现这个过程。首先抓取第一页的内容,我们实现了get_one_page()方法,并给它传入url参数。然后将抓取的页面结果返回,再通过main()方法调用。初步代码实现如下:

这样运行之后,就可以成功获取首页的源代码了。获取源代码之后,就需要解析页面,提取出我们想要的信息了。

正则提取

接下来,回到网页看一下页面的真实源码。在开发者模式下的Network监听组件中查看源代码。如下图所示:

源代码

注意,这里不要在Elements选项卡中直接查看源码,因为那里的源码可能经过JavaScript操作而与原始请求不同,而是需要从Network选项卡部分查看原始请求得到的源码。

查看其中一个条目的源代码,如图所示:

可以看到,一部电影信息对应的源代码是一个dd节点,我们用正则表达式来提取这里面的一些电影信息。首先,需要提取它的排名信息。而它的排名信息是在class为board-index的i节点内,这里利用非贪婪匹配来提取i节点内的信息,正则表达式写为:dd.*?board-index.*?(.*?)/i

随后需要提取电影的图片。可以看到,后面有a节点,其内部有两个img节点。经过检查后发现,第二个img节点的data-src属性是图片的链接。这里提取第二个img节点的data-src属性,正则表达式可以改写如下:

dd.*?board-index.*?(.*?)/i.*?data-src=(.*?)

再往后,需要提取电影的名称,它在后面的p节点内,class为name。所以,可以用name做一个标志位,然后进一步提取到其内a节点的正文内容,此时正则表达式改写如下:

dd.*?board-index.*?(.*?)/i.*?data-src=(.*?).*?name.*?a.*?(.*?)/a

再提取主演、发布时间、评分等内容时,都是同样的原理。最后,正则表达式写为:

dd.*?board-index.*?(.*?)/i.*?data-src=(.*?).*?name.*?a.*?(.*?)/a.*?star.*?(.*?)/p.*?releasetime.*?(.*?)/p.*?integer.*?(.*?)/i.*?fraction.*?(.*?)/i.*?/dd

这样一个正则表达式可以匹配一个电影的结果,里面匹配了7个信息。接下来,通过调用findall()方法提取出所有的内容。

接下来,我们再定义解析页面的方法parse_one_page(),主要通过正则表达式来从结果中提取出我们想要的内容,实现代码如下:

这样就可以成功地将一页的10个电影信息都提取出来,这是一个列表形式,输出结果如下:

但是这样还不够,数据比较杂乱,我们再将匹配结果处理一下,遍历提取结果,此时方法改写如下:

这样我们就成功提取了单页的电影信息啦。




转载请注明:http://www.aierlanlan.com/rzgz/2127.html

  • 上一篇文章:
  •   
  • 下一篇文章: