爬虫+Flask+Echarts搭建《深度学习》书评显示大屏

12 篇文章 0 订阅
9 篇文章 0 订阅

1、前言

本项目是基于requests爬虫+flask+echarts搭建的《深度学习》书评的可视化大屏,主要涉及到的技术有爬虫、数据库操作,flask框架,echarts图表。

最终效果如下:

在这里插入图片描述

2、实现

2.1 挑选想要采集的书籍

为了爬取书评,一想到的是豆瓣读书,搜索发现大多数书评都没有超过两位数,故从中挑选书评比较多是五本书,分别是:

深度学习、
动手学深度学习、
深度学习 : 智能时代的核心驱动力量、
Python深度学习、
深度学习的数学

这五本书,对应的豆瓣书籍id是:

book_dict = {'深度学习': 27087503, '动手学深度学习': 33450010, '深度学习 : 智能时代的核心驱动力量': 30425822,
                 'Python深度学习': 30293801, '深度学习的数学': 33414479}

2.2 构建爬虫

2.2.1 采集书籍信息

def get_books():
    for i in book_dict:
        book_id = book_dict['{}'.format(i)]
        book_url = 'https://book.douban.com/subject/{}/'.format(book_id)
        a = requests.get(url=book_url, headers=header)
        data = etree.HTML(a.text)
        name = ''.join(data.xpath('//div[@id="wrapper"]/h1/span/text()'))
        other = ''.join(data.xpath('//div[@id="wrapper"]//div[@id="info"]//text()')).replace('\n', '').strip()
        detail = ''.join(data.xpath('//div[@class="indent"][1]//div[@class="intro"]/p//text()'))
        star = ''.join(data.xpath('//div[@class="rating_self clearfix"]/strong/text()'))
        comments = ''.join(data.xpath('//div[@id="comments-section"]//h2//a//text()'))
        cursor = conn.cursor()
        # 保存数据
        sql = """insert into book(id,name,other,detail,star,comments) values('%s','%s','%s','%s','%s','%s')""" % (
            book_id, name, other, detail, star, comments)
        print(book_id, name, other, detail, star, comments)
        cursor.execute(sql)
        conn.commit()
        cursor.close()
        # 随机生成一个介于1和5之间的整数,作为休眠时间
        sleep_time = random.randint(1, 3)
        # 暂停执行程序指定的时间
        time.sleep(sleep_time)
        get_comments(name, book_id)

2.2.2 采集书评

def get_comments(name, book_id):
    for num in range(0, 81, 20):
        url = 'https://book.douban.com/subject/{}/comments/?start={}&limit=20&status=P&sort=score'.format(book_id, num)
        a = requests.get(url=url, headers=header)
        response = etree.HTML(a.text)
        data = response.xpath('//li[@class="comment-item"]')
        for per_data in data:
            user_name = ''.join(per_data.xpath('.//span[@class="comment-info"]/a[1]//text()'))
            comment = ''.join(per_data.xpath('.//p[@class="comment-content"]/span//text()'))
            star = ''.join(per_data.xpath('.//span[@class="comment-info"]/span[1]/@class'))
            comments_time = ''.join(per_data.xpath('.//span[@class="comment-info"]/a[2]//text()'))
            ip = ''.join(per_data.xpath('.//span[@class="comment-location"]//text()'))
            follow = ''.join(per_data.xpath('.//span[@class="vote-count"]//text()'))
            cursor = conn.cursor()
            # 保存数据
            sql = """insert into comments(book_name,user_name,comment,star,comments_time,ip,follow) values('%s','%s','%s','%s','%s','%s','%s')""" % (
                name, user_name, comment, star, comments_time, ip, follow)
            print(name, user_name, comment, star, comments_time, ip, follow)
            cursor.execute(sql)
            conn.commit()
            cursor.close()
        sleep_time = random.randint(1, 3)
        time.sleep(sleep_time)

2.3 数据清洗

