相亲数据可视化分析系统

2023-11-15

前言 

本文用python按城市寻找爬取、分析和保存了珍爱网上相亲男女的征婚信息,然后进行数据可视化分析。作者水平不高,第一次写文章,如果有错误,还望各位大佬指出,谢谢。

一、爬取、分析并保存数据

1.爬取数据

分析网址可知,最终地址由基本网址加上城市加上页数组成。

 

由于城市数量太多,作者只收集了部分城市的数据。把收集的城市存为一个列表。页数一共有1-6页。用基本网址加上城市再加上页数。

def getDate(baseurl):
    datalist = []
    citylist = ['beijing/'
     ,'shanghai/','tianjin/','changchun/','shijiazhuang/','lanzhou/','xining/',
     'xian/','zhengzhou/','jinan/','taiyuan/','hefei/','changsha/','wuhan/','nanjing/','chengdu/','guiyang/','kunming/',
     'hangzhou/','nanchang/','guangzhou/','fuzhou/'
                ]
    for i in citylist:          
        url1 = baseurl + i
        for j in range(1,7):
             url = url1 + str(j)
             html = askURL(url)      

2.分析数据

(1)正则表达

分析数据中用到了正则表达式查找筛选指定字符串。

但是开始的时候匹配出来的表达式总是出来一大串,甚至中间的html标签都出来了。后来发现是因为珍爱网的每一栏都是采用相同的标签和class,这样就不知道是在哪里结束。

 所以正则表达式后面加上下一栏标签内的文字,就能分清在哪里结束了。

#详情链接
findLink = re.compile(r'<a href="(.*?)" target="_blank">')
#图片的链接
findImgSrc = re.compile(r'<img.*src="(.*?)"',re.S)#re.S 让换行符包含在字符中
#姓名
findName = re.compile(r'<a href="http://album.zhenai.com/u/.*" target="_blank">(.*)</a>')
#性别
findGender = re.compile(r'<span class="grayL">性别:</span>(.*)</td> <td><span class="grayL">居住地:')
#居住地
findPlace = re.compile(r'<span class="grayL">居住地:</span>(.*)</td></tr> <tr><td width="180"><span class="grayL">年龄:')
#年龄
findAge = re.compile(r'<span class="grayL">年龄:</span>(\d*)</td>.*<td><span class="grayL">[月   薪:学&nbsp;&nbsp;&nbsp;历:]')
#月薪
findWage = re.compile(r'<span class="grayL">月   薪:</span>(.*)</td></tr> <tr><td width="180"><span class="grayL">婚况:')
#学历
findDip = re.compile(r'<span class="grayL">学   历:</span>(.*)</td> <!-- --></tr> <tr><td width="180"><span class="grayL">婚况:')
#婚况
findKuang = re.compile(r'<span class="grayL">婚况:</span>(.*)</td> <td width="180"><span class="grayL">身   高:')
#身高
findHeight = re.compile(r'<span class="grayL">身   高:</span>(\d*)</td>')
#信息
findDetails = re.compile(r'<div class="introduce">(.*?)</div>',re.S)

(2)数据清洗

相亲男女的其他各栏属性都相同,但是有一栏,男士对应的是月薪,女士对应的是学历。所以可以分开处理。男士的学历和女士的月薪就标记为“未知”。

                wage = re.findall(findWage, item)
                if len(wage) != 0:
                    wage = wage[0]
                    data.append(wage)
                else:
                    data.append("未知")
                diploma = re.findall(findDip, item)
                if len(diploma) != 0:
                    diploma = diploma[0]
                    data.append(diploma)
                else:
                    data.append("未知")

(3)保存数据

然后就可以将数据保存入数据库中了,这里作者使用的是 SQLite数据库。SQLite是一种轻量级数据库,也不需要配置,使用起来非常方便。

def saveData(datalist,dbpath):
    init_db(dbpath)
    conn = sqlite3.connect(dbpath)
    cur = conn.cursor()

    for data in datalist:
        for index in range(len(data)):
            if index == 5 or index == 9:
                continue
            data[index] = '"'+data[index]+'"'
        sql = '''
            insert into zhenaizhenghun (
            info_link,pic_link,name,gender,place,age,wage,diploma,hun,height,details)
            values (%s)'''%",".join(data)
        print(sql)
        cur.execute(sql)
        conn.commit()
    cur.close()
    conn.close()

