0


大数据作业:相亲数据的可视化分析(个人)

前言

个人大数据的期末大作业,用python按城市寻找爬取、分析和保存了珍爱网相亲的征婚信息,然后进行数据可视化分析。

一、数据的爬取,分析,清洗与保存

1.数据的爬取

网站来源如下

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

2.数据的分析

1.数据的清洗

分析数据中用到了正则表达式查找筛选指定字符串。但因为珍爱网的每一栏都是采用相同的标签和class,这样就不知道是在哪里结束。所以正则表达式后面加上下一栏标签内的文字,就能分清在哪里结束了。 图1

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

  1. #详情链接
  2. findLink = re.compile(r'<a href="(.*?)" target="_blank">')
  3. #图片的链接
  4. findImgSrc = re.compile(r'<img.*src="(.*?)"',re.S)#re.S 让换行符包含在字符中
  5. #姓名
  6. findName = re.compile(r'<a href="http://album.zhenai.com/u/.*" target="_blank">(.*)</a>')
  7. #性别
  8. findGender = re.compile(r'<span class="grayL">性别:</span>(.*)</td> <td><span class="grayL">居住地:')
  9. #居住地
  10. findPlace = re.compile(r'<span class="grayL">居住地:</span>(.*)</td></tr> <tr><td width="180"><span class="grayL">年龄:')
  11. #年龄
  12. findAge = re.compile(r'<span class="grayL">年龄:</span>(\d*)</td>.*<td><span class="grayL">[月 薪:学&nbsp;&nbsp;&nbsp;历:]')
  13. #月薪
  14. findWage = re.compile(r'<span class="grayL">月 薪:</span>(.*)</td></tr> <tr><td width="180"><span class="grayL">婚况:')
  15. #学历
  16. findDip = re.compile(r'<span class="grayL">学 历:</span>(.*)</td> <!-- --></tr> <tr><td width="180"><span class="grayL">婚况:')
  17. #婚况
  18. findKuang = re.compile(r'<span class="grayL">婚况:</span>(.*)</td> <td width="180"><span class="grayL">身 高:')
  19. #身高
  20. findHeight = re.compile(r'<span class="grayL">身 高:</span>(\d*)</td>')
  21. #信息
  22. findDetails = re.compile(r'<div class="introduce">(.*?)</div>',re.S)
  1. wage = re.findall(findWage, item)
  2. if len(wage) != 0:
  3. wage = wage[0]
  4. data.append(wage)
  5. else:
  6. data.append("未知")
  7. diploma = re.findall(findDip, item)
  8. if len(diploma) != 0:
  9. diploma = diploma[0]
  10. data.append(diploma)
  11. else:
  12. data.append("未知")

2.数据的保存

使用SQLite将数据保存入数据库中,得到结果

  1. def saveData(datalist,dbpath):
  2. init_db(dbpath)
  3. conn = sqlite3.connect(dbpath)
  4. cur = conn.cursor()
  5. for data in datalist:
  6. for index in range(len(data)):
  7. if index == 5 or index == 9:
  8. continue
  9. data[index] = '"'+data[index]+'"'
  10. sql = '''
  11. insert into zhenaizhenghun (
  12. info_link,pic_link,name,gender,place,age,wage,diploma,hun,height,details)
  13. values (%s)'''%",".join(data)
  14. print(sql)
  15. cur.execute(sql)
  16. conn.commit()
  17. cur.close()
  18. conn.close()

二、数据可视化部分

1.前端框架

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

网址:Start Bootstrap

2.写入表格

将数据库的数据写入前端界面中的表格中,代码以及结果如下

  1. <div class="card-body>
  2. <table id="datatablesSimple">
  3. <thead>
  4. <tr>
  5. <th>序号</th>
  6. <th>昵称</th>
  7. <th>图片</th>
  8. <th>性别</th>
  9. <th>居住地</th>
  10. <th>年龄</th>
  11. <th>月薪</th>
  12. <th>学历</th>
  13. <th>婚况</th>
  14. <th>身高</th>
  15. <th>个人简介</th>
  16. </tr>
  17. </thead>
  18. <tfoot>
  19. <tr>
  20. <th>序号</th>
  21. <th>昵称</th>
  22. <th>图片</th>
  23. <th>性别</th>
  24. <th>居住地</th>
  25. <th>年龄</th>
  26. <th>月薪</th>
  27. <th>学历</th>
  28. <th>婚况</th>
  29. <th>身高</th>
  30. <th>个人简介</th>
  31. </tr>
  32. </tfoot>
  33. <tbody>
  34. {% for person in zhenai %}
  35. <tr>
  36. <td>{{ person[0] }}</td>
  37. <td>
  38. <a href="{{ person[1] }}">
  39. {{ person[3] }}
  40. </a>
  41. </td>
  42. <td>
  43. <a href="{{ person[2] }}">
  44. 查看图片
  45. </a>
  46. </td>
  47. <td>{{ person[4] }}</td>
  48. <td>{{ person[5] }}</td>
  49. <td>{{ person[6] }}</td>
  50. <td>{{ person[7] }}</td>
  51. <td>{{ person[8] }}</td>
  52. <td>{{ person[9] }}</td>
  53. <td>{{ person[10] }}</td>
  54. <td>{{ person[11] }}</td>
  55. </tr>
  56. {% endfor %}
  57. </tbody>
  58. </table>
  59. </div>

3.echarts图表实现可视化

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

(1)婚姻状况的可视化代码以及结果

  1. <script type="text/javascript">
  2. var dom = document.getElementById('container');
  3. var myChart = echarts.init(dom, null, {
  4. renderer: 'canvas',
  5. useDirtyRect: false
  6. });
  7. var app = {};
  8. var option;
  9. option = {
  10. title:{
  11. text:'相亲男女婚姻状况'
  12. },
  13. tooltip: {
  14. trigger: 'item'
  15. },
  16. legend: {
  17. top: '5%',
  18. left: 'center'
  19. },
  20. series: [
  21. {
  22. name: 'Access From',
  23. type: 'pie',
  24. radius: ['40%', '70%'],
  25. avoidLabelOverlap: false,
  26. itemStyle: {
  27. borderRadius: 10,
  28. borderColor: '#fff',
  29. borderWidth: 2
  30. },
  31. label: {
  32. show: false,
  33. position: 'center'
  34. },
  35. emphasis: {
  36. label: {
  37. show: true,
  38. fontSize: '40',
  39. fontWeight: 'bold'
  40. }
  41. },
  42. labelLine: {
  43. show: false
  44. },
  45. data: [
  46. { value: {{ num2[0] }}, name: '{{ hun[0] }}' },
  47. { value: {{ num2[1] }}, name: '{{ hun[1] }}' },
  48. { value: {{ num2[2] }}, name: '{{ hun[2] }}' }
  49. ]
  50. }
  51. ]
  52. };
  53. if (option && typeof option === 'object') {
  54. myChart.setOption(option);
  55. }
  56. window.addEventListener('resize', myChart.resize);
  57. </script>

(2)学历分布的代码

  1. <script type="text/javascript">
  2. var dom = document.getElementById('contain');
  3. var myChart = echarts.init(dom, null, {
  4. renderer: 'canvas',
  5. useDirtyRect: false
  6. });
  7. var app = {};
  8. var option;
  9. option = {
  10. title:{
  11. text:'相亲男女学历分布'
  12. },
  13. legend: {
  14. top: 'bottom'
  15. },
  16. toolbox: {
  17. show: true,
  18. feature: {
  19. mark: { show: true },
  20. dataView: { show: true, readOnly: false },
  21. restore: { show: true },
  22. saveAsImage: { show: true }
  23. }
  24. },
  25. series: [
  26. {
  27. name: 'Nightingale Chart',
  28. type: 'pie',
  29. radius: [50, 250],
  30. center: ['50%', '50%'],
  31. roseType: 'area',
  32. itemStyle: {
  33. borderRadius: 6
  34. },
  35. data: [
  36. { value: {{ num1 [0]}}, name: '{{ diploma [0]}}' },
  37. { value: {{ num1 [1]}}, name: '{{ diploma [1]}}' },
  38. { value: {{ num1 [2]}}, name: '{{ diploma [2]}}' },
  39. { value: {{ num1 [3]}}, name: '{{ diploma [3]}}' },
  40. { value: {{ num1 [5]}}, name: '{{ diploma [5]}}' },
  41. { value: {{ num1 [6]}}, name: '{{ diploma [6]}}' }
  42. ]
  43. }
  44. ]
  45. };
  46. if (option && typeof option === 'object') {
  47. myChart.setOption(option);
  48. }
  49. window.addEventListener('resize', myChart.resize);
  50. </script>

(3)年龄分布的可视化代码以及结果

  1. <script type="text/javascript">
  2. var dom = document.getElementById('main');
  3. var myChart = echarts.init(dom, null, {
  4. renderer: 'canvas',
  5. useDirtyRect: false
  6. });
  7. var app = {};
  8. var option;
  9. option = {
  10. title:{
  11. text:'相亲男女年龄分布'
  12. },
  13. color:['#3398DB'],
  14. tooltip:{
  15. trigger:'axis',
  16. axisPointer:{
  17. type:'shadow'
  18. }
  19. },
  20. grid:{
  21. left:'3%',
  22. right:'4%',
  23. containLabel:true
  24. },
  25. xAxis: {
  26. type: 'category',
  27. data: {{ age }}
  28. },
  29. yAxis: {
  30. type: 'value'
  31. },
  32. series: [
  33. {
  34. data:{{ num }},
  35. barWidth:'60%',
  36. type: 'bar'
  37. }
  38. ]
  39. };
  40. if (option && typeof option === 'object') {
  41. myChart.setOption(option);
  42. }
  43. window.addEventListener('resize', myChart.resize);
  44. </script>


本文转载自: https://blog.csdn.net/qq_63245028/article/details/130365418
版权归原作者 软件193 mayunhai 所有, 如有侵权,请联系我们删除。

“大数据作业:相亲数据的可视化分析(个人)”的评论:

还没有评论