资讯专栏INFORMATION COLUMN

我的第一个豆瓣短评爬虫

gxyz / 344人阅读

摘要:,借鉴之前使用的经验,尝试直接使用与发现,豆瓣的短评,最一开始还好,但是在爬取将近十多页的短评时,会报出的异常,查询后得知,应该是豆瓣对于游客用户的限制,需要登录才可以。爬虫实践战狼豆瓣影评分析

豆瓣上有着大量的影视剧的评论,所以说,要是想要实现对广大人民群众的观点的分析,对一部片子的理解,综合来看大家的评论是很有必要的。而短评作为短小精干的快速评论入口,是值得一谈的。

所以先要实现对其的数据的爬取。

目前来看,基本内容是可以爬取的。最大的问题在于速度。后续考虑准备运用多线程的方式处理下。以及可以尝试其他提速的方法。

下面是这个程序的构思编写过程。

构思准备 爬取的思路,及反省与思考 盲目状态

最初,并不知道豆瓣对于未登陆用户的限制,盲目的爬取,看着评论文件,发现行数太少,也就是说评论内容太少,感觉不对劲。

我利用了即时打印写入内容的方式,发现,到了第十页左右的时候,出现无法获得页面内评论内容,思考了下后,试着将页面源代码打印出来,发现到了后面,就出现提示权限不足。我一下子知道了,是因为没有登录的原因。

登录

之前看过内容,明白这时候应该借助cookie的方式了。

但是又要处理验证码。而且,似乎初次登陆的时候并不需要验证码。为了方便,下面直接使用了存在验证码的方式。

由于开始不了解,不知道应该提交哪些信息,多方查找后,终于明白,就是在登录页面登陆后,打开浏览器的开发者工具里,查看里面的网络,注意关注里面的方法一列中的post所在行那项。在登陆点击后,随着页面的跳转,会出现一个post页面,点击后查看其参数,若是火狐的话有个专门的参数窗口,其中就有要提交的参数了。包括用户信息,还有登录跳转页面(redir)等等。

在最初,我直接将https://accounts.douban.com/login选作登录地址,当然也将从其登陆的信息复制了出来,但是发现登录到redir还可以,要是用opener.open()再登录 "https://movie.douban.com/subject/26934346/comments?start=" + str(start) + "&limit=20&sort=new_score&status=P" 这里构造的页面是登不上的。这里我也是测试了好久才发现的问题。具体原因我不清楚。可能是有哪些知识我是遗漏了的。

后来觉察到这一点后,我尝试使用现在的信息登录,如下。

main_url = "https://accounts.douban.com/login?source=movie"
formdata = {
    "form_email":"你的邮箱",
    "form_password":"你的密码",
    "source":"movie",
    "redir":"https://movie.douban.com/subject/26934346/",
    "login":"登录"
}
user_agent = r"Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.94 Safari/537.36"
headers = {"User-Agnet": user_agent, "Connection": "keep-alive"}

诶,竟然登上去了!

关于验证码的纠结思考

由于豆瓣的验证码是登一次变一次的。所以在发生上面的问题时,在没有找到正确的处理办法之时,我怀疑是因为验证码,在我获取上一次验证码图片,并将验证信息输入到formdata这个提交信息的字典中后,再次使用request.Request(url=main_url, data=logingpostdata, headers=headers)opener.open(req_ligin).read().decode("utf-8")的时候,会不会验证码发生了变化?而我提交的是刚才的验证码?

又开始查资料,后来终于明白,这里提交的信息中指定了验证码的图片的captchaID,这样使得提交信息时候,返回来的验证码图片也就是这个,图片id是唯一的,当你自己修改了提交内容,豆瓣也会使用你提供的这个id来获取服务器里的验证码图片,所以保证了图片的一致。(这是我的理解,觉得有问题,或者更精确的理解的,欢迎留言)

使用库的考虑 BeautifulSoup, re

准备尝试下beautiful soup这个库,对于拆解html页面很便利。但是在实践中,还是可能会用到正则表达式re模块。可见,正则表达式还是很重要的。掌握基本可以查表使用时必须的。

在代码中可以看出,我对于该库的使用还是有些粗,不巧妙,还有待加强。

不过,今天尝试了下,用CSS选择器还是很方便的。select()方法,很方便,可以参考从浏览器开发者工具里选择元素对应的CSS选择器,很直接。

urllib.request,http.cookiejar

借鉴之前使用urllib.request的经验,尝试直接使用urllib.request.Request(url, headers=headers)urllib.request.urlopen(request, data=None, timeout=3)发现,豆瓣的短评,最一开始还好,但是在爬取将近十多页的短评时,会报出Forbidden的异常,查询后得知,应该是豆瓣对于游客用户的限制,需要登录才可以。参考网上一些其他教程,可以使用设置cookie的方法来处理。

使用了cookiejar.CookieJar()声明对象,来保存cookie到了变量中。利用的request.HTTPCookieProcessor()来创建cookie处理器。利用request.build_opener()构造了一个 opener,后面利用opener.open()来打开直接网页或者处理请求。

socket

类似上一个爬虫里的设置,这里直接使用了全局的超时设定。

import socket
timeout = 3
socket.setdefaulttimeout(timeout)

限制三秒,超出就抛出socket.timeout异常。捕获后重新连接。

# 超时重连
state = False
while not state:
    try:
        html = opener.open(url).read().decode("utf-8")
        state = True
    except socket.timeout:
        state = False
time

为了防止爬取过快,设置了循环的延时。

for ...:
    ...
    time.sleep(3)