存入数据后结果如下:

 二、数据可视化部分

1.前端框架

前端框架采用的是Start Bootstrap上面的模板,下载好想要的模板直接使用就可以了。

网址:https://startbootstrap.com/

2.写入表格

将数据库的数据写入前端界面中的表格中,部分代码如下:

<div class="card-body>
	<table id="datatablesSimple">
		<thead>
            <tr>
                <th>序号</th>
                <th>昵称</th>
                <th>图片</th>
                <th>性别</th>
                <th>居住地</th>
                <th>年龄</th>
                <th>月薪</th>
                <th>学历</th>
                <th>婚况</th>
                <th>身高</th>
                <th>个人简介</th>
           </tr>
        </thead>
        <tfoot>
            <tr>
                <th>序号</th>
                <th>昵称</th>
                <th>图片</th>
                <th>性别</th>
                <th>居住地</th>
                <th>年龄</th>
                <th>月薪</th>
                <th>学历</th>
                <th>婚况</th>
                <th>身高</th>
                <th>个人简介</th>
            </tr>
        </tfoot>
        <tbody>
            {% for person in zhenai %}
            <tr>
                <td>{{ person[0] }}</td>
                <td>
                    <a href="{{ person[1] }}">
                        {{ person[3] }}
                    </a>
                </td>
                <td>
                    <a href="{{ person[2] }}">
                        查看图片              
                    </a>
                </td>
                <td>{{ person[4] }}</td>
                <td>{{ person[5] }}</td>
                <td>{{ person[6] }}</td>
                <td>{{ person[7] }}</td>
                <td>{{ person[8] }}</td>
                <td>{{ person[9] }}</td>
                <td>{{ person[10] }}</td>
                <td>{{ person[11] }}</td>
            </tr>
            {% endfor %}
        </tbody>
    </table>
</div>

 结果如下: 

3.echarts图表

可视化去echarts官网选用合适的图表,然后复制JS代码,将数据库的数据写入。

(1)相亲男女年龄分布 

代码如下:

  <script type="text/javascript">
    var dom = document.getElementById('main');
    var myChart = echarts.init(dom, null, {
      renderer: 'canvas',
      useDirtyRect: false
    });
    var app = {};

    var option;

    option = {
  title:{
    text:'相亲男女年龄分布'
  },
  color:['#3398DB'],
  tooltip:{
    trigger:'axis',
    axisPointer:{
      type:'shadow'
    }
  },
  grid:{
    left:'3%',
    right:'4%',
    containLabel:true
  },
  xAxis: {
    type: 'category',
    data: {{ age }}
  },
  yAxis: {
    type: 'value'
  },
  series: [
    {
      data:{{ num }},
      barWidth:'60%',
      type: 'bar'
    }
  ]
};

    if (option && typeof option === 'object') {
      myChart.setOption(option);
    }

    window.addEventListener('resize', myChart.resize);
  </script>

 结果如下:

(2)相亲男女学历分布

代码如下: 

  <script type="text/javascript">
    var dom = document.getElementById('contain');
    var myChart = echarts.init(dom, null, {
      renderer: 'canvas',
      useDirtyRect: false
    });
    var app = {};

    var option;

    option = {
        title:{
    text:'相亲男女学历分布'
  },
  legend: {
    top: 'bottom'
  },
  toolbox: {
    show: true,
    feature: {
      mark: { show: true },
      dataView: { show: true, readOnly: false },
      restore: { show: true },
      saveAsImage: { show: true }
    }
  },
  series: [
    {
      name: 'Nightingale Chart',
      type: 'pie',
      radius: [50, 250],
      center: ['50%', '50%'],
      roseType: 'area',
      itemStyle: {
        borderRadius: 6
      },
      data: [
          { value: {{ num1 [0]}}, name: '{{ diploma [0]}}' },
          { value: {{ num1 [1]}}, name: '{{ diploma [1]}}' },
          { value: {{ num1 [2]}}, name: '{{ diploma [2]}}' },
          { value: {{ num1 [3]}}, name: '{{ diploma [3]}}' },
          { value: {{ num1 [5]}}, name: '{{ diploma [5]}}' },
          { value: {{ num1 [6]}}, name: '{{ diploma [6]}}' }
      ]
    }
  ]
};

    if (option && typeof option === 'object') {
      myChart.setOption(option);
    }

    window.addEventListener('resize', myChart.resize);
  </script>

