Python登录豆瓣并爬取影评

智能语音交互视频服务MySQL

picture.image

Cookie是为了交互式web而诞生的,它主要用于以下三个方面:

  1. 会话状态管理(如用户登录状态、购物车、游戏分数或其它需要记录的信息)

  2. 个性化设置(如用户自定义设置、主题等)

  3. 浏览器行为跟踪(如跟踪分析用户行为等)

我们今天就用requests库来登录豆瓣然后爬取影评为例子,

用代码讲解下Cookie的 会话状态管理(登录)功能

此教程仅用于学习,不得商业获利!如有侵害任何公司利益请及时联系!

一、需求背景

之前爬取了优酷的弹幕并生成词云图片,发现优酷弹幕的质量并不高,有很多介词和一些无效词,比如: 哈哈、啊啊、这些、那些。 。 。 而豆瓣口碑一直不错,有些书或者电影的推荐都很不错,所以我们今天来爬取下豆瓣的影评,然后生成词云,看看效果如何吧!

二、功能描述

我们使用requests库登录豆瓣,然后爬取影评,最后生成词云!

为什么我们之前的案例(京东、优酷等)中不需要登录,而今天爬取豆瓣需要登录呢? 那是因为豆瓣在没有登录状态情况下只允许你查看前200条影评,之后就需要登录才能查看,这也算是一种反爬手段!

picture.image

三、技术方案

我们看下简单的技术方案,大致可以分为三部分:

  1. 分析豆瓣的登录接口并用requests库实现登录并保存cookie

  2. 分析豆瓣影评接口实现批量抓取数据

  3. 使用词云做影评数据分析

方案确定之后我们就开始实际操作吧!

四、登录豆瓣

做爬虫前我们都是先从浏览器开始,使用调试窗口查看url。

1.分析豆瓣登录接口

打开登录页面,然后调出调试窗口,输入用户名和密码,点击登录。

picture.image

这里建议输入错误的密码,这样就不会因为页面跳转而捕捉不到请求! 上面我们便获取到登录请求的URL:

https://accounts.douban.com/j/mobile/login/basic

因为是一个POST请求,所以我们还需要看看请求登录时携带的参数,我们将调试窗口往下拉查看 Form Data

picture.image

2.代码实现登录豆瓣

得到登录请求URL和参数后,我们就可以来用requests库来写一个登录功能!

picture.image

3.保存会话状态

我们如何让代码自动保存Cookie呢?

也许你见过或者使用过 urllib 库,它用来保存Cookie的方式如下:

cookie = http.cookiejar.CookieJar()

handler = urllib.request.HttpCookieProcessor(cookie)

opener = urllib.request.build_opener(handler)

opener(url)

但是前面我们介绍requests库的时候就说过:

requests库是一个基于urllib/3的第三方网络库,它的特点是功能强大,API优雅。 由上图我们可以看到,对于http客户端python官方文档也推荐我们使用requests库,实际工作中requests库也是使用的比较多的库。

所以今天我们来看看requests库是如何优雅的帮我们自动保存Cookie的? 我们来对代码做一点微调,使之能自动保存Cookie维持会话状态!

picture.image

上述代码中,我们做了两处改动:

  1. 在最上面增加一行 s = requests.Session() ,生成Session对象用来保存Cookie

  2. 发起请求不再是原来的requests对象,而是变成了Session对象

我们可以看到发起请求的对象变成了session对象,它和原来的requests对象发起请求方式一样,只不过它每次请求会自动带上Cookie,所以后面我们都用Session对象来发起请求!

4.这个Session对象是我们常说的session吗?

讲到这里也许有同学会问: requests.Session对象 是不是我们常说的 session 呢?

答案当然不是 ,我们常说的session是保存在服务端的,而requests.Session对象只是一个用于保存Cookie的对象而已,我们可以看看它的源码介绍

picture.image

所以大家千万不要将requests.Session对象与session技术搞混了!

五、爬取影评

我们实现了登录和保存会话状态之后,就可以开始干正事啦!

1.分析豆瓣影评接口

首先在豆瓣中找到自己想要分析的电影,这里选择一部美国电影 《荒野生存》

picture.image

然后下拉找到影评,调出调试窗口,找到加载影评的URL

picture.image

2.爬取一条影评数据

picture.image

但是爬取下来的是一个HTML网页数据,我们需要将影评数据提取出来

picture.image

3.影评内容提取

上图中我们可以看到爬取返回的是html,而影评数据便是嵌套在html标签中,如何提取影评内容呢?

这里我们使用正则表达式来匹配想要的标签内容,当然也有更高级的提取方法,比如使用某些库(比如bs4、xpath等)去解析html提取内容,而且使用库效率也比较高,但这是我们后面的内容,我们今天就用正则来匹配!

我们先来分析下返回html 的网页结构

picture.image

我们发现影评内容都是在 <span class="short"></span> 这个标签里,那我们 就可以写正则来匹配这个标签里的内容啦!

picture.image

检查下提取的内容

picture.image

4.批量爬取

我们爬取、提取、保存完一条数据之后,我们来批量爬取一下。 根据前面几次爬取的经验,我们知道批量爬取的关键在于找到分页参数,我们可以很快发现URL中有一个 start 参数便是控制分页的参数。

picture.image

这里只爬取了25页就爬完,我们可以去浏览器中验证一下,是不是真的只有25页,验证后确实只有25页!

六、分析影评

数据抓取下来之后,我们就来使用词云分析一下这部电影吧!

基于使用词云分析的案例前面已经讲过两个了,所以猪哥只会简单的讲解一下!

1.使用结巴分词

因为我们下载的影评是一段一段的文字,而我们做的词云是统计单词出现的次数,所以需要先分词!

picture.image

2.使用词云分析

picture.image

最终成果:

picture.image

从这些词中我们可以知道这是关于一部关于 追寻自我现实生活 的电影。

七、总结

今天我们以爬取豆瓣为例子,学到了不少的东西,来总结一下:

  1. 学习如何使用requests库发起POST请求

  2. 学习了如何使用requests库登录网站

  3. 学习了如何使用requests库的Session对象保持会话状态

  4. 学习了如何使用正则表达式提取网页标签中的内容

picture.image

▼ 点击成为 社区注册会员 「在看」 一下,一起PY!

0
0
0
0
关于作者
关于作者

文章

0

获赞

0

收藏

0

相关资源
vivo 容器化平台架构与核心能力建设实践
为了实现规模化降本提效的目标,vivo 确定了基于云原生理念构建容器化生态的目标。在容器化生态发展过程中,平台架构不断演进,并针对业务的痛点和诉求,持续完善容器化能力矩阵。本次演讲将会介绍 vivo 容器化平台及主要子系统的架构设计,并分享重点建设的容器化核心能力。
相关产品
评论
未登录
看完啦,登录分享一下感受吧~
暂无评论