采集的数据如下图所示,数据格式很乱,故我们需要对数据进行清洗:

在这里插入图片描述
在这里插入图片描述

2.3.1 清洗书籍信息

这里用的正则表达式对数据进行清洗:

def clean_book_data():
    cursor = conn.cursor()
    sql = """select * from book"""
    cursor.execute(sql)
    data = cursor.fetchall()
    for i in data:
        book_id = i[0]
        book_name = i[1]
        detail = i[2]
        other = i[3]
        star = i[4]
        comments = i[5]
        pattern = r"(?<=作者:).*?(?=出版社:)"
        author = ''.join(re.findall(pattern, other)).replace('  ', '').strip().replace(' /', '/').replace('] ', ']')
        pattern = r"(?<=出版社:).*?(?=出品方:)"
        publishin_house = ''.join(re.findall(pattern, other)).strip()
        pattern = r"(?<=页数:).*?(?=定价:)"
        pages = ''.join(re.findall(pattern, other)).strip()
        pattern = r"(?<=定价:).*?(?=装帧:)"
        price = ''.join(re.findall(pattern, other)).strip().replace('元', '')
        pattern = r"ISBN:\s*(\d{9,10})"
        ISBN = re.search(pattern, other).group(1)
        # 保存数据
        sql = """insert into book_v2(id,name,detail,star,comments,author,publishin_house,pages,price,ISBN) values('%s','%s','%s','%s','%s','%s','%s','%s','%s','%s')""" % (
            book_id, book_name, detail, star, comments, author, publishin_house, pages, price, ISBN)
        cursor.execute(sql)
        conn.commit()
    cursor.close()

2.3.2 清洗书评信息

def clean_comments_data():
    cursor = conn.cursor()
    sql = """select * from comments"""
    cursor.execute(sql)
    data = cursor.fetchall()
    for i in data:
        book_name = i[0]
        user_name = i[1]
        comment = i[2]
        star = i[3]
        comments_time = i[4]
        ip = i[5]
        follow = i[6]
        # 清洗评论
        comment = comment.replace('\n', '')
        # 清洗打星
        pattern = r'\d+'
        result = re.findall(pattern, star)
        if result:
            star = ''.join(result)
            star = round(float(star) / 10)
        else:
            star = ''
        # 保存数据
        sql = """insert into comments_v2(book_name,user_name,comment,star,comments_time,ip,follow) values('%s','%s','%s','%s','%s','%s','%s')""" % (
            book_name, user_name, comment, star, comments_time, ip, follow)
        print(book_name, user_name, comment, star, comments_time, ip, follow)
        cursor.execute(sql)
        conn.commit()
    cursor.close()

2.4 统计分析,结果持久化存储

# 按照采集的评论算出每本书平均星级
def clean_analyze_1():
    cursor = conn.cursor()
    sql = """DROP TABLE IF EXISTS `analyze_1`;"""
    cursor.execute(sql)
    conn.commit()
    sql = """CREATE TABLE `analyze_1` AS 
            SELECT `book_name`, ROUND(AVG(IFNULL(`star`, 0)),2) as value
            FROM `comments_v2`
            GROUP BY `book_name`;"""
    cursor.execute(sql)
    conn.commit()
    cursor.close()


# 按ip统计各地区评论数
def clean_analyze_2():
    cursor = conn.cursor()
    sql = """DROP TABLE IF EXISTS `analyze_2`;"""
    cursor.execute(sql)
    conn.commit()
    sql = """CREATE TABLE `analyze_2` AS 
            SELECT IF(ip = '', '未知', ip) AS ip, COUNT(*) AS value
            FROM comments_v2
            GROUP BY ip;"""
    cursor.execute(sql)
    conn.commit()
    cursor.close()