(3)相亲男女婚姻状况

 代码如下:

<script type="text/javascript">
    var dom = document.getElementById('container');
    var myChart = echarts.init(dom, null, {
      renderer: 'canvas',
      useDirtyRect: false
    });
    var app = {};

    var option;

    option = {
        title:{
    text:'相亲男女婚姻状况'
  },
  tooltip: {
    trigger: 'item'
  },
  legend: {
    top: '5%',
    left: 'center'
  },
  series: [
    {
      name: 'Access From',
      type: 'pie',
      radius: ['40%', '70%'],
      avoidLabelOverlap: false,
      itemStyle: {
        borderRadius: 10,
        borderColor: '#fff',
        borderWidth: 2
      },
      label: {
        show: false,
        position: 'center'
      },
      emphasis: {
        label: {
          show: true,
          fontSize: '40',
          fontWeight: 'bold'
        }
      },
      labelLine: {
        show: false
      },
      data: [
        { value: {{ num2[0] }}, name: '{{ hun[0] }}' },
          { value: {{ num2[1] }}, name: '{{ hun[1] }}' },
          { value: {{ num2[2] }}, name: '{{ hun[2] }}' }
      ]
    }
  ]
};

    if (option && typeof option === 'object') {
      myChart.setOption(option);
    }

    window.addEventListener('resize', myChart.resize);
  </script>

结果如下:

3.词云

网址:http://amueller.github.io/word_cloud/ 

结果如下:

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

相亲数据可视化分析系统 的相关文章

随机推荐

  • Python3,好看的外(shen)表(cai)千篇一律,炫彩的日志万里挑一。

    炫彩日志输出 1 引言 2 代码实战 2 1 库介绍 2 2 库安装 2 3 代码示例 2 3 1 demo 2 3 2 实战 3 总结 1 引言 小屌丝 鱼哥 我今天被炫到了 小鱼 怎么了 你还能被旋到了 小屌丝对啊 被炫到了 很不是滋味
  • [PyTorch][chapter 34][池化层与采样]

    前言 这里主要讲解一下卷积神经网络中的池化层与采样 目录 DownSample Max pooling avg pooling upsample ReLu 1 DownSample 下采样 间隔一定行或者列进行采样 达到降维效果 早期LeN
  • 七日杀unity报错_七日杀游戏闪退及各种游戏报错解决攻略全解

    七日杀是一款人称的丧尸生存类游戏 现在有非常多的游戏都是丧尸生存题材的 但是要找到比较精品的游戏 我还是推荐大家玩这款 这里跟大家分享一下七日杀游戏闪退及各种游戏报错解决攻略全解 大家如果有遇到问题可以来这里寻找答案 一 游戏崩溃 暂无解决
  • Docker中elasticsearch的安装

    Docker中elasticsearch的安装 相关安装资料链接 链接 https pan baidu com s 1mnf4MH49myglW lvPzm2ew 提取码 h97u 安装elasticsearch 1 下载镜像 docker
  • SpringBoot整合ShardingJdbc实现XA分布式事务

    SpringBoot整合ShardingJdbc实现XA分布式事务 什么是分布式事务 关于分布式事务的介绍 请参考ShardingJdbc的介绍 分布式事务 官方文档分布式事务使用示例 使用示例 点进去之后 拉到最下面即可看到 官方exam
  • synchronized底层源码

    一 synchronized的使用场景 synchronized一般使用在下面这几种场景 修饰代码块 指定一个加锁的对象 给对象加锁 public Demo1 Object lock new Object public void test1
  • IDEA GIT工具窗口中 点击提交记录无法查看提交文件的解决

    问题描述 点击提交记录 想要看到提交的文件 期待效果 问题解决 将如图所示的分隔线下拉即可 原因是视图覆盖了 附加一个IDEA工具的技巧 如果工具窗口中没有git 或者 不小心把 git 右键 Remove From Sidebar 了 可
  • TCP/IP详解 卷1:协议 学习笔记 第十五章 TFTP:简单文件传送协议

    TFTP最初打算用于引导无盘系统 通常是工作站或X终端 为保持简单和短小 TFTP使用UDP 它适合只读存储器 开始工作时 TFTP的客户与服务器交换信息 客户发送一个读或写请求给服务器 在一个无盘系统进行引导的正常情况下 第一个请求是读请
  • Qtp自动测试工具

    简介 QTP是Quick Test Professional的简称 是一种自动测试工具 使用QTP的目的是想用它来执行重复的自动化测试 主要是用于回归测试和测试同一软件的新版本 因此你在测试前要考虑好如何对应用程序进行测试 例如要测试哪些功
  • vue路由跳转及其ajax请求,Vue中的路由以及ajax

    Vue请求ajax之fetch 使用方法 fetch url headers token localStorage getItem token content type apllication xxx urlencoded methods
  • AD20/Altium designer——如何对元器件进行批量命名、一键编号

    本文将介绍如何对元器件进行命名 节省项目时间 Let s go 1 选中要一键命名的元器件 选中方法有 Ctrl A全选 鼠标左键长按后框选 Shift长按 鼠标左键单击 2 依次点开 工具 标注 原理图标注 3 按需设置 4 按图操作 5
  • 几种前后端接口的对比:RESTful,GraphQL,APIJSON

    转载地址https blog csdn net kikajack article details 79075405 REST 和 GraphQL 的对比 APIJSON 和 GraphQL 的对比 REST 核心理念是资源 服务端定义资源形
  • 惊了!7 行代码优雅地实现 Excel 文件导出功能?

    点击蓝色 小哈学Java 关注我哟 加个 星标 第一时间获取小哈推送的文章哦 目录 一 前言 二 Apache poi jxl 的缺陷 三 阿里出品的 EasyExcel 安利一波 四 EasyExcel 解决了什么 五 快速上手 六 特殊
  • JavaScript三大组成部分

    总所周知 JavaScript是一种专为网页交互而设计的一种脚本语言 有下列三种不同的组成部分 1 ECMAScript 由ECMA 262定义 规定了一种脚本语言实现应该包含的内容 提供核心语言功能 2 文档对象模型 DOM 提供访问和操
  • 若依前后端分离版项目名称的修改

    若依前后端分离项目名修改 在自主学习若依项目的时候 想着能不能把项目的名称改成自己的项目名然后再进行开发 在网上找了些资料但是都不全面 总有些漏掉的步骤导致项目启动失败 经过不断的倒腾 也发现了问题所在 直接上图记录吧 去若依官网下载前后端
  • python12 函数进阶

    python 12 函数进阶 1 函数返回值 1 1 函数返回值 什么是函数返回值 返回就是从函数内部传递到函数外部的数据 python中的每个函数都有可以传递一个数据到函数的外部 如何确定一个函数的返回值 怎么在函数的内部传递到函数的外部
  • 【若依】开源框架学习笔记05 - 角色权限

    文章目录 一 概述 二 功能实现 1 使用方式 2 Spring Security 配置 3 权限处理逻辑 一 概述 本文主要整理了若依框架中角色权限 即菜单权限 的功能实现 页面功能位于 系统管理 gt 角色管理 gt 修改 角色权限一般
  • PostgreSql服务器的配置

    PostgreSQL最早是由UC Berkley大学计算机系开发的 当初由 Michael Stonebraker 教授领导的 Postgre 项目 是由高级防务研究项目局 Defense Advanced Research Project
  • 硬盘读写测试软件搜集

    一 diskspd Diskspd 是一个微软开源的磁盘性能基准测试工具 其基于命令行界面 有非常多的测试参数可用 很强大 名称 内容 开发语言 C 界面框架 无 在cmd中执行命令 代码量 1万行 支持系统 Windows 官网地址 ht
  • 相亲数据可视化分析系统

    前言 本文用python按城市寻找爬取 分析和保存了珍爱网上相亲男女的征婚信息 然后进行数据可视化分析 作者水平不高 第一次写文章 如果有错误 还望各位大佬指出 谢谢 一 爬取 分析并保存数据 1 爬取数据 分析网址可知 最终地址由基本网址