基于Scrapy框架的电影数据爬取和可视化分析*
2022-03-31王嘉宝雒伟群
王嘉宝 雒伟群
(西藏民族大学信息工程学院,陕西 咸阳 712082)
0 引言
电影自诞生以来就一直是人们抒发观点、记录历史、彰显文明的一项重要的艺术形式。在互联网飞速发展的今天,电影也从一条条胶卷变成了更加抽象的信息数据。在互联网飞速发展的今天,如何将这些电影数据汇总起来进行分析以便于人们更好的选择电影,网络爬虫可以实现。
网络爬虫,是指按照一定规则,自动机进行抓取网络信息操作的程序和脚本。世界上第一个网络爬虫程序是由麻省理工学院学生马休·格雷于1993年编写的“互联网漫游者”[1]。随着21世纪的到来,信息的重要性愈发重要,我们称21 世纪是信息时代,面对着互联网这个信息的宝库,合理地利用其包含的信息是必要的。互联网发展的全面提速,同时也促进了网络爬虫的发展。现如今有多种主流的爬虫框架,例如Scrapy、PySpider、Apache Nutch、WebMagic 等等[2]。网络爬虫根据其作用范围可分为3类:通用爬虫、聚焦爬虫和增量式爬虫。通用爬虫是对指定的页面进行全部数据的爬取。聚焦爬虫在通用爬虫的基础上可以只爬取一张页面中的部分数据,所得数据更加精简。增量式爬虫属于高阶爬虫,面对一些实时更新数据的页面可以对其进行同步的爬取[3]。这三种爬虫在不同的环境下发挥着不同的作用。
在互联网迅速发展的今天,网络爬虫所能够实现的已不仅仅是像个搬运工一样机械地根据指令需求去爬取数据。更像是识别图片验证码或是模拟鼠标移动来进行点击操作。过去在爬虫时使用者是使用爬虫去模拟浏览器,模拟一个网上存在的用户去上网,而今天的爬虫,所模拟的是人类,模拟一个真人去上网。可能你在某条微博热搜下面看到的某条评论就是爬虫程序发表的[4]。从其中可以看出爬虫技术发展的速度之快,但是其发展也为我们带来了新的思考,比如爬虫的合法性如何界定?爬虫功能的日益强大会带来的威胁更大还是利益更大?网络爬虫是针对数据信息的一门技术,由此决定了其特殊性。在爬取数据过程中不可避免会触及到一些敏感数据或隐私,所以爬虫与反爬虫的斗争一直存在。此外还有一些“君子协议”的存在,规定一些不可爬取的敏感或隐私数据,由此对爬虫使用者的行为进行一定程度的约束。所以网络爬虫技术一定程度上属于灰色技术,其能带来什么样的结果全取决于使用者[5]。
1 Scrapy框架简介
Scrapy 框架,是Python 开发的一个用于网络数据爬取的框架。所谓框架,就是一个集成了很多功能并且有很强通用性的一个项目模板。Scrapy是Python封装好提供的一个明星框架。相较于其他爬虫框架,Scrapy 框架具有三个高性能:高性能持久化存储操作,使数据的本地化存储更方便;高性能异步的数据下载操作,提高数据爬取的效率和灵活性;高性能数据解析操作,使数据的解析分离轻松[6]。
Scrapy框架包括Spider类、引擎、下载器、调度器、项目管道和中间件6 大组件组成。6 大组件的相互配合实现了框架的数据爬取及其后续一系列操作。
引擎是整个框架的核心和数据流通的枢纽。此组件与其他各个组件都有着直接的交互联系。引擎组件保证了所爬取数据在流通过程中的完整性和正确性,避免了数据流动过程中可能出现的数据丢失或出错。
下载器是具体执行数据爬取工作的组件。使用者所递交的所有请求最终都由下载器来完成。
调度器是暂时存储使用者请求的组件。通过暂时存储请求来缓解引擎的压力,避免引擎因为同时处理多个请求而进行超负荷工作。
项目是对所爬取数据进行一个映射,将爬取数据以类似于实体-属性的方式进行定义。由此可以更直观的验证数据和去重数据,也能方便于后续的存储操作。管道是将所爬取数据进行本地存储的组件。通过组件来存储数据并进行后续的分析操作。
中间件有下载器中间件、爬虫中间件和调度器中间件。下载中间件介于引擎和下载器之间,可以对下载器抓取数据的过程进行一定的自定义;爬虫中间件介于Spider爬虫类和引擎之间,可以对爬虫类的Request请求进行自定义和Response的过滤;调度中间件介于调度器和引擎之间,处理由引擎向调度器发送的请求和响应。
2 Scrapy框架的工作原理
在用Scrapy 框架创立项目之后框架会提供5 个Python 文件、一个Spider 文件夹和一个Scrapy 配置文件。5个Python文件包括用于标识模块包的init文件、item 项目文件、middlewears 中间件文件、pipelines管道文件和settings 设置文件。Spider 文件夹用于存储Spider 类文件。首先在Spider 文件夹下通过终端指令创建一个Spider的Python文件。文件会自动提供一个列表用于存放使用者所指定的URL 和一个parse 解析方法,使用者需要在列表中指定请求,即所需要爬取的URL。然后有引擎接收这些URL 并发送给调度器由调度器存储起来。之后引擎以一定规则在调度器中调出请求发送给下载器由下载器根据请求在互联网中爬取数据。下载器爬取下来的数据通常都是整张页面的全部源码数据,这些数据过于粗糙,通常包含许多使用者并不需要的数据。因此下载器会将这些源码数据打包交给引擎再由引擎交还给Spider 类。再根据Spider 中的使用者编写的parse 函数里的操作进行数据解析,过滤后使数据变得更精简。过滤后的数据以item 项目的形式提交给管道。最后由项目管道进行存储操作。由此一系列过程就完成了数据的爬取操作和存储操作。之后就可以根据自身需求来对数据进行分析等操作[7]。通过下图可以直观的感受Scrapy框架的工作流程。
3 实验及结果分析
Scrapy 框架的高性能可以使网络数据的获取变得更为方便,所以掌握使用Scrapy 框架是很有必要的。本文将爬取1905 电影网的电影数据并对数据进行可视化来分析电影数据带来的信息。
3.1 电影数据获取
选取对1905 电影网的电影数据来爬取是因为对其数据进行爬取时在破解反爬虫机制上的工作量相对较小甚至部分数据没有相关的反爬虫机制来保护。数据的爬取工作会相对简单。网址为:https://vip.1905.com/list/p1o2.shtml。
3.1.1 Scrapy 框架安装。本实验是基于Windows10 操作系统环境下进行,使用Python语言,利用Pycharm 编写程序。
首先需要安装Scrapy 框架。在Windows 环境下,安装Scrapy 框架需要先安装Wheel。在Pycharm 终端中输入指令:pip install wheel。然后下载twisted。这是因为Scrapy 框架提供的高性能的异步数据下载的操作是借助了twisted 实现的。安装wheel也是为了下载和安装twisted 可以顺利进行。这里提供一个twisted 的下载网址:https://www.lfd.uci.edu/~gohlke/pythonlibs/。在里面找到twisted 然后根据Python 的版本和计算机的操作系统位数进行下载。下载完成后在终端中通过指令:pip install(后面接twisted 的版本名)。之后通过终端指令:pip install。
pywin32 安装pywin32。最后安装Scrapy 框架:pip install scrapy。安装成功之后在终端中输入指令:scrapy。如果没有报错则安装成功[8]。
3.1.2 电影数据的爬取及存储。安装好Scrapy 框架后就可以进行电影数据的爬取了。首先创建一个Scrapy 项目。在Pycharm 终端中输入指令:scrapy startproject doubanPro。然后创建一个爬虫文件(即Spider类):scrapy genspider 1905m www.xxx.com。在创建爬虫文件时可以先不指定URL,创建好之后在爬虫文件中指定相关电影数据的URL。本次对1905 电影网的电影数据进行爬取。分别对动作、喜剧、文艺、战争、动画、科幻6个类型的内地电影和欧美电影进行爬取。每种类型爬取3 到4张页面的数据。因为过多页数的爬取可能会导致在请求量过大而爬取失败。爬取相关电影的名称、上映时间、评分、类型、地域5个属性。使用浏览器所携带的抓包工具查看相关属性所对应的XPath 路径。通过对页面HTML 源码的分析得知,在每张页面中,每部电影都放在一个class 为“list clearfix_smile”的无序列表的li 标签中。通过XPath 定位最终可以得出每部电影的XPath 路径:/html/body/div[1]/div/div[2]/div/ul/li。
拿到每部电影的XPath路径后开始对每部电影下的各项属性进行爬取。地域和类型属性可以通过在网页中选取相应标签进入到相应页面,因此在爬虫程序中直接进行赋值。例如爬取内地的动作电影,先通过网页里的标签进入到对应页面,然后再爬虫文件中指定URL,并直接给地域和类型赋值为“内地”和“动作”。通过XPath 定位拿到名称、上映时间和评分的XPath 路径分别为:'./h3/a/span[@class="name"]//text()','./span[@class="fr score"]//text()',/h3/ a/ span[@class="hidden year"]//text()。拿到这些XPath 路径后将这些数据一一对应到item 中,提交至管道。之后在管道中将数据存储到本地数据库中。数据库使用MySQL数据库。
MySQL 数据库是一个开源的关系型数据库管理系统,其具有安全、跨平台、高效的优点并且与Python紧密结合。MySQL数据库由瑞典公司MySQL AB公司开发、发布并支持。MySQL数据库目前被广泛应用于中小型网站的开发中。MySQL 数据库也是目前运行速度最快的SQL语言数据库之一[9]。其功能的全面、强大以及免费也是本次实验选择MySQL数据库的原因。
下面文本框的代码是在管道中将数据存储到数据库中的操作。之后在setting.py 文件中打开管道。然后通过指令:scrapy crawl 1905m来运行爬虫。
表1 电影表
3.2 电影数据的可视化及数据分析
存储的电影数据可以将数据进行可视化操作,使用Python 提供的PYGAL 可以实现。生成的图表可以存储在本地。通过绘制各种图表来分析电影的趋势。
下图两张图是分别以上映年份和电影类型为基准所生成的折线图。分别以上映年份和电影类型为标准,求得所对应的电影评分的平均值,绘制图表。
在将数据进行可视化之后,我们可以得到上面图3、图4两张折线图。通过对两张折线图的观察来进行数据分析得出结论。
通过对图3进行观察分析发现在动作、战争、动画三种类型中,我国内地的电影平均评分是高于欧美等海外地区。这说明这三类电影的质量方面我国是具有一定优势的。我们中华民族刻在骨子里的武侠情怀也是一众动作电影的创作源泉,中国武术的深厚底蕴也是孕育了无数经典动作电影的温床。通过图表可知我国战争题材的电影的平均评分是高于欧美等海外地区很多。在动画类电影方面我国也是高于欧美地区。虽然进入21 世纪以来我国动画电影出现颓势,但通过图表可分析出近些年来我国动画方面已逐渐开始崛起,逐渐赶超欧美地区。喜剧类电影欧美地区高于内地许多。科幻类电影欧美地区是高于国内,但二者之间差距已不大,也说明了近些年来我国科幻类电影的进步。
为了确保更好地进行分析,选取了自2010年起至2021 年约11 年左右的电影。通过对图4 进行观察分析发现,首先海内外电影的总体质量都呈下降趋势。近些年来,每年似乎都会诞生出几部大家口碑一致的烂片,即使是口碑不错的电影在观看之后也不会回味无穷。这也反映出电影行业的一些问题。电影制作周期的缩短,编剧水平的落后,演员演技的不达标,流量当道的风气都导致了电影质量水平的下降。一部好的电影应该是历久弥新的,经得起时间的沉淀。而今天,这种电影正在绝迹。但令人欣慰的是我国国内的电影整体下降趋势较好于欧美地区。而2020 年的新冠肺炎疫情使无论海内外的电影行业都收到了冲击,导致了电影的平均评分降至了最低点。而2018年的差距较大是因为数据的不对称导致。在爬取到的2018 年上映的电影中欧美地区只有1 部《UFO》,获得6.7的评分。因此不足以说明问题。
4 不足与优化
虽然成功爬取到电影数据并进行了分析,但还有可以优化之处。例如没有进行反爬虫机制的破解。选择1905 电影网来进行电影数据的爬取一定程度上也是因为没有反爬虫机制。如今的许多门户网站都设置了反爬虫机制,如果不针对这些反爬虫机制进行破解的话,很多情况下都是无法拿到足够数量、满意的数据。一些门户网站会利用像是UA 识别、IP 地址识别、设置伪属性和并发等机制来识别爬虫的请求[10]。针对这些机制一些简单的方法像是设置下载间隔、随机UA 和IP 池等方式可以进行破解。但随着互联网的发展如今的反爬虫机制越来越复杂,相应的破解方法也应运而生。在后续的学习研究中将会对此方面深入研究学习。
5 结束语
此次爬虫成功实现了电影数据获取、数据解析、数据存储和数据可视化的功能。并对数据进行了简单的分析。利用Scrapy 框架对电影数据进行爬取数据,再通过对爬取到的数据进行分析得出近些年来海内外电影的整体走向,使我们在观影使有了更好的数据依据。
此外,既然可以对电影数据进行爬取,相应的,类似于文章、音乐、图片等信息数据也是可以进行爬取。随着网络的蓬勃发展,爬虫技术也必然会去适应网络的发展并催生出更多的以爬虫为基础的新兴技术,所以爬虫技术未来也会有更大的发挥空间与更广阔的前景。