您好, 访客   登录/注册

基于Python的豆瓣网站数据爬取与分析

来源:用户上传      作者:简悦 汪心瀛 杨明昕

  摘要:大数据时代,随着社交网络的发展,社会媒体数据量呈现指数级增长。通过基于Python的网络爬虫程序爬取豆瓣网站的有关数据,使用非关系型数据库MongoDB存储数据,并利用Matplotlib和PyEcharts对爬取结果进行了可视化分析。对豆瓣电影和图书Top250排行榜的数据进行可视化分析,可以了解作品排名、评分、年份、地区和导演及作家的分布情况,从而分析得出数据之间的相关性和文化产业的发展趋势。
  关键词:Python;网络爬虫;数据采集;数据分析;可视化
  中图分类号:G642        文獻标识码:A
  文章编号:1009-3044(2020)32-0051-03
  Abstract:In the era of big data, with the development of social networks, the amount of social media data shows exponential growth. Through the web crawler based on Python to crawl the relevant data of Douban website, uses MongoDB database to store the data, and uses Matplotlib and PyEcharts to visually analyze the crawling results. Through visual analysis of the Top 250 ranking data of Douban films and books, ranking, rating, year, region and distribution of directors and writers can be understood, so as to analyze the correlation between the data and the development trend of cultural industry.
  Key words:Python; web crawler; data collection; data analysis; visualization
  1引言
  随着互联网的快速发展,越来越多的人喜欢在微博、知乎、豆瓣等社交网站上发表自己对某些事物的想法、态度或意见[1]。用户同时也会将自己购买的产品或体验到的服务,在这些社区式的网站上评价,这样通常会带动他人也前去购买或体验,形成口碑效应。
  社交应用及网站上有源源不断的信息发布,这些信息中隐含着大量对我们及企业有收集价值的资源。就像用户评分和评价系统中,用户不但会对作品进行评比,还分享和传播了作品信息。如果能够获取这些数据并对其进行分析,可以让人们挑选到满意的书籍、选择出一部精彩的电影,也可以帮助企业改进产品的服务等。使用爬虫程序可以高效地对社交网站上的信息进行收集、组织和管理[2]。豆瓣网作为社交网站的代表,提供了在图书、电影和音乐等方面独树一帜的评分、推荐及比价体系,在社交网络中产生了深远的影响[3]。
  2数据爬取
  2.1 发起请求
  数据爬取主要由爬虫程序来完成,系统根据目标地址定位元素,爬取相关数据并将其存储在数据库中。通过网络爬虫进行数据爬取,首先要安装Requests库,用于向指定的URL发起请求,获取所要爬取的页面的响应信息。爬取网页最常使用的是通用爬取框架,它最大的作用就是让用户有效、稳定、可靠地爬取网页上的内容。
  2.2 地址获取
  系统想要获取豆瓣Top250所有作品的信息,就要获取全部作品的链接,进入每个作品的详情页面进行爬取。但全部作品被分成了10页,每页的地址都不相同,无法用同一个网址获取。这时则需要通过翻页来搜寻网址的规律。通过对比,发现除了第1页,每一页网址中都有一个“?”,后面还跟着参数,这其实是URL在传递某种数据,不难发现,每页网址只是最后的“start=”后面的数值发生了变化,即从0开始,每页增加25,这时使用for循环语句来请求每页网址,返回获取到的地址。
  2.3 网页解析
  获取到豆瓣电影Top250每页的地址之后,再解析网页来获取每个页面全部电影的链接。Python中的解析库,比如BeautifulSoup库,可以用来对Response获取的网页内容,按照特定的解析器进行结构化的解析。BeautifulSoup库为可用于从HTML中提取数据的高级页面创建一个解析树,而使得每一个节点都成为它的对象[4]。通常情况下,将其对象看作成标签对象,通过soup.标签名的方法,获得这个标签的内容,而如果要查找这个标签,则使用soup.select()方法,其中关键点在于对标签的精确定位,在()内的语句来实现。
  2.4 元素定位
  获取到每个电影的链接,然后就能访问每个电影的页面来获取详情了。使用正则表达式和Xpath可以对所需要的电影信息进行定位,从Response中获取需要的数据。正则表达式是一组字符串的排列组合,主要使用在寻找配合的字符串中,由于其灵活性和逻辑性很强,可以速度地完成对多而杂的字符串的操纵。而Xpath则更加方便,XPath就是XML文档中的语言,基于XML文件的树型设计,运用相应的公式以各种标准搜寻节点的手段达到目的,节点是顺着进程的路径来选择的,所以它从树型结构内寻找目标节点的能力非常突出,能够在HTML、XML结构中快速查找想要的信息,因而成为了爬虫程序在页面中确定元素位置的首选[5]。
  2.5反爬突破
  豆瓣网站的服务器对于同一账号的频繁请求有限制,只能切换不同的用户,所以爬虫最好选择非登录状态的模式。而且,由于豆瓣的反爬机制比较完善,更设置了频率访问最大的限度,这意味着豆瓣对同一IP地址的重复请求有制约,如果一段时间内请求过于频繁,这个IP就会被封掉。   为了解决这一问题,本文采取了随机设定访问时间间隔和随机提交用户代理(User-Agent)头文件的办法。使用time.sleep()方法设置下载时间间隔,.random()方法每次获取一个随机数,能够随机延时,降低了IP被封的概率。头文件在用户发起请求时,通过提交相关信息能够模拟用户使用的浏览器。服务器通过头文件里的用户代理,来识别设备的系统和浏览应用程序的信息。用户代理可以在网上搜索下载,每次随机使用一个就能不断地改变用户信息了。
  2.6数据存储
  本文之所以选择MongoDB进行数据存储,是因为MongoDB是非关系型(NoSQL)的数据库[6]。现在,每天互联网上都会产生相当多的数据,例如微博和Twitter天天都在为他们的使用者搜集相当巨大的数据量,用户的个人资料、社交圈子、位置信息等等生成的數据和使用的记录已经成倍地增加[7]。这类信息不需要不变的形式来存储,无须其余操作就能够横向扩充。如果我们要对这些用户的信息进行收集,那传统的关系型数据库已经不适用了,而NoSQL数据库却能很好地管理这些庞杂的数据。
  NoSQL中键值对(key&value)的存储方式提供的数据类型非常广泛,能够保存多而杂的数据。因此,该数据存储方法更适用于庞杂的爬虫环境。所以本文在爬取数据时,将数据保存为一个由键值对构造形式组成的文件。再根据数据的类别使用.insert()方法将其存入不同的表中。链接单独存储在链接表当中,电影和图书的排名、名称、评分、评价人数、年份和导演及作者都属于详细信息,则插入到信息表当中。
  3数据分析
  3.1 可视化方法
  当所需的数据全部获取完毕之后,接下来需要做的就是根据需要来将数据进行整理并分析,这样就能把数据中所蕴含的信息通过图表的方式展现出来了。数据可视化分析可以使用Matplotlib或者PyEcharts。Matplotlib是一个Python的绘图库,它以各种硬拷贝格式和跨平台的交互式环境生成出版质量级别的图形。PyEcharts是一个用于生成Echarts图表的类库,它可以兼容当前大多数的浏览应用程序,能够顺畅地在个人电脑甚至移动设备端,直接将数据展示在网页上方便了用户查看,极大地增强了用户体验[8]。
  本文分别采用了这两种图库来生成不同的图表,相关性分析使用的Matplotlib中的3D和2D的散点图、地区及创作者分析则是通过PyEcharts的饼图和词云来呈现的。
  3.2 相关性分析
  相关性分析的含义是指分析两个或多个满足相关性条件的变量,以达到衡量两个变量要素的密切指数的目的。相关性的变量之间需要存在一定的关系或者概率才可以进行相关性分析。Pearson相关系数(Pearson CorrelationCoefficient)是用来衡量两个数据集合是否在一条线上面,它用来衡量定距变量间的线性关系[9]。通常情况下通过以下取值范围判断变量的相关强度:0.8-1.0为极强相关,0.6-0.8为强相关,0.4-0.6为中等程度相关,0.2-0.4为弱相关。
  图1   为豆瓣Top250电影排行榜的电影排名、评分和评价人数的散点图。散点图在回归分析中通常用来观察数据点在平面直角坐标系上的分布,它可以反映出变量变化的大致趋势。图中X轴表示电影的排名,Y轴表示电影的评分,Z轴表示该电影的评价人数。可以看到随着排名的提升,评分和评价人数的指数也不断升高。通过.corr()方法计算出排名和评分的相关系数为-0.71,排名和评价人数的相关系数为-0.68,说明排名和评分及评价人数都具有强相关性。而评分和评价人数的相关系数为0.33,说明评分和评价人数为弱相关。
  图2为豆瓣Top250电影排行榜的电影排名和上映年份的散点图。图中X轴表示电影的上映年份,Y轴表示电影的排名。发现数据点分布较为平均,且上映年份多数其中在1980年之后。计算得出年份和排名的相关系数为0.03,说明电影上映的年份与豆瓣电影Top250的排名没有相关性。
  3.3 地区分析
  电影和图书相当于一个国家的文化产业,将电影和图书的上榜数量相加,可以看出各个国家地区文化产业的强弱。饼图中美国和中国所占面积最大,说明两国文化产业比较发达,其余占比较多的地区通常为欧洲及日本等发达国家,根据这些国家的综合国力来看,验证了经济是文化的基础。以好莱坞为代表的美国大片,不仅推动了当地的文化产业发展,还向全世界输出了美国的文化。中国大陆地区上榜的作品数量位居第二,也从侧面反映出了中国文化的历史底蕴。地区饼图如图3所示。
  3.4 创作者分析
  词云是由词条组成的类似云型的彩色图案,能形象地展示出排行榜里导演和作家作品的多少,对于出现频率较高的导演和作家起到视觉上突出的作用。上榜作品数量越多的导演和作家,名字的字号就越大,使用户一眼扫过就能领略当中蕴含的信息。词云中上榜数量最多的创作者是日本作家村上春树,牢牢地占据着中间的位置,其次还有日本著名的动画大师宫崎骏和《哈利波特》系列的作者J·K·罗琳。电影导演虽然也有上榜,但从人数和作品数量来说都远远不及文学作家多。创作者词云如图4所示。
  5结束语
  大数据时代,人人都是信息的创造者,与此同时也是信息的享用者,越来越多的企业开始去尝试挖掘有价值的数据[10]。该系统根据用户的需求处理网页信息及相关的数据,可以更快、更深入地检索数据,使用户可以更有效率地搜索需要的信息。从而能为媒体、社交网站、出版社提供市场舆论导向服务,为电影公司、娱乐公司、投资机构提供口碑及公关等服务,具有一定的应用价值。
  参考文献:
  [1] 李嘉兴,王晰巍,常颖,等.社交网络用户行为国内外研究动态及发展趋势[J].现代情报,2020,40(4):167-177.
  [2] 于娟, 刘强. 主题网络爬虫研究综述[J]. 计算机工程与科学, 2015,37(2).
  [3] 蔡翘励,梁莹,陈思炜,等.面向豆瓣网站的信息采集与可视化[J].电脑知识与技术,2018,14(13):3-4+7.
  [4] Ryan Mitchell. Python网络数据采集[M]. 人民邮电出版社, 2016.
  [5] 杨晶,周双娥.一种基于XML的非结构化数据转换方法[J]. 计算机科学,2017,44(S2):414-417.
  [6] 刘一梦. 基于 MongoDB的云数据管理技术的研究与应用[D].北京交通大学,2012.
  [7] Yuhao, Fan. Design and Implementation of Distributed Crawler System Based on Scrapy[J]. Iop Conference, 2018.
  [8] Lijuan J , Juan L , Jian W , et al. Prospect on Construction and Application of Global Maize Trade Data Visualization System Based on PyEcharts[J]. agricultural outlook, 2019.
  [9] 郝德华,关维国,邹林杰,焦萌.基于Pearson相关系数的快速虚拟网格匹配定位算法[J].计算机应用,2018,38(3):763-768.
  [10] Liu M , Du Y , Xu X . Customer Value Analysis Based on Python Crawler[C]// 2019 Chinese Control And Decision Conference (CCDC). 2019.
  【通联编辑:王力】
转载注明来源:https://www.xzbu.com/8/view-15377886.htm