# 每本书评论的平均点赞数
def clean_analyze_3():
    cursor = conn.cursor()
    sql = """DROP TABLE IF EXISTS `analyze_3`;"""
    cursor.execute(sql)
    conn.commit()
    sql = """CREATE TABLE `analyze_3` AS 
            SELECT `book_name`, ROUND(AVG(IFNULL(`follow`, 0)),2) as value
            FROM `comments_v2`
            GROUP BY `book_name`;"""
    cursor.execute(sql)
    conn.commit()
    cursor.close()


# 词云
def clean_analyze_4():
    cursor = conn.cursor()
    sql = """DROP TABLE IF EXISTS `analyze_4`;
    """
    cursor.execute(sql)
    conn.commit()
    sql = """
            CREATE TABLE `analyze_4` (
          `word` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
          `count` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL
        ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;"""
    cursor.execute(sql)
    conn.commit()
    sql = """SELECT comment
            FROM `comments_v2`;"""
    cursor.execute(sql)
    comments = cursor.fetchall()
    text = ''
    for comment in comments:
        text = text + comment[0]
    # 正则取出中文
    text = ''.join(re.findall('[\u4e00-\u9fa5]', text))
    STOPWORDS_CH = open('停用词表.txt', encoding='utf8').read().split()
    word_list = [
        w for w in jieba.cut(text)
        if w not in set(STOPWORDS_CH) and len(w) > 1
    ]
    counter = Counter(word_list)
    top_50_words = counter.most_common(50)
    sql = "INSERT INTO analyze_4 (word, count) VALUES (%s, %s)"
    for word, count in top_50_words:
        cursor.execute(sql, (word.strip(), count))
    # 提交事务
    conn.commit()
    cursor.close()

2.5 搭建flask框架

from flask import Flask,render_template
 
app = Flask(__name__)
app.config['JSON_AS_ASCII'] = False
 
@app.route('/')
def index():
    return render_template('index.html')
 
if __name__ == '__main__':
    app.run(debug=True)

2.6 数据传值

@app.route('/')
def index():
    if not os.path.exists("./static/img/wordcloud.png"):
        wc()
    # 左上图
    sql = 'SELECT name, comments FROM book_v2;'
    cursor = conn.cursor()
    cursor.execute(sql)
    list_1 = cursor.fetchall()
    list_1_data = []
    for i in list_1:
        book_name = i[0]
        comments = int(i[1].replace('全部', '').replace('条', ''))
        list_1_data.append([book_name, comments])
    # 中上图
    sql = 'SELECT book_name, value FROM analyze_1;'
    cursor = conn.cursor()
    cursor.execute(sql)
    list_2 = cursor.fetchall()
    list_2_name = []
    list_2_value = []
    for i in list_2:
        list_2_name.append(i[0])
        list_2_value.append(i[1])
    # 右上图
    sql = 'SELECT name, price FROM book_v2;'
    cursor = conn.cursor()
    cursor.execute(sql)
    list_3 = cursor.fetchall()
    list_3_name = []
    list_3_value = []
    for i in list_3:
        list_3_name.append(i[0])
        list_3_value.append(float(i[1]))
    # 左下图
    sql = 'SELECT ip, value FROM analyze_2 order by value DESC;'
    cursor = conn.cursor()
    cursor.execute(sql)
    list_4 = cursor.fetchall()
    list_4_name = []
    list_4_value = []
    for i in list_4:
        list_4_name.append(i[0])
        list_4_value.append(int(i[1]))
    return render_template('index.html', list_1_data=list_1_data, list_2_name=list_2_name, list_2_value=list_2_value,
                           list_3_name=list_3_name, list_3_value=list_3_value, list_4_name=list_4_name,
                           list_4_value=list_4_value)

2.7 完整代码&数据集获取

完整代码&数据集可以私聊我获取,还有更多可视化大屏等着你:

