当前位置:   article > 正文

毕业设计:Python豆瓣电影数据爬取+清洗+可视化分析系统 (源码)_python电影系统源码

python电影系统源码

博主介绍:✌全网粉丝10W+,前互联网大厂软件研发、集结硕博英豪成立工作室。专注于计算机相关专业毕业设计项目实战6年之久,选择我们就是选择放心、选择安心毕业✌

毕业设计:2023-2024年计算机专业毕业设计选题汇总(建议收藏)

毕业设计:2023-2024年最新最全计算机专业毕设选题推荐汇总

1、项目介绍

技术栈:
Python语言、Flask框架、MySQL数据库、requests爬虫技术、Echarts可视化、爬虫+清洗+可视化、豆瓣电影数据

2、项目界面

(1)电影制片地区饼图分析
在这里插入图片描述

(2)电影数据信息
在这里插入图片描述

(3)首页
在这里插入图片描述

(4)电影数据漏斗图分析
在这里插入图片描述

(5)饼图分析
在这里插入图片描述

(6)电影类型数据柱状图
在这里插入图片描述
(7)导演作品柱状图分析

在这里插入图片描述

(8)评分与评论人数散点图
在这里插入图片描述

(9)每年电影数量折线图

在这里插入图片描述

(10)数据采集页面

在这里插入图片描述

3、项目说明

豆瓣电影数据采集分析可视化系统是基于Python语言和Flask框架开发的一款应用程序。它主要通过使用requests爬虫技术,从豆瓣电影网站上采集电影相关数据,并将其存储在MySQL数据库中。

该系统的主要功能包括数据采集、数据清洗以及可视化分析。首先,通过编写爬虫程序,系统可以自动从豆瓣电影网站上抓取电影的各种信息,如电影名称、评分、导演、演员等。获取到的原始数据会经过清洗处理,去除重复的数据、空值以及不符合要求的数据,以确保数据的准确性和完整性。

接下来,系统会利用Echarts可视化库,将清洗后的数据进行可视化分析。通过生成各种图表和图形,如柱状图、折线图、饼图等,系统可以直观地展示电影数据的统计结果和趋势变化。用户可以通过交互式界面,自定义查询条件和筛选参数,从而获取到特定范围内的电影数据,并进行更深入的分析和比较。

豆瓣电影数据采集分析可视化系统的应用场景广泛。它可以帮助电影从业人员了解当前热门电影及其评分情况,以便做出更好的决策。同时,它也可以作为电影爱好者的工具,用于查找感兴趣的电影、了解电影的评价和口碑等信息。

总之,豆瓣电影数据采集分析可视化系统结合了爬虫技术、数据清洗和可视化分析,为用户提供了一个方便、直观的电影数据查询和分析工具。通过对豆瓣电影数据的采集、清洗和可视化,用户可以更好地理解电影市场的动态,并做出更明智的决策。

4、核心代码



from bs4 import BeautifulSoup
import re
import urllib.request,urllib.error
import xlwt
import time
import random
import sqlite3

def main():
    baseurl = "https://movie.douban.com/top250?start="
    #1.爬取网页
    datalist = getData(baseurl)
    savepath='豆瓣Top250.xls'
    saveData(datalist,savepath)
    # askURL(baseurl)
