【福州网页设计】豆瓣影评网页数据的抓取怎么实现

  • 【福州网页设计】豆瓣影评网页数据的抓取怎么实现已关闭评论
  • A+
所属分类:娱乐

【福州网页设计】豆瓣影评网页数据的抓取怎么实现 【福州网页设计】豆瓣影评网页数据的抓取怎么实现 【福州网页设计】豆瓣影评网页数据的抓取怎么实现

随着网络的迅速发展, 更多的人愿意在网上发表对某些事物的情感、态度和看法, 这些内容中蕴藏着大量有价值的信息, 如果能够抓取到这些数据并对其进行分析, 可以有效改进产品服务、预测股票走势、挑选优良产品、挑选一部好看电影等。

1 网络爬虫概述

网络爬虫, 又称作网页蜘蛛 (web spider) , 是一个功能强大的能够自动提取网页信息的程序, 它模仿浏览器访问网络资源, 获取用户需要的信息, 可以协助搜索引擎从万维网上下载网页信息, 因此, 也是搜索引擎的重要组成部分。

传统爬虫从一个或若干初始网页的URL开始, 获得初始网页上的URL, 在抓取网页的过程中, 不断从当前页面中抽取新的URL放入队列, 直到满足系统的一定停止条件。聚焦爬虫的工作流程较为复杂, 需要根据一定的网页分析算法过滤与主题无关的链接, 保留有用的链接并将其放入等待抓取的URL队列中。然后, 根据一定的搜索策略从队列中选择下一步要抓取的网页URL, 并重复上述过程, 直至达到系统的某一条件时停止。另外, 所有爬虫抓取的网页将会被系统存贮, 进行一定的分析、过滤, 并建立索引, 以便之后的查询与检索。对于聚焦爬虫来说, 这一过程的分析结果还可能对后续的抓取过程提供反馈和指导。

2 数据的抓取

2.1 寻找爬虫入口

豆瓣上有大量的电影影评, 对比可以发现所有短评页面都遵循http://211.85.197.33:80/rwt/02/https/NWYYM4LFF3TG87LCMFYC6Z5QNF/subject[唯一标识数字]/comments?status=P的规则。也就是说, 抓取到电影的唯一标识数字就可以抓取到该电影的短评网址。

唯一标识数字的抓取可以通过谷歌浏览器:更多工具->开发者工具->Network查看豆瓣影评搜索功能的工作状态, 发现可抓取数据的网页http://211.85.197.33:80/rwt/02/https/NWYYM4LFF3TG87LCMFYC6Z5QNF/ j/search_subjects?type=movie&tag=最新&s o r t=r e c o m m e n d&p a g e_limit=20&page_start=0。

其中, tag为查询电影的类型, 共有[“热门”“最新”“经典”“可播放”“豆瓣高分”“冷门佳片”“华语”“欧美”“韩国”“日本”“动作”“喜剧”“爱情”“科幻”“悬疑”“恐怖”“动画”]类型;sort为排序方式;page_limit为每页显示的电影个数;page_start为查询电影起始位置。

通过分析可发现, 每次点击加载更多电影时, 该网页会给主页面传递更多的电影信息, 提供json格式的文本, 可以通过Python的json库将其解析成字典便于后续处理。

抓取信息时, 只需要更改tag及page_start (20的倍数) 就可以抓取到大量的影评数据。可以发现, 所需要的电影唯一标识数字在cover属性中, 切割获取到的唯一标识数字, 将大量标识数字保存到标识数字集合 (set) 中为后续操作做准备。那么, 每部电影的起始页就是http://211.85.197.33:80/rwt/02/https/NWYYM4LFF3TG87LCMFYC6Z5QNF/subject/唯一标识数字/comments?status=P在标识数字集合中抓取的唯一标识数字。

2.2 翻页处理

通常情况下, 短评不只有一页, 因此, 需要进行翻页操作。

(1) 在当前页面抓取下一页的网址, 但这种方法增加了解析的过程, 而且非登录状态下只能查看前10页, 每页20条短评共200条短评, 需要加入条件来终止数据抓取, 无法确认当前页面是多少, 所以无法达到想象状态。

