利用scrapy爬取豆瓣流浪地球所有评论

前言

小破球大热,曾经豆瓣是被誉为最公平的评分网站,但因为最近的行为,让豆瓣颇受争议,截止我写的这篇文章为止,流浪地球评分已经下降到7.9分,这是一部评分在下降,但是热度却不断上升的奇葩电影,如果电影没问题,那么是不是应该问惹到了什么恶臭资本,导致被恶意降分呢,那就让我们来扒一扒,豆瓣给差评的都是些什么人。
以下基于scrapy框架抓取豆瓣流浪星球所有评论,其中涉及cookie登录与反爬等功能

目标网站 信息收集部分

首先必须要很遗憾的告诉大家,如果不是每天固定抓取信息,你是抓不到所有数据的,这是因为该网站提供了评论限制,无法看到更早的信息
这是最后一页https://movie.douban.com/subject/26266893/comments?start=480&limit=20&sort=new_score&status=P

1.URL分析

先分析一下URL逻辑,start=480是指信息页数,limit=20是评论数,sort=new_score排序标准,

《利用scrapy爬取豆瓣流浪地球所有评论》

《利用scrapy爬取豆瓣流浪地球所有评论》

第二条为URL的上一页,可见逻辑清晰

2.定位目标分析

然后这里有一个问题,虽然网站未登录也可以查看评论,但是在看到200条信息后,会要求你登录,为了获取更多的信息,因此我们必须要用cookie请求。
接下来我们继续定位目标,我给自己设下两个抓取目标,一个是name,一个是comment,也就是一个文本,一个属性

《利用scrapy爬取豆瓣流浪地球所有评论》 数据抓取

除了抓数据,还要分析翻页位置,
《利用scrapy爬取豆瓣流浪地球所有评论》 翻页抓取

3.反爬分析

试运行后,豆瓣还是一个比较友好的网站,他的反爬只需要不遵守ROBOTS协议和添加请求头就可以,而且网页规则也是非异步,登录也不需要猜谜游戏加一些额外的东西。我试过疯狂请求豆瓣形成类似DOS攻击的死循环,哇!他居然没封我,哈哈哈哈。但是当循环到一定程度,就会有验证码出现让我证明是不是人类。在这个文章里,因为爬取得不深,所以没到解决验证码的地步。

代码部分

1.parse部分

import scrapy
from scrapy.selector import Selector,HtmlXPathSelector
from scrapy.http import Request
from ..items import EarthItem
from scrapy.http.cookies import CookieJar
#sys.stdout = io.TextIOWrapper(sys.stdout.buffer,encoding="gb18030")
class GoEarthSpider(scrapy.Spider):
    name = 'earth2'
    allowed_domains = ['https://movie.douban.com']
    start_urls = ['https://movie.douban.com/subject/26266893/comments?start=0']
    cookie_dict =None
    def parse(self, response):
        cookie_obj = CookieJar()   #创建cookie_obj
        cookie_obj.extract_cookies(response, response.request)
        self.cookie_dict = cookie_obj._cookies  # 保留cookie以便下次使用
        #yield Request(url = url_next,callback=self.parse,dont_filter=True,cookies=self.cookie_dict)
        yield Request(
            url= "https://accounts.douban.com/j/mobile/login/basic",
            method = 'POST',
            body ="name=不准看&password=你填你自己的密码&remember=true",
            headers ={'Content-Type': 'application/x-www-form-urlencoded',
                      "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36"},
            cookies =cookie_obj._cookies,
            callback=self.check_login,
            dont_filter = True,
        )     
    #请在yield Request里面填上自己的豆瓣账号和密码,不然你是运行不了的啊!

    def check_login(self,response):     #登录成功后,callback不再回调自己而是到check_login函数,
        print(response.text)
        url_list ="https://movie.douban.com/subject/26266893/comments?start=20&limit=20&sort=new_score&status=P"            #以url_list为起点,其实可以重写个start_request函数,都可以吧
        yield Request(url = url_list,callback=self.parse2,dont_filter=True,cookies=self.cookie_dict)

    def parse2(self,response):    #传递到解析方法2,该循环变成回调死循环,直到所有评论被爬完
        request_item = Selector(response= response).xpath('//*[@id="comments"]/div[@class="comment-item"]')
        url = Selector(response=response).xpath('//*[@id="comments"]/div[@id="paginator"]/a[@class="next"]/@href').extract()
        url_next = 'https://movie.douban.com/subject/26266893/comments'+str(url[0])
        #request_text = Selector(response = response).xpath('//*[@id="comments"]/div[@class="comment-item"]/div[@class="comment"]/p/span/text()').extract
        for item in request_item:
            #print(item.xpath('.//div[@class="comment"]/p/span/text()').extract)
            comment = item.xpath('.//div[@class="comment"]/p/span/text()').extract()
            name = item.xpath('.//div[@class="avatar"]/a/@title').extract()
            item_obj = EarthItem(comment=comment,name=name)
            yield item_obj
        yield Request(url=url_next, callback=self.parse2, dont_filter=True, cookies=self.cookie_dict)