完整代码
# -*- coding: utf-8 -*-
"""
Created on Thu Aug 17 16:31:35 2017
@note: 为了便于阅读,将模块的引用就近安置了
@author: lart
"""

# 用于生成短评页面网址的函数
def MakeUrl(start):
    """make the next page"s url"""
    url = "https://movie.douban.com/subject/26934346/comments?start=" + str(start) + "&limit=20&sort=new_score&status=P"
    return url


# 登录页面信息
main_url = "https://accounts.douban.com/login?source=movie"
formdata = {
    "form_email":"你的邮箱",
    "form_password":"你的密码",
    "source":"movie",
    "redir":"https://movie.douban.com/subject/26934346/",
    "login":"登录"
}
user_agent = r"Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.94 Safari/537.36"
headers = {"User-Agnet": user_agent, "Connection": "keep-alive"}


# 保存cookies便于后续页面的保持登陆
from urllib import request
from http import cookiejar

cookie = cookiejar.CookieJar()
cookie_support = request.HTTPCookieProcessor(cookie)
opener = request.build_opener(cookie_support)


# 编码信息,生成请求,打开页面获取内容
from urllib import parse

logingpostdata = parse.urlencode(formdata).encode("utf-8")
req_ligin = request.Request(url=main_url, data=logingpostdata, headers=headers)
response_login = opener.open(req_ligin).read().decode("utf-8")


# 获取验证码图片地址
from bs4 import BeautifulSoup

try:
    soup = BeautifulSoup(response_login, "html.parser")
    captchaAddr = soup.find("img", id="captcha_image")["src"]

    # 匹配验证码id
    import re

    reCaptchaID = r" p")
            for text in comments:
                file.write(text.get_text().split()[0] + "
")
                print(text.get_text())
                limit_num = 0
                if item == pagenum - 1:
                    limit_num =+ 1
                    if limit_num == commentnum:
                        break
            time.sleep(3)

    print("采集写入完毕")
结果

可见至少也有9200条评论,不管是否有所遗漏,基数已经基本无差。

后续处理

数据已经到手,怎样玩耍就看自己的想法了,近期看到了一篇文章,讲了利用词频制作词云,生成图片,有点意思,决定模仿试试。

Python 爬虫实践:《战狼2》豆瓣影评分析

github:amueller/word_cloud

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/40735.html

相关文章

  • 我的豆瓣短评爬虫的多线程改写

    摘要:对之前我的那个豆瓣的短评的爬虫,进行了一下架构性的改动。同时也添加了多线程的实现。我的代码中多线程的核心代码不多,见下。注意使用多线程时,期间的延时时间应该设置的大些,不然会被网站拒绝访问,这时你还得去豆瓣认证下我真的不是机器人尴尬。 对之前我的那个豆瓣的短评的爬虫,进行了一下架构性的改动。尽可能实现了模块的分离。但是总是感觉不完美。暂时也没心情折腾了。 同时也添加了多线程的实现。具体...

    antyiwei 评论0 收藏0
  • 豆瓣电影,电视剧DM实战

    摘要:用户就我们这一个宿舍而其中电影的资源则是选择来自有大量电影电视剧信息的豆瓣。爬虫应对反爬虫机制目前来说豆瓣的反爬虫机制算是可以接受。 前言 前段时间和室友闹剧荒,于是萌生出一种做个私人化推荐系统想法。(用户就我们这一个宿舍)而其中电影的资源则是选择来自有大量电影电视剧信息的豆瓣。 目前,电影的信息已经抓取完毕,共有11159条JSON格式的数据,内容包括: 题目 时长 类型 导演 主...

    phpmatt 评论0 收藏0
  • python爬虫实战一:分析豆瓣中最新电影的影评

    摘要:准备把豆瓣上对它的影评短评做一个分析。这样就得到了最新电影的信息了。例如战狼的短评网址为其中就是电影的,表示评论的第条评论。如下图所示好的,至此我们已经爬取了豆瓣最近播放电影的评论数据,接下来就要对数据进行清洗和词云显示了。 简介 刚接触python不久,做一个小项目来练练手。前几天看了《战狼2》,发现它在最新上映的电影里面是排行第一的,如下图所示。准备把豆瓣上对它的影评(短评)做...

    BearyChat 评论0 收藏0
  • Python 爬虫-模拟登录知乎-爬取拉勾网职位信息

    摘要:本文代码地址爬取豆瓣电影爬取拉勾网职位信息模拟登陆知乎为什么没人给我点赞。职位名职位信息运行结果模拟登录知乎通过开发者工具,获取的数据。 我开通了公众号【智能制造专栏】,以后技术类文章会发在专栏。用Python写爬虫是很方便的,最近看了xlzd.me的文章,他的文章写的很到位,提供了很好的思路。因为他的文章部分代码省略了。下面是基于他的文章的三个代码片段:基于Python3,Pytho...

    joyvw 评论0 收藏0
  • 爬虫 - 收藏集 - 掘金

    摘要:在这之前,还是有必要对一些概念超轻量级反爬虫方案后端掘金前言爬虫和反爬虫日益成为每家公司的标配系统。 爬虫修炼之道——从网页中提取结构化数据并保存(以爬取糗百文本板块所有糗事为例) - 后端 - 掘金欢迎大家关注我的专题:爬虫修炼之道 上篇 爬虫修炼之道——编写一个爬取多页面的网络爬虫主要讲解了如何使用python编写一个可以下载多页面的爬虫,如何将相对URL转为绝对URL,如何限速,...

    1fe1se 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<