用Python爬取豆瓣电影TOP250分析

举报
且听风吟 发表于 2019/11/02 09:22:03 2019/11/02
【摘要】 豆瓣电影TOP250,对于众多爬虫爱好者,应该并不陌生。 很多人都会以此作为第一个练手的小项目。 当然这也多亏了豆瓣的包容,没有加以太多的反爬措施,对新手比较友好。 本期通过Scrapy框架,对豆瓣电影TOP250信息进行爬取。 同时对获取的数据进行可视化分析,给大家带来一个不一样的TOP250。

/ 01 / Scrapy

之前了解了pyspider框架的使用,但是就它而言,只能应用于一些简单的爬取。


对于反爬程度高的网站,它就显得力不从心。


那么就轮到Scrapy上场了,目前Python中使用最广泛的爬虫框架。


当然目前我学习的都是简单爬虫,上述内容都是道听途说,并不是切身体会。


Scrapy的安装相对复杂,依赖的库较多。


不过通过度娘,最后我是成功安装了的。放在C盘,如今我的C盘要爆炸。


首先任意文件夹下命令行运行scrapy startproject doubanTop250,创建一个名为doubanTop250的文件夹。


然后在文件夹下的py文件中改写程序。


进入文件夹里,命令行运行scrapy genspider douban movie.douban.com/top250。


最后会生成一个douban.py文件,Scrapy用它来从网页里抓取内容,并解析抓取结果。


最终修改程序如下。



import scrapy
from scrapy import Spider
from doubanTop250.items import Doubantop250Item


class DoubanSpider(scrapy.Spider):
    name = 'douban'
    allowed_domains = ['douban.com']
    start_urls = ['https://movie.douban.com/top250/']

    def parse(self, response):
        lis = response.css('.info')
        for li in lis:
            item = Doubantop250Item()
            # 利用CSS选择器获取信息
            name = li.css('.hd span::text').extract()
            title = ''.join(name)
            info = li.css('p::text').extract()[1].replace('\n''').strip()
            score = li.css('.rating_num::text').extract_first()
            people = li.css('.star span::text').extract()[1]
            words = li.css('.inq::text').extract_first()
            # 生成字典
            item['title'] = title
            item['info'] = info
            item['score'] = score
            item['people'] = people
            item['words'] = words
            yield item

        # 获取下一页链接,并进入下一页
        next = response.css('.next a::attr(href)').extract_first()
        if next:
            url = response.urljoin(next)
            yield scrapy.Request(url=url, callback=self.parse)
        pass



生成的items.py文件,是保存爬取数据的容器,代码修改如下。



import scrapy


class Doubantop250Item(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    title = scrapy.Field()
    info = scrapy.Field()
    score = scrapy.Field()
    people = scrapy.Field()
    words = scrapy.Field()
    pass



在这个之后,还需要在settings.py文件添加用户代理和请求延时。


最后在douban.py所在文件夹下打开命令行,输入scrapy crawl douban。


命令行就会显示获取的结果啦!!!


640?wxfrom=5&wx_lazy=1&wx_co=1


这里豆瓣的信息有Unicode编码,我也不知为何要在一个网页里设置两种编码。


在当前文件夹命令行运行scrapy crawl douban -o douban.csv,即可输出csv文件。


由于在处理的时候没有去除空格,造成有两种编码存在,无法通过Excel查看。


这里就贴一个文本文档,后续会在数据可视化里去除Unicode编码。


640?wxfrom=5&wx_lazy=1&wx_co=1

/ 02 / 数据可视化

01 电影上映年份分布


640?wxfrom=5&wx_lazy=1&wx_co=1


这里可以看出豆瓣电影TOP250里,电影的上映年份,多分布于80年代以后。


其中有好几年是在10部及以上的。


02 中外电影上映年份分布


640?wxfrom=5&wx_lazy=1&wx_co=1


明显感受到了国产电影和国外电影的差距,90年代还行,还能过过招。


越往后,国产电影就基本就没有上榜的。


每年电影出得倒是不少,真正质量好的又能有几部呢?


今天刚好看到新周刊的推文「2018年10大烂片」。


影评人周黎明:如果一部影片既没有表达,也没有最基本的技术水准,那应该是最彻底的烂片。


讲道理,国产烂片还真不少...


03 中外电影评分情况


640?wxfrom=5&wx_lazy=1&wx_co=1


通过上张图,我们知道国外电影是占据了榜单的大多数。


不过这里评分情况,倒是倍感欣慰,说明国产电影中的精品也不错,和国外电影并没有太大的差距。


只是这些影片貌似有点老了...


04 电影数TOP10


640?wxfrom=5&wx_lazy=1&wx_co=1


美国遥遥领先,中国位居其中。


在我的那篇「2018年电影分析」中,中国目前可是个电影高产国,结果呢...


香港都比内地的多。这里不得不佩服90,00年代的香港影业,确实很强!


05 电影评分分布


640?wxfrom=5&wx_lazy=1&wx_co=1


大多分布于「8.5」到「9.2」之间。最低「8.3」,最高「9.6」。


06 评论人数TOP10


640?wxfrom=5&wx_lazy=1&wx_co=1


让我们来看看人气最高的有哪些影片,你又看过几部呢?


记得上学的时候,时间多。我根据IMDbTOP250,看了榜上大部分的电影。


于是乎豆瓣电影这个TOP10,我也全看过了,都是一些有故事的电影。


07 排名评分人数三维度


640?wxfrom=5&wx_lazy=1&wx_co=1


总的来说,排名越靠前,评价人数越多,并且分数也越高。


08 年份评分人数三维度


640?wxfrom=5&wx_lazy=1&wx_co=1


这里就更加明显看出榜单上电影分布情况,大部分都是80年代以后的。


在90年代有个小高峰,不仅评价高,人气还高。


往后的数据就相对平稳,变化不是太大。


09 电影类型图


640?wxfrom=5&wx_lazy=1&wx_co=1


和我之前「2018年电影分析」比较一下,发现榜单里「动作」片减少不少,其他差别不大。


这算不算是间接说明国人更喜欢视觉上的东西呢?

/ 03 / 总结

本次只是一个简单的Scrapy操作,目的就是简单了解一下它的使用。


以后或许会更深入去学习Scrapy框架,所以慢慢等小F填坑吧!


代码都放在原作者小F的「GitHub」上头了: https://github.com/Tobby-star/douban


本文转载自微信公众号【java学习之道】。

原文链接:https://mp.weixin.qq.com/s?__biz=MzU4NzYwNDAwMg==&mid=2247484684&idx=1&sn=70c9849e8bc5fc70b48b30f5e58d8b9e&chksm=fde8cc41ca9f45579d4bbda4e0bc2372aedc54caab7a6727ff0bedfd64fed3945939e1d62090&scene=0#rd


【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。