(2) 找寻页面的共同点, http://211.85.197.33:80/rwt/02/https/NWYYM4LFF3TG87LCMFYC6Z5QNF/subject/唯一标识数字/comments?start=0&limit=20&sort=new_score&status=P&percent_type=。通过该地址发现, 每个电影的网址都遵循这样的规律, 唯一标识数字代表某部电影;start代表影评起始数 (20的倍数) , 这样只需更改这两个条件就可以抓取到每部电影的前200条短评了。 (注:豆瓣对同一用户的请求频率有限制, 如果同一用户请求过快, 就会要求进行身份验证, 所以登录状态下是不行的, 因为需要大量账号切换使用, 但大量账号又不太现实。所以, 本文的爬虫是在非登陆状态下进行的。)

2.3 设置headers

headers是HTTP请求和响应的核心, 承载了客户端浏览器、请求页面、服务器等相关信息。通过谷歌浏览器:更多工具->开发者工具->Network->headers可以轻松抓取到headers信息, 为减少IP被封的频率, 要不停更换Cookie和UserAgent, 其他信息保持原样即可。

User-Agent是一个特殊字符串头, 使服务器可以识别操作系统、浏览器的信息。研究时可在百度上下载大量User-Agent信息, 每次随机抽取其中一个即可。

Cookie保存用户的身份信息, 由于是在非登陆状态下, Cookie主要是bid信息, 因此, 可以直接使用随机字符串生成该信息。 (注:豆瓣设有时间访问上限, 也就是说一段时间内同一IP段的访问次数有限。)

2.4 使用requests实现循环抓取网页源码

确认已经安装requests模块, import request测试是否会报错, 如果没有报错则代表已经安装成功, 否则使用pip install requests进行安装。requests模块使用Python语言编写基于urllib的http库, 操作比urllib更加方便简单, 仅需要几个简单的操作就可以实现网页源码的获取。

使用requests.get () 方法对豆瓣的短评页面进行网页源码的抓取。首先, 从标识数字集合中抽取一部电影, 然后逐一抓取该电影的前10个网页。循环传入每页网站及随机生成的headers头文件, 并使用变量接受返回值。其次, 使用r.status_code查看请求返回状态码, 常见的请求返回状态码有3种:200 (成功) 、404 (服务器找不到请求的网页) 、403 (禁止) 服务器拒绝请求。其中, 404为默认抓取前10页数据, 但该电影的影评可能不足10页, 所以可以终止对该电影影评的继续抓取, 在标识数字集合中抓取下一部电影继续运行;403为某段时间内同一IP段的请求次数过多, 可以使用IP代理进行抓取, 也可以让爬虫等待一段时间后再进行网页源码抓取。最后, 使用r.text获取网页源码, 鉴于网页源码比较乱, 通常需要从中提取所需内容。

2.5 使用Py Query解析数据

与requests相同, 首先确认已经安装Py Query模块。Py Query库是一个非常强大、灵活的网页解析库, Py Query是Python仿照j Query的严格实现。语法与j Query几乎完全相同。

由于获取到的网页源码是没有价值的, 所以需要解析每个网页源码, 即获取一个网页源码就要对其解析出数据然后保存。

可以发现, 每段短评都在comment-item->comment类下的p标签中, 可以使用Py Query.find () 方法寻找所有comment-item类, 然后对得到的文本再次使用find. () 查找comment类, 最后查找到p标签下的文本, 这样即可找到所需短评。但这种方式只能解析一个短评, 如果解析当前页面的所有短评就需要使用循环解析。

2.6 保存文件

爬虫获取的数据可以存储为csv格式。csv是一种通用的、相对简单的文件格式, 被用户、商业和科学界广泛应用。csv主要用于程序之间转移表格数据, 有些程序本身是不兼容的格式, 但许多程序都支持csv格式。当使用csv文件时, 若csv文件的路径构造不存在, Python会创建一个新的路径来存放csv文件;若csv路径存在, Python则会重写该csv文件。此外, 也可以保存到json文件、Excel表格, 以及本地数据库中。

3 结语

本文根据网站的特点, 设计了一种基于Python中requests模块及Py Query模块进行影评采集的爬虫程序, 可采集豆瓣网中大量影评信息。通过上述方法, 实现了豆瓣网大量影评信息的抓取。在具体实践过程中, 可将爬虫部署到云主机, 不间断地抓取数据, 随时使用随时到主机中提取。网络的发展, 使爬虫获取数据已经成为一种常用手段。通过该方法不仅可以抓取影评信息, 只要稍加修改就可以抓取其他数据。