#爬取网页
def getData(baseurl):
    #存储详情页链接
    href_list =[]
    #存储所有电影的信息
    datalist = []
    '''
    0*25=0
    1*25=25
    ...
    '''
    #调用获取页面信息的函数 10次
    for i in range(0,10):
        time.sleep(random.random() * 5)
        url = baseurl + str(i*25)
        #保存网页源码
        html = askURL(url)

        #2.逐一解析数据
        bs = BeautifulSoup(html,'html.parser')
        #找到所有的class=item的div,并保存到列表中
        item_list = bs.find_all('div',class_='item')  #查找符合要求的字符串
        for item in item_list:
            #正则表达式是字符串匹配,需要把item转化为字符串
            item = str(item)
            #提取详情页链接
            detail_href = re.findall(r'<a href="(.*?)">',item)[0]
            # print(detail_href)
            href_list.append(detail_href)


    # print(href_list)
    #         print(item)
    for href in href_list:
        time.sleep(random.random() * 5)
        #获取详情页源码
        detail_html = askURL(href)
        # print(detail_html)
        #保存一部电影的所有信息
        data = []
        # 获取片名
        title = ''
        try:
            title = re.findall(r'"v:itemreviewed">(.*?)</span>', detail_html)[0]
        except:
            print("获取片名失败")
        data.append(title)
        # 获取导演名
        director = ''
        try:
            director = re.findall(r'"v:directedBy">(.*?)</a>', detail_html)[0]
        except:
            print("获取导演信息失败")
        data.append(director)
        # print(director)

        # 获取第一编剧
        scriptwriter = ''
        try:
            scriptwriter = re.findall(r"编剧.*?: <span class='attrs'><a href=.*?>(.*?)</a>", detail_html)[0]
        except:
            print("获取编剧信息失败")
        data.append(scriptwriter)
        # 获取第一主演
        star = ''
        try:
            star = re.findall(r'rel="v:starring">(.*?)</a>', detail_html)[0]
        except:
            print("获取演员信息失败")
        data.append(star)
        # print(star)

        # 获取类型
        filmtype = ''
        try:
            filmtype = re.findall(r'"v:genre">(.*?)</span>', detail_html)[0]
        except:
            print("获取电影类型信息失败")
        data.append(filmtype)
        # print(filmtype)

        # 获得制片国家
        country = ''
        try:
            country = re.findall(r'<span class="pl">制片国家/地区:</span> (.*?)<br/>', detail_html)[0]
        except:
            print("获取制片国家失败")
        data.append(country)
        # print(country)

        # 获得语言
        lag = ''
        try:
            lag = re.findall(r'<span class="pl">语言:</span> (.*?)<br/>', detail_html)[0]
        except:
            print("获取语言失败")
        data.append(lag)
        # print(lag)

        # 获得片长
        runtime = ''
        try:
            runtime = re.findall(r'<span property="v:runtime" content="(.*?)">', detail_html)[0]
        except:
            print("获取片长失败")
        data.append(runtime)
        # print(runtime)

        # 获得评分 ----------------
        score = ''
        try:
            score = re.findall(r'property="v:average">(.*?)</strong>', detail_html)[0]
        except:
            print("获取评分失败")
        data.append(score)
        # print(score)

        # 获得评价人数
        num = ''
        try:
            num = re.findall(r'<span property="v:votes">(.*?)</span>人评价', detail_html)[0]
        except:
            print("获取评价人数失败")
        data.append(num)
        # print(num)

        year = ''
        try:
            year = re.findall(r'<span class="year">(.*?)</span>', detail_html)[0]
        except:
            print("获取上映日期失败")
        data.append(year)
        # print(year)

        description = ''
        try:
            description = re.findall(r'<meta property="og:description" content="(.*?)" />', detail_html)[0]
        except:
            print("获取简介失败")
        data.append(description)
        # print(description)

        image = ''
        try:
            image = re.findall(r'<meta property="og:image" content="(.*?)" />', detail_html)[0]
        except:
            print("获取图片失败")
        data.append(image)
        # print(image)
        print(data)
        datalist.append(data)
    # print(datalist)
    return datalist

#得到指定一个URL的网页内容
def askURL(url):
    #模拟浏览器头部信息,向豆瓣服务器发送消息
    # headers = {
    #     'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36'
    # }
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.5060.66 Safari/537.36 Edg/103.0.1264.44'
    }
    content = ''
    #请求对象
    req = urllib.request.Request(url,headers = headers)
    try:
        #得到响应信息
        response = urllib.request.urlopen(req)
        #读取响应信息
        content = response.read().decode('utf-8')
        # print(content)
    except urllib.error.URLError as e:
        #hasattr 检查指定属性是否存在
        if hasattr(e,'code'):
            print(e.code)
        if hasattr(e,'reason'):
            print(e.reason)
    return content


def saveData(datalist,savepath):
    # 创建workbook对象
    workbook = xlwt.Workbook(encoding='utf-8',style_compression=0)
    # 创建工作表
    worksheet = workbook.add_sheet('豆瓣电影Top250',cell_overwrite_ok=True)
    col = ('电影名','导演','编剧','主演','类型','制片国家','语言','片长','评分','评价人数','上映日期','简介','图片')
    for i in range(0,13):
        # 写入表头
        worksheet.write(0,i,col[i])
    for i in range(0,250):
        print('第%d条'%(i+1))
        data = datalist[i]
        for j in range(0,13):
            worksheet.write(i+1, j, data[j])
    workbook.save(savepath)  #保存

if __name__ == '__main__':
    main()

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153
  • 154
  • 155
  • 156
  • 157
  • 158
  • 159
  • 160
  • 161
  • 162
  • 163
  • 164
  • 165
  • 166
  • 167
  • 168
  • 169
  • 170
  • 171
  • 172
  • 173
  • 174
  • 175
  • 176
  • 177
  • 178
  • 179
  • 180
  • 181
  • 182
  • 183
  • 184
  • 185
  • 186
  • 187
  • 188
  • 189
  • 190
  • 191
  • 192
  • 193
  • 194
  • 195
  • 196
  • 197
  • 198
  • 199
  • 200
  • 201
  • 202
  • 203
  • 204
  • 205
  • 206
  • 207
  • 208
  • 209
  • 210
  • 211
  • 212
  • 213
  • 214
  • 215
  • 216
  • 217

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/435924
推荐阅读
相关标签