001 服务大数据可视化监管平台
002 水质情况实时监测预警系统
003 联心菜市场数据中心
004 政务大数据共享交换平台
005 可视化监控管理
006 全国疫情实时监控
007 惠民服务平台
008 兰州智慧消防大数据平台
009 某公司大数据监控平台
010 双数智慧公卫-传染病督导平台
011 大数据可视化系统数据分析通用模版
012 某公司大数据展示模版
013 某公司大数据展示模版
014 时实客流量监控中心
015 广西矿产资源大数据监管平台
016 广西矿产资源大数据监管平台
017 大数据可视化通用素材
018 大数据可视化系统数据分析通用模版
019 大数据可视化系统数据分析通用模版
020 大数据通用模版大标题样式
021 大数据通用模版
022 全息档案平台中心
023 医院大数据展示
024 智慧社区内网比对平台
025 大数据可视化展板通用模板
026 设备环境监测平台
027 全国消费者情况看板
028 移动能耗管理平台
029 南方软件视频平台大屏中心
030 全国图书零售检测中心
031 数据可视化大屏展示系统
032 物流云数据看板平台
033 数据可视化页面设计
034 晋城高速综合管控大数据
035 视频监控前后台通用模板
036 门店销售监控平台
037 建筑智慧工地管控
038 无线网络大数据平台
039 湖南省大数据可视化平台
040 Echart图例使用
041 智慧物流服务中心
042 大数据分析系统
043 网络当天实时发稿量
044 车联网平台数据概览
045 信用风险定位系统(银行版)
046 作战指挥室
047 公司名称大数据可视化平台
048 大数据可视化展板通用模板
049 工厂信息监控台
050 大数据可视化展示平台通用模板
051 通用大数据可视化展示平台模板
052 智慧社区内网比对平台
053 通用大数据可视化展示平台模板
054 公安大数据监控平台2
055 物流大数据服务平台
056 大数据统计展示大屏
057 大屏数据统计
058 大屏数据智慧中心统计
059 物联网平台数据统计
060 广西电子商务公共服务平台大数据中心
061 智慧小区大数据分析
062 数据概览演示案例
063 商品运营大数据
064 设备环境监测平台
065 游戏可视化大数据用户案例
066 系统架构可视化监控
067 xx区智慧旅游综合服务平台
068 中国电信厅店营业效能分析
069 智能看板新中心
070 翼兴消防监控
071 市突发预警平台实时监控
072 大连市突发预警实时监控
073 观测站综合监控平台
074 酒机运行状态
075 数据可视化展示
076 交管大数据人脸识别系统
078 河长制大数据显示平台
079 保税区A仓监控中心
080 北斗车联网大数据平台
081 北京市执法信息平台
082 南方草木商品交易[超级大屏]
083 兴福公安综合监管大屏
084 压力容器大屏
085 车辆综合管控平台
086 物流大数据展示系统
087 农业产业大数据指挥仓系统
088 HTML大数据综合分析平台模板
089 警务综合监控管理平台HTML模板
090 企业营收大数据统计可视化大屏
091 ECharts扩展示例自定义视图
092 酷炫大屏数据可视化模板
093 办税渠道运行状态大数据监控平台
094 大数据统计展示大屏
095 交通大数据展示平台
096 智慧农业大数据展示
097 程序员数据可视化大屏展示
098 销售大数据分析
099 英雄联盟LPL比赛数据可视化
100 新型冠状肺炎实时监测大屏

3、号外

  1. 如果我的博客对你有帮助、如果你喜欢我的博客内容,请 “👍点赞” “✍️评论” “💙收藏” 一键三连哦!
  2. 【👇🏻👇🏻👇🏻关注我| 获取更多源码 | 定制源码】大学生毕设模板、期末大作业模板 、Echarts大数据可视化等! 「一起探讨 ,互相学习」!(vx:python812146)
  3. 以上内容技术相关问题😈欢迎一起交流学习👇🏻👇🏻👇🏻🔥
