scrapy爬虫之抓取《芳华》短评及词云展示

简介

scrapy爬虫之《琅琊榜2》话题title收集及词云展示
scrapy爬虫之模拟登录豆瓣l
两篇博文中,我们分别实现了直接爬取内容及模拟登陆豆瓣,现在我们将这两个功能整合到一起,实现模拟登陆豆瓣并scrapy爬虫之抓取《芳华》短评及词云展示。

要点:给爬虫配置cookie,并配合yield访问,使得爬虫能保持用户已登录的状态,达到获得那些需登录才能访问的页面的目的。

实现

1.创建爬虫

cd /home/yanggd/python/scrapy
scrapy genspider fanghua douban.com

2.定制爬虫

# -*- coding: utf-8 -*-
#登陆豆瓣,抓取《芳华》评论
import scrapy
import urllib
from PIL import Image

class DoubanLoginSpider(scrapy.Spider):
    name = 'fanghua'
    allowed_domains = ['douban.com']
#    start_urls = ['http://www.douban.com/']
    headers = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.221 Safari/537.36 SE 2.X MetaSr 1.0"}

    def start_requests(self):
    '''
    重写start_requests,请求登录页面
    '''
    return [scrapy.FormRequest("https://accounts.douban.com/login", headers=self.headers, meta={"cookiejar":1}, callback=self.parse_before_login)]

    def parse_before_login(self, response):
    '''
    登录表单填充,查看验证码
    '''
    print("登录前表单填充")
    captcha_id = response.xpath('//input[@name="captcha-id"]/@value').extract_first()
    captcha_image_url = response.xpath('//img[@id="captcha_image"]/@src').extract_first()
    if captcha_image_url is None:
        print("登录时无验证码")
        formdata = {
                "source": "index_nav",
                "form_email": "[email protected]",
                #此处请填写密码
                "form_password": "******",
            }
    else:   
        print("登录时有验证码")
        save_image_path = "/home/yanggd/python/scrapy/douban/douban/spiders/captcha.jpeg"
        #将图片验证码下载到本地
        urllib.urlretrieve(captcha_image_url, save_image_path)
        #打开图片,以便我们识别图中验证码
        try:
            im = Image.open('captcha.jpeg')
            im.show()
        except:
            pass

        #手动输入验证码
        captcha_solution = raw_input('根据打开的图片输入验证码:')       
        formdata = {
                "source": "None",
                "redir": "https://www.douban.com",
                "form_email": "[email protected]",
                #此处请填写密码
                "form_password": "******",
                "captcha-solution": captcha_solution,
                "captcha-id": captcha_id,
                "login": "登录",
            }


    print("登录中")    
    #提交表单
    return scrapy.FormRequest.from_response(response, meta={"cookiejar":response.meta["cookiejar"]}, headers=self.headers, formdata=formdata, callback=self.parse_after_login)

    def parse_after_login(self, response):
    '''
    验证登录是否成功,并访问《芳华》评论
    '''
    account = response.xpath('//a[@class="bn-more"]/span/text()').extract_first()
    if account is None:
        print("登录失败") 
    else:
        print(u"登录成功,当前账户为 %s" %account)
        print("进入评论页")
        yield scrapy.Request('https://movie.douban.com/subject/26862829/collections', meta={"cookiejar":response.meta["cookiejar"]}, callback=self.parse_fanghua)

    def parse_fanghua(self, response):
    '''
    跳转至评论页,提取《芳华》评论
    '''
    print("抓取评论")
    print response.url
        for comment in response.xpath('//table[@width="100%"]/tr/td[2]/p[not(@*)]/text()').extract():
        yield {
            'content': comment.strip().encode('utf-8')
        }   
    #scrapy shell分析xpath语法
    #from scrapy.shell import inspect_response
    #inspect_response(response, self)
    next_page = response.xpath('//span[@class="next"]/a/@href').extract_first()
    if next_page is not None:
        yield response.follow(next_page, meta={"cookiejar":response.meta["cookiejar"]}, callback=self.parse_fanghua)

3.设置爬虫抓取频率
芳华的短评截至到现在有20多万条,为了防止爬虫被ban,我们需要数值下爬虫的抓取频率,也就是下载等待时间

vim /home/yanggd/python/scrapy/douban/douban/settings.py
DOWNLOAD_DELAY=2

注意:此参数默认为0,经设置后实际的延迟时间
的范围在0.5*download_delay~1.5*download_delay
之间。

4.运行爬虫

scrapy crawl fanghua -o fanghua.csv

执行完成后,可以看到csv文件

可能自己不是那个年代的人吧,感触不是非常的深,只是感觉很一般。^M
那个年代,文工团,都不是一般人敢拍的。拍了,也没什么特别^M
一代人的芳华,既美好又残酷。在那个年代的大环境下,每个人的性格特征都很鲜明。在远离战争的集体里,生活也算是丰富多彩,但是镜头切换,在战场上如此惨烈,不是生就是死,对比非常>鲜明。电影观后还是比较感动的,但是总感觉少了些什么……^M
不能感同身受。^M
芳华不只属于那一代人 我看到的不只是青春^M
就电影而言,节奏很怪,但是看到何小萍很想拿小说来看看^M
隔壁大妈一路大声点评:“对了!这么做就对了!不用怕别人怎么说。”“他们这是欺负人呀。”“你就说出了吧!这也没什么的,搞对象也不算丢脸……”出来的时候发现大妈其实很老了,由他儿子搀>扶着走出来,我坐在位子上目送她离开……理解她为什么会说那样的话做那样的事,羡慕她可以活在自己的芳华里。^M
我想起一句话,如果没胆就别去触摸!含含糊糊,到头来偏偏怪审查制度太严!或许冯导是了不起的!但同时也是压抑的,我相信未来不久会出现下一个冯导,那时候不再压抑!^M
好久没看到让人眼泪不停流的电影了^M
至少我在电影院哭得稀里哗啦。^M
最美好的年华,奉献了最残酷的年代^M
在我妈强烈要求下去看的。全程对萧穗子和何小萍脸盲,短头发那个女生和林丁丁倒是特色鲜明能分得清。男角色除了刘峰,全员脸盲。这个电影要表达的东西很多,电影时长太短了。何小萍和>石林峰谈话,刘峰被污蔑 好人只能一直是好人,以及最后两人在火车站的依偎很打动我。^M
.......

5.生成词云

生成词云请参照scrapy爬虫之《琅琊榜2》话题title收集及词云展示,生成的图片如下:
这里写图片描述

总结

1.登陆豆瓣后,要通过meta={“cookiejar”:1}设置cookie,并通过meta={“cookiejar”:response.meta[“cookiejar”]}来保持会话,否则登陆抓取会跳转到登陆页面,例如代码中两次请求:

#登陆后,从短评页开始抓取
scrapy.Request('https://movie.douban.com/subject/26862829/collections', meta={"cookiejar":response.meta["cookiejar"]}, callback=self.parse_fanghua)
#跳转下一页
yield response.follow(next_page, meta={"cookiejar":response.meta["cookiejar"]}, callback=self.parse_fanghua)

若没有meta={“cookiejar”:response.meta[“cookiejar”]},都会跳转到登陆页面,让我们先进行登陆。
另外登陆成功后,除了使用meta保持cookie,还需要使用yield保持继续访问,如下:

yield scrapy.Request('https://movie.douban.com/subject/26862829/collections', meta={"cookiejar":response.meta["cookiejar"]}, callback=self.parse_fanghua)

2.scrapy shell
一般情况下,我们通过scrapy shell + url的方式可以进行css或xpath来分析抓取的内容,但是这种方式无法在登陆的情况下查看,但是我们可以在fanghua.py脚本中进行scrapy shell,请见parse_fanghua函数

scrapy shell分析xpath语法
from scrapy.shell import inspect_response
inspect_response(response, self)

通过此种方式,当程序运行到此处时,会进入scrapy shell模式,供我们分析;当我们ctrl+d结束后,代码后继续执行后面的代码。

3.xpath语法获取我们想要的表格内容

response.xpath('//table[@width="100%"]/tr/td[2]/p[not(@*)]/text()').extract()

猜你喜欢

转载自blog.csdn.net/yanggd1987/article/details/78987914
今日推荐