我画个自己的逻辑思路,方便大家理解。还有记得把我上面那个用户名密码改一下啊,不然运行不了的

《利用scrapy爬取豆瓣流浪地球所有评论》 硬核三个球

2.Items部分


import scrapy


class EarthItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    comment = scrapy.Field()
    name = scrapy.Field()

3.pipelines部分

# -*- coding: utf-8 -*-

# Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: https://doc.scrapy.org/en/latest/topics/item-pipeline.html


class EarthPipeline(object):  #记得注册pipeline
    def process_item(self, item, spider):
        with open("douban","a",encoding="utf-8")as file:
            file.write((str(item["comment"]))+"\n"+str((item["name"]))+"\n\n")

结果部分(只截取一些)

['这个设定本身带来的那种悲壮甚至一丝浪漫感全被各种毫无节制的煽情和空到不行的台词给毁了 ★★☆']
['qw0aszx']

['新时代特色社会主义硬核科幻(科幻的核心在于探索发问,而不是去解释回答,这样的作品属于玄幻)']
['LUCIFER']

['春节期间最大的一场烟花,是看你爸为你和地球点燃的宇宙爆炸,太朋克了。']
['姨妈的鸭']

['不论从任何一种标准(科幻片的,华语片的,华语科幻片的)来看,都不能称得上是部合格影片。严重过度剪辑,这种典型2D动作片剪法用在这部空间结构比较复杂的3D科幻片上简直是胡闹。空间及动作表现极其不清,轴线纷乱,运送火石吴孟达死那一段,有人能看清发生什么事情了吗?经常错误地插入过紧的特写和过大的远景,在运动方向不一致,且无有效明暗对比的情况下,完全无法锚定观众注意力。全片仅有少量连续长镜头让人感觉空间清晰,但跨越数十万的公里的建构着实费力。每当镜头抽远,人语一成不变地延续,仿佛在看一部云淡风轻的青春片。说到底,这点视听手段完全无力处理刘慈欣的星系尺度超全知叙事。']
['南乌']

['一分。画面分。\n在一个烧石头都能做热核聚变的高科技时代,会搞不清楚发动机的工作条件导致集体熄火拉全人类去死?这是侮辱全人类工程技术人员和科学家的智商,被否定的方案能够实现,说明以前的预演就是放屁,如何把方案做得完美压根就不合格,可靠性,可行性是怎么验证的,此路不通也就没有别的补充方案了。科幻并不缺乏大场面的制作,虽然早已审美疲劳了,最大问题是脑残的剧情,它和你讲情怀和想象,我只能摇摇头。战狼京出现的违和感,让我有点想起当年芮成钢的名言“我代表亚洲”,除了画面科幻,就一意淫片。还有,并不是讲国内出了个能看的科幻片就必须鼓励大于批评给个五分。']
['[已注销]']

['8.8,热评第一条我就呵呵了,中国科幻电影为什么不值得我们打高分去鼓励,非要放在国际水平线上才是客观的吗,您真的有那么客观吗,我看《七武士》、《漫游太空2001》的时候,我要不顾及他是那个时代的电影,我会给那么高的评价吗,同样都是时间轴上的事情,我觉得国产这种东西给高一点评价真的没问题,真的需要鼓励,才能继续发展,我国多少题材和类型的电影就是被您这种想法所阻碍和难以发展的,向您这样的评论,中国科幻电影真的是寸步难行了,中国电影也会受之影响,真的希望大家能明白,结合我国电影发展的历史来评价国产电影。']
['Booige Boom']

['宏大又动人。为原著赋予了细腻的想象,整体气质比美式末日片都多了一份安静和真实,也有萦绕不去的悲伤。最戳心的当然还是《流浪地球》选择带着地球寻找新的星系,而不是开辟新的居住地,等冰有天化为水,子孙依然能看到北京、上海、贝加尔湖,这点可真是太乡愁了。看完念念不忘的并不是角色,而是电影带来的挥之不去的孤独感,望着头顶的太阳,真是又温暖又寒冷。']
['phoebe']

['这回还真不是吴京的锅,而是整个团队的锅!前半段尴尬,后半段强行撩,导演这剪辑和节奏掌握的都赶上各种笔仙碟仙了,本以为特效会有亮眼的地方,但整个cg效果并不让人满意,与其说这电影是科幻电影,不如说是部人伦片,催泪部分说是为了让科幻片看着不生硬,哎哟我去,这一催,更尴尬了!演技担当也就达叔了!所以一星我真的给得尽力了!']
['苏妄言']

['4星,多一星鼓励。华语电影工业飞跃的节点,技术、剧本、精神内核,各方面都是全球尺度下顶级同行们的优秀学生水准。可贵之处就在于,作为先行者和新生代,能分辨什么是好的,应当学习的,并用十二分的力气把它们执行出来。比起科幻,我更看重和感动是它作为电影本身的意义,终于让我对华语电影有了一丝“总是往好里去”的希望。执拗、赤诚、勇敢、高贵——是的,甚至称得上高贵,负载着沉重的文化烙印,但依然元气淋漓,令人击节的少年。像那颗燃烧自己驱动前行的淡蓝色小球,向着茫茫宇宙,星辰大海,出发。']
['巽']

['1.从特效和技术上讲,这应该是迄今为止此类中国电影的巅峰了。磅礴恢宏,细节营造用心。2.故事层面比较糟糕,很好奇到底出于什么原因,造成几乎超过40%的台词都是后配的,而且对不上口型,明显是片子成型后彻底改词重配的。这严重影响故事质量。3.作为类型片,很多讲述方式有明显问题,比如人物特征不鲜明,交代不清楚,刘启变成“刘户口”,这种启字的拆解为什么不交代?李一一变成“李长条”留给谁去猜?4.很多地方增加众多根本无意义的插科打诨,自以为幽默但毫无笑点非常尴尬。5.这个全球化的项目中,中俄合作,稍稍出现一句法语,两句日语,美国只闪现一次国旗,美国的缺席,出于什么原因?好奇。6.科幻特效技术有了巨大进步,但技术这只是科幻电影的一部分。']
['frozenmoon']

['观影过程中的情绪很复杂,一方面感叹特效的用心和部分设定的精妙,另一方面又很讨厌导演极尽谄媚的逢迎和所谓的“接地气”,这可能是导演想要努力区别于国外科幻片的地方,但不是说加入像《海草舞》、穿秋裤这样的“魔幻中国”元素就能展现出中国特有的科幻感的,一切还是要回归到人性纽带上。在这一点上,影片中的几条亲情线就至关重要。其中最打动人的还真是吴孟达饰演的爷爷/姥爷这条线,以及隐线叙事的父女情和夫妻情。吴京才是影片的第一男主角,从头演到尾,而且大多数时间都是独角戏,难度很大,变成特别出演可能也是情非得已。多加一星鼓励,作为第一步,确实已经不错了。']
['二十二岛主']

['就在我已经彻底被国内影视技术限制了想象力,不相信中国能有真正意义的科幻电影时,流浪地球便对着我的心脏狠狠扎了一针强心剂,走出电影院都还恍若隔世,中国真的也有这样的电影了吗,真的不是在做梦吗。相信,这是一部定会写进中国影史、中国科幻影史、中国太空电影史、中国影视工业进程史的一部科幻杰作,庆幸能成为见证者。此刻我手中的那张电影票不再是一张观影入场券,更像是一次亲历奇迹的勋章。']
['王小叶儿']

['木星都被你们地球人点燃了……\n还要我说什么???\n《流浪地球》挺硬,但序幕往后,越来越糙,人物情感和煽情模式太套路。中国能拍科幻片,中国是主场景也不违和。可强调中国心、以(过年)回家之类的观念灌输,实在吃不消。\n举例其中几场戏:上海电梯救援和初中生演讲感动全世界,完全不知道在拍啥,实实在在瓦解掉了开头上地出城的高大上感。反复的亲人泪两行当然可以,但一直用,就有点无解——更像反复要在现实中国和银幕科幻的联系上耍聪明(这一切也可以被注释为第一次见到中国城市被毁灭云云)。一直来这套,实在对不上地球死了几十亿人的悲剧感和极度寒冷,说来说去,也只是一堆数字。记住,电影评价也得有洛希极限。']
['木卫二']

['就真的,三分不能再多了。我很失望😞电影改编得面目全非。刘慈欣最精彩的是他的科幻的形吗,是吧,但除了他恢弘的宇宙想象外,更精彩的是对人性的洞悉和对社会形态的观察力。这些电影全都自我阉割,根本没打算要拍,即使自我降维打算拍成美式爆米花电影,却又连故事都讲不好,硬挤尴尬地笑点和煽情,人物全都莫名其妙的缺发动机。书中有侧面描写过为什么最终计划倾向于地球派而不是飞船派,电影连这一茬都不打算提,难道没看过原著的人不会困惑为什么要拖着个大地球满宇宙跑而不是靠飞船高效移居吗?连爆米花电影的水准都做不到,为刘慈欣不值,可别再想着拍三体了吧[微笑]最后居然还改成吴战狼的个人英雄主义,吐了,真的。']
['懒懒']

['开年第一部灾难大片——灾难级的表演,灾难级的文本,灾难级的剪辑,灾难级的摄影。原著小而精的结构到了电影里变成了赶流程一样的儿戏,通篇的廉价煽情和自我感动。最后小女孩全球广播作文朗诵我甚至听到我爸重重的“啧”了一声。至于技术,「值得鼓励」和「好」是截然不同的两件事情。']
['基闹']

感谢看到最后,刚开始学scrapy因为不熟悉,被固定语法坑了不少,差点就把我活埋了,不过还好还是走出来了,接下来,分布式爬虫,出发。

点赞