### 回答1: Python是一种高级编程语言,MySQL是一种流行的关系型数据库,Flask是一个轻量级的Web框架,Echarts是一个强大的数据可视化工具。这些技术可以结合起来,用于开发大屏显示系统,实现数据的可视化展示和实时监控。通过Python编写后端程序,连接MySQL数据库,使用Flask框架搭建Web应用,最后使用Echarts进行数据可视化展示,可以实现高效、灵活、美观的大屏显示效果。 ### 回答2: Python是一种广泛使用的编程语言,其在数据分析、人工智能、Web开发等领域都有广泛应用。其中,Python结合MySQL、FlaskEcharts的使用,能够实现大屏显示,提供高质量的数据可视化和交互效果。 MySQL是一款开源的关系型数据库管理系统,可以用于存储、管理以及处理海量数据。Python的MySQL库可以连接MySQL数据库,进行数据的读取和更新操作。通过Python将MySQL中的数据读取到内存中,结合Flask进行Web应用开发,构建大屏显示界面。同时使用Echarts来进行数据可视化和交互展示,呈现出高效的数据交互效果,实现数据的快速呈现和分析。 在应用方面,Python的MySQL库、FlaskEcharts可以用于实现商业运营、数据报表、大屏监控等功能。例如,用于商业运营时,可以将销售数据从MySQL中读取到Python程序中,运用Echarts展示数据在不同的平台上的销售情况,以此实现数据可视化和跨平台的数据比对。 同样,利用Python的MySQL库、FlaskEcharts实现数据报表可视化效果。数据报表一般要求能够快速呈现关键数据,以及提供数据交互和比对可视化。Python的MySQL库、FlaskEcharts能够快速完成数据获取和展示,同时能够构建数据交互和对比分析功能,为报表提供了实现手段。 另外,Python的MySQL库、FlaskEcharts还可以用于大屏监控方面。例如,在制造行业,采用滚动数据显示方案,将监测器数据实时读取到Python程序中,通过Echarts可视化展示,呈现出数据分析结果并对设备及时进行监测和调整,提高生产效率。 总之,Python的MySQL库、FlaskEcharts能够为数据分析、交互式大屏的开发提供有力的支持,能够快速分析数据,让数据变得更加清晰和可视化。 ### 回答3: Python MySQL Flask Echarts大屏显示是一个将Python编程语言,MySQL数据库,Flask框架和Echarts可视化库相结合,实现数据大屏展示的技术。目前,数据分析可视化已经逐渐成为各个行业必不可少的工具之一。在这种背景下,Python MySQL Flask Echarts大屏显示帮助客户看到服务器日志分析、数据库性能分析、实时数据监控等信息的展示与分析。这个技术可以帮助公司决策者和开发人员更准确地理解现有数据,提高工作效率,改善业务决策。 Python是一种高级语言,它可以通过导入模块扩展其功能。如果你需要连接到数据库,可以使用PyMySQL模块连接MySQL数据库并执行查询。通过使用pandas和numpy等Python库来处理数据,您可以轻松地导入和处理数据。您还可以使用其它尖端的数据科学工具,如SQLAlchemy和Scikit-learn。 Flask是一个轻量级的Web应用程序框架,它是由Python编写的。它提供了一个简单的方法来运行Web服务,并且可以轻松地将其与其他Python库集成,如模板引擎Jinja2、数据库接口SQLAlchemy等等。 Echarts是一个免费的可视化库,它基于JavaScript编写。Echarts提供了多种可视化效果,如柱形图、折线图、饼图等,而且它可以轻松地与其他库集成,例如D3.js等。Python MySQL Flask Echarts大屏显示使用了Echarts图表来帮助用户更好地理解数据,这使得它的效果非常生动、互动、可视化。 总体来说,Python MySQL Flask Echarts大屏显示是一种非常有用的技术,它将开源库和框架结合在一起,使得数据科学家和开发人员更快速有效地工作。无论您在哪个行业,只要有需要进行数据分析可视化的要求,Python MySQL Flask Echarts大屏显示为您提供了一种强大的技术工具,可以帮助您完成您的工作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

跳舞的皮埃尔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值