基于python+django+爬虫豆瓣电影数据可视化分析系统的设计与实现【附开发文档+代码讲解】

🔥作者:雨晨源码🔥

💖简介:java、微信小程序、安卓;定制开发,远程调试 代码讲解,文档指导,ppt制作💖

精彩专栏推荐订阅:在下方专栏👇🏻👇🏻👇🏻👇🏻

Java精彩实战毕设项目案例

小程序精彩项目案例

Python实战项目案例

​💕💕文末获取源码

文章目录

  • 豆瓣电影分析系统-系统前言简介
  • 豆瓣电影分析系统-开发技术与环境
  • 豆瓣电影分析系统-功能介绍
  • 豆瓣电影分析系统-演示图片
  • 豆瓣电影分析系统-论文参考
  • 豆瓣电影分析系统-代码展示
  • 豆瓣电影分析系统-结语(文末获取源码)

    本次文章主要是介绍豆瓣电影数据分析可视化系统 的功能,系统分为二个角色,分别是用户和管理员

    豆瓣电影分析系统-系统前言简介

    本文主要介绍了影视系统的爬虫与分析。影视是人们娱乐、放松心情的重要方式之一,因此对影视的分析具有重要的现实意义。通过采用Python编程语言,使用Django框架搭建影视系统,并使用相关技术实现对豆瓣网站的爬取、数据存储和可视化分析,可以更好地了解影视市场的状况和人们对影视的喜好,为影视制作和推广提供参考。

    在技术实现方面,我们采用了Django框架和相关技术实现影视系统的爬虫与分析。Django框架是一种高效、稳定的Web应用程序框架,可以快速构建Web应用程序,并提供了完整的MVC架构和强大的数据库操作支持。我们还使用了django-threadlocals、pymysql、click、requests、xlrd和django-cors-headers等Python库,实现了豆瓣网站的数据爬取、存储和可视化分析。

    通过编写爬虫程序,采集豆瓣网站上影视的相关信息,并将这些信息存储到数据库中。然后,我们使用Python中的数据分析工具,如pandas、matplotlib等,对数据进行可视化分析,以便更好地了解影视市场的现状和人们对影视的喜好。最后,我们将分析结果呈现在Web界面上,使用户可以更加直观地了解影视市场和人们对影视的评价,从而更好地了解影视市场的趋势和人们的需求。

    豆瓣电影分析系统-开发技术与环境

    • 开发语言:Python
    • 后端框架:Django、爬虫
    • 前端:vue
    • 数据库:MySQL
    • 系统架构:B/S
    • 开发工具:pycharm

      豆瓣电影分析系统-功能介绍

      2个角色:用户/管理员(亮点:爬虫+echarts可视化)

      用户:用户登录进入系统可以实现对电影、电影资讯、后台管理等进行操作。

      管理员:管理员是系统中的核心用户,管理员登录后,可以对后台系统进行管理。主要包括有个人中心、电影管理、用户管理、系统管理等功能。

      豆瓣电影分析系统-演示图片

      1.用户端页面:

      ☀️用户首页☀️

      ☀️电影列表☀️

      2.管理员端页面:

      ☀️可视化大屏☀️

      ☀️电影管理☀️

      ☀️用户管理☀️

      ☀️电影资讯管理☀️

      豆瓣电影分析系统-论文参考

      豆瓣电影分析系统-代码展示

      1.爬虫解析【代码如下(示例):】

       # 列表解析
          def parse(self, response):
              
              _url = urlparse(self.spiderUrl)
              self.protocol = _url.scheme
              self.hostname = _url.netloc
              plat = platform.system().lower()
              if plat == 'windows_bak':
                  pass
              elif plat == 'linux' or plat == 'windows':
                  connect = self.db_connect()
                  cursor = connect.cursor()
                  if self.table_exists(cursor, 'by8ev_movie') == 1:
                      cursor.close()
                      connect.close()
                      self.temp_data()
                      return
      ​
              list = response.css('div#nowplaying ul.lists li.list-item, div#upcoming ul.lists li.list-item')
              
              for item in list:
      ​
                  fields = MovieItem()
      ​
      ​
      ​
                  fields["laiyuan"] = self.remove_html(item.css('li[] a::attr(href)').extract_first())
      ​
                  detailUrlRule = item.css('li[] a::attr(href)').extract_first()
                  if self.protocol in detailUrlRule:
                      pass
                  elif detailUrlRule.startswith('//'):
                      detailUrlRule = self.protocol + ':' + detailUrlRule
                  else:
                      detailUrlRule = self.protocol + '://' + self.hostname + detailUrlRule
                      fields["laiyuan"] = detailUrlRule
      ​
                  yield scrapy.Request(url=detailUrlRule, meta={'fields': fields},  callback=self.detail_parse)
      ​
      ​
          # 详情解析
          def detail_parse(self, response):
              fields = response.meta['fields']
      ​
              try:
                  if '(.*?)' in '''div[id="info"] span:nth-child(1) span a::text''':
                      fields["daoyan"] = re.findall(r'''div[id="info"] span:nth-child(1) span a::text''', response.text, re.S)[0].strip()
                  else:
                      if 'daoyan' != 'xiangqing' and 'daoyan' != 'detail' and 'daoyan' != 'pinglun' and 'daoyan' != 'zuofa':
                          fields["daoyan"] = self.remove_html(response.css('''div[id="info"] span:nth-child(1) span a::text''').extract_first())
                      else:
                          fields["daoyan"] = emoji.demojize(response.css('''div[id="info"] span:nth-child(1) span a::text''').extract_first())
              except:
                  pass
      ​
      ​
              try:
                  if '(.*?)' in '''div[id="info"] br~span span[class="attrs"] a::text''':
                      fields["bianju"] = re.findall(r'''div[id="info"] br~span span[class="attrs"] a::text''', response.text, re.S)[0].strip()
                  else:
                      if 'bianju' != 'xiangqing' and 'bianju' != 'detail' and 'bianju' != 'pinglun' and 'bianju' != 'zuofa':
                          fields["bianju"] = self.remove_html(response.css('''div[id="info"] br~span span[class="attrs"] a::text''').extract_first())
                      else:
                          fields["bianju"] = emoji.demojize(response.css('''div[id="info"] br~span span[class="attrs"] a::text''').extract_first())
              except:
                  pass
      ​
      ​
              try:
                  if '(.*?)' in '''div[id="info"] span[class="actor"] span[class="attrs"] a::text''':
                      fields["zhuyan"] = re.findall(r'''div[id="info"] span[class="actor"] span[class="attrs"] a::text''', response.text, re.S)[0].strip()
                  else:
                      if 'zhuyan' != 'xiangqing' and 'zhuyan' != 'detail' and 'zhuyan' != 'pinglun' and 'zhuyan' != 'zuofa':
                          fields["zhuyan"] = self.remove_html(response.css('''div[id="info"] span[class="actor"] span[class="attrs"] a::text''').extract_first())
                      else:
                          fields["zhuyan"] = emoji.demojize(response.css('''div[id="info"] span[class="actor"] span[class="attrs"] a::text''').extract_first())
      

      2.数据缓存【代码如下(示例):】

      # 数据缓存源
         def temp_data(self):
      ​
             connect = self.db_connect()
             cursor = connect.cursor()
             sql = '''
                 insert into movie(
                     daoyan
                     ,bianju
                     ,zhuyan
                     ,leixing
                     ,diqu
                     ,yuyan
                     ,shangyingriqi
                     ,pianchang
                     ,pingfen
                     ,xiangqing
                     ,fengmian
                     ,mingcheng
                     ,laiyuan
                 )
                 select
                     daoyan
                     ,bianju
                     ,zhuyan
                     ,leixing
                     ,diqu
                     ,yuyan
                     ,shangyingriqi
                     ,pianchang
                     ,pingfen
                     ,xiangqing
                     ,fengmian
                     ,mingcheng
                     ,laiyuan
                 from by8ev_movie
                 where(not exists (select
                     daoyan
                     ,bianju
                     ,zhuyan
                     ,leixing
                     ,diqu
                     ,yuyan
                     ,shangyingriqi
                     ,pianchang
                     ,pingfen
                     ,xiangqing
                     ,fengmian
                     ,mingcheng
                     ,laiyuan
                 from movie where
                  movie.daoyan=by8ev_movie.daoyan
                 and movie.bianju=by8ev_movie.bianju
                 and movie.zhuyan=by8ev_movie.zhuyan
                 and movie.leixing=by8ev_movie.leixing
                 and movie.diqu=by8ev_movie.diqu
                 and movie.yuyan=by8ev_movie.yuyan
                 and movie.shangyingriqi=by8ev_movie.shangyingriqi
                 and movie.pianchang=by8ev_movie.pianchang
                 and movie.pingfen=by8ev_movie.pingfen
                 and movie.xiangqing=by8ev_movie.xiangqing
                 and movie.fengmian=by8ev_movie.fengmian
                 and movie.mingcheng=by8ev_movie.mingcheng
                 and movie.laiyuan=by8ev_movie.laiyuan
                 ))
                 limit {0}
             '''.format(random.randint(20,30))
      ​
             cursor.execute(sql)
             connect.commit()
      ​
             connect.close()
      

      豆瓣电影分析系统-结语(文末获取源码)

      💕💕

      Java精彩实战毕设项目案例

      小程序精彩项目案例

      Python实战项目集

      💟💟如果大家有任何疑虑,欢迎在下方位置详细交流。