当前位置:   article > 正文

python实现数据爬取-清洗-持久化存储-数据平台可视化

python爬虫+数据清洗+数据存储mysql 项目

 基于python对淘宝模特个人信息进行筛选爬取,数据清洗,持久化写入mysql数据库.使用django对数据库中的数据信息筛选并生成可视化报表进行分析。


数据爬取,筛选,存库:

  1. # -*- coding:utf-8 -*-
  2.  
  3. import requests
  4. from bs4 import BeautifulSoup
  5. import sys
  6. import re
  7. reload(sys)
  8. sys.setdefaultencoding('utf-8')
  9. import MySQLdb
  10. import chardet
  11. conn= MySQLdb.connect(
  12.         host='localhost',
  13.         port = 数据库端口,
  14.         user='root',
  15.         passwd='数据库密码
  16.         db ='xxnlove',
  17. charset='utf8'
  18.         )
  19. cur = conn.cursor()
  20. cur.execute("create table model(name text(225),age varchar(10),blood varchar(10),school text(225),height varchar(10),weight varchar(10),Measurements text(225),cup varchar(20),location text(225))ENGINE=InnoDB DEFAULT CHARSET=utf8;")
  21. #CREATE DATABASE gmtdb DEFAULT CHARACTER SET utf8mb4;
  22. for num in range(521,1314):
  23.     try:
  24.         URL = 'http://mm.taobao.com/json/request_top_list.htm?page=%d' % num
  25.         #print "现在爬取的网站url是:" + URL
  26.         response = requests.get(URL) 
  27.         response.encoding = 'gb2312'
  28.         text = response.text 
  29.         soup = BeautifulSoup(text, 'lxml') 
  30.         for model in soup.select(".list-item"):
  31.             try:
  32.                 model_id =  model.find('span', {'class': 'friend-follow J_FriendFollow'})['data-userid']
  33.                 json_url = "http://mm.taobao.com/self/info/model_info_show.htm?user_id=%d" % int(model_id)
  34.                 response_json = requests.get(json_url)
  35.                 response_json.encoding = 'gb2312'
  36.                 text_response_json = response_json.text
  37.                 soup_json = BeautifulSoup(text_response_json, 'lxml')
  38.                 
  39.                 #print "***********************************" + model.find('a', {'class': 'lady-name'}).string + "*********************************"
  40.                 #print "模特的名字:" + model.find('a', {'class': 'lady-name'}).string
  41.                 name = model.find('a', {'class': 'lady-name'}).string
  42.                 #print "模特的年龄:"+ model.find('p', {'class': 'top'}).em.strong.string
  43. age =  model.find('p', {'class': 'top'}).em.strong.string
  44. blood =  soup_json.find_all('li', {'class': 'mm-p-cell-right'})[1].span.string
  45.                # if blood is None:
  46.                #     blood = "None"
  47. school = soup_json.find_all('li')[5].span.string
  48. height = soup_json.find('li', {'class': 'mm-p-small-cell mm-p-height'}).p.string
  49. weight = soup_json.find('li', {'class': 'mm-p-small-cell mm-p-weight'}).p.string
  50. Measurements = soup_json.find('li', {'class': 'mm-p-small-cell mm-p-size'}).p.string
  51. location = model.find('p', {'class': 'top'}).span.string
  52. cup =  soup_json.find('li', {'class': 'mm-p-small-cell mm-p-bar'}).p.string
  53. sqli="insert into model values(%s,%s,%s,%s,%s,%s,%s,%s,%s)"
  54. cur.execute(sqli,(name,age,blood,school,height,weight,Measurements,cup,location))
  55.                 #print "罩杯:" + soup_json.find('li', {'class': 'mm-p-small-cell mm-p-bar'}).p.string
  56.                 '''
  57.                 print "生日:" + soup_json.find('li', {'class''mm-p-cell-left'}).span.string
  58.                 blood =  soup_json.find_all('li', {'class''mm-p-cell-right'})[1].span.string
  59.                 if blood is None:
  60.                     blood = "无"
  61.                 print "血型:" + blood
  62.                 print "学校/专业:" + soup_json.find_all('li')[5].span.string
  63.                 print "身高:" + soup_json.find('li', {'class''mm-p-small-cell mm-p-height'}).p.string
  64.                 print "体重:" + soup_json.find('li', {'class''mm-p-small-cell mm-p-weight'}).p.string
  65.                 print "三围:" + soup_json.find('li', {'class''mm-p-small-cell mm-p-size'}).p.string
  66.                 print "罩杯:" + soup_json.find('li', {'class''mm-p-small-cell mm-p-bar'}).p.string
  67.                 print "鞋码:" + soup_json.find('li', {'class''mm-p-small-cell mm-p-shose'}).p.string
  68.                 print "模特所在地:"+ model.find('p', {'class''top'}).span.string
  69.                 print "模特的id:"+ model.find('span', {'class''friend-follow J_FriendFollow'})['data-userid']
  70.                 print "模特的标签:"+ model.find_all('p')[1].em.string
  71.                 print "模特的粉丝数:"+ model.find_all('p')[1].strong.string
  72.                 print "模特的排名:"+ [text for text in model.find('div', {'class''popularity'}).dl.dt.stripped_strings][0]
  73.                 print model.find('ul', {'class''info-detail'}).get_text(" ",strip=True)
  74.                 print "模特的个人资料页面:" +"http:"+ model.find('a', {'class''lady-name'})['href']              
  75.                 print "模特的个人作品页面:" +"http:"+ model.find('a', {'class''lady-avatar'})['href']
  76.                 print "模特的个人头像:" + "http:" + model.find('img')['src']
  77.                 print "***********************************" + model.find('a', {'class''lady-name'}).string + "*********************************"
  78.                 print "\n"
  79. '''
  80.             except:
  81.                 print "error"
  82.     except:
  83.         print num + "page is error"
  84. cur.close()
  85. conn.commit()
  86. conn.close()

数据库结构:

wKioL1mDThXiix5PAABmL_GIHYs978.png-wh_50

写入数据库中的模特记录数量:

wKioL1mDTzzTc9gwAAAUQ_tL46Q631.png-wh_50

写入数据库中模特信息部分图:

wKioL1mDTrHBY4rjAADhw2PBofA828.png-wh_50


django 实现图表展示:

  1. #coding:utf-8
  2. # Create your views here.
  3. from django.shortcuts import render,render_to_response
  4. from django.http import HttpResponse,HttpResponseRedirect
  5. import MySQLdb
  6. import sys
  7. import re
  8. import json
  9. import jieba
  10. from operator import itemgetter
  11. from pytagcloud import create_tag_image, make_tags
  12. import random
  13. import time 
  14. import smtplib
  15. from email.mime.text import MIMEText
  16. reload(sys)
  17. sys.setdefaultencoding('utf-8')
  18. conn= MySQLdb.connect(
  19.         host='localhost',
  20.         port = 端口,
  21.         user='root',
  22.         passwd='密码',
  23.         db ='xxnlove',
  24.     charset='utf8'
  25.         )
  26. def receive_message(request):
  27.     if request.method == 'POST':
  28.         name = request.POST['name']
  29.         email = request.POST['email']
  30.         subject = request.POST['subject']
  31.         message = request.POST['message']
  32.         cur = conn.cursor()
  33.         sql = "insert into message values(%s,%s,%s,%s)"
  34.         cur.execute(sql,(name,email,subject,message))
  35.         cur.close()
  36.         conn.commit()
  37.         conn.close()  
  38.         return render_to_response('index.html')   
  39. def send_email(request):
  40.     _user = "961769710@qq.com"
  41.     _pwd  = "**************"
  42.     _to   = "961769710@qq.com"
  43.     msg = MIMEText("Test")
  44.     msg["Subject"] = "don't panic"
  45.     msg["From"]    = _user
  46.     msg["To"]      = _to
  47.     try:
  48.         s = smtplib.SMTP_SSL("smtp.qq.com"465)
  49.         s.login(_user, _pwd)
  50.         s.sendmail(_user, _to, msg.as_string())
  51.         s.quit()
  52.         return HttpResponse("邮件发送成功")
  53.     except smtplib.SMTPException,e:
  54.         return HttpResponse("Falied,%s"%e )
  55. def create_pictures(request):
  56.     cur = conn.cursor()
  57.     sql = "select school  from model "
  58.     cur.execute(sql)
  59.     rows = cur.fetchall()
  60.     cur.close()
  61.     conn.commit()
  62.     conn.close()
  63.     fclist = []
  64.     for row in rows:
  65.         fclist.append(row[0].encode("utf-8"))
  66.     fcstr = " ".join(fclist)
  67.     wg = jieba.cut_for_search(fcstr)
  68.     wd = {}
  69.     nonsense = [u"我的"u"什么"u"你好"]
  70.     for w in wg:
  71.         if len(w) < 2:
  72.             continue
  73.         elif w in nonsense:
  74.             continue
  75.         try:
  76.             str(w)
  77.             continue
  78.         finally:
  79.             if w not in wd:
  80.                 wd[w] = 1
  81.             else:
  82.                 wd[w] += 1
  83.     swd = sorted(wd.iteritems(), key=itemgetter(1), reverse=True)
  84.     swd = swd[1:100]
  85.     tags = make_tags(swd,maxsize = 100)
  86.     create_tag_image(tags,
  87.                  './modles/static/1.jpg',
  88.                  #background=(0, 0, 0, 255),
  89.                  size=(500300),
  90.                  fontname="STKAITI")
  91. #    cur.close()
  92. #    conn.commit()
  93. #    conn.close()
  94.     return render(request,'index.html')
  95. def cloud(request):
  96.     return render(request,'cloud.html')
  97. def index(request):
  98.     return render(request,'index.html')
  99. def search(request):
  100.     if request.method == 'POST':
  101.         modelname = request.POST['name']    
  102. sql = "select * from model where name='%s'" % modelname
  103. cur = conn.cursor()
  104. try:
  105.     search = cur.execute(sql)
  106.     info = cur.fetchmany(search)
  107.     name = info[0][0]
  108.     age  = info[0][1]
  109.     school = info[0][3]
  110.     school =  ''.join(school.split())
  111.     height = info[0][4]
  112.     weight = info[0][5]
  113.     Measurements = info[0][6]
  114.     return render(request, 'index.html', {'name': name,'age': age,'school':school,'height':height,'weight':weight,'Measurements':Measurements})
  115. except:
  116.     prompt = "sorry: 数据库中没有  "+modelname+"   这个模特的信息"
  117.     return render(request, 'index.html', {'prompt': prompt})
  118. cur.close()
  119. conn.commit()
  120. conn.close()
  121.     else:
  122.         return HttpResponse('提交的方式不是post')
  123. def show(request):
  124.     cur = conn.cursor()
  125.     agedata = []
  126.     category = []
  127.     for i in range(10,40):
  128. category.append(i)
  129.         age = i
  130.         sql = "select count(*) from model where age='%s'" % age
  131.         age = cur.execute(sql)
  132.         i = int(cur.fetchmany(age)[0][0])
  133.         agedata.append(i)
  134.     return render(request,'show.html',{'category':category,'agedata':agedata})
  135.     cur.close()
  136.     conn.commit()
  137.     conn.close()
  138. def area(request):
  139.     cur = conn.cursor()
  140.     citydict = {'jianxi':'南昌市|赣州市|上饶市|吉安市|九江市|新余市|抚>州市|宜春市|景德镇市|萍乡市|鹰潭市|江西',
  141. 'beijin':'北京',
  142. 'guangdong':'东莞市|广州市|中山市|深圳市|惠州市|江门市|珠海市|汕头市|佛山市|湛江市|河源市|肇庆市|清远市|潮州市|韶关市|揭阳市|阳江市|梅州市|云浮市|茂名市|汕尾市|广东',
  143. 'shandong':'济南市|青岛市|临沂市|济宁市|菏泽市|烟台市|淄博市|泰安市|潍坊市|日照市|威海市|滨州市|东营市|聊城市|德州市|莱芜市|枣庄市|山东',
  144. 'jiangsu':'苏州市|徐州市|盐城市|无锡市|南京市|南通市|连云港市|常州市|镇江市|扬州市|淮安市|泰州市|宿迁市',   'henan':'郑州市|南阳市|新乡市|安阳市|洛阳市|信阳市|平顶山市|周口市|商丘市|开封市|焦作市|驻马店市|濮阳市|三门峡市|漯河市|许昌市|鹤壁市|济源市|河南',
  145. 'shanghai':'松江区|宝山区|金山区|嘉定区|南汇区|青浦区|>浦东新区|奉贤区|徐汇区|静安区|闵行区|黄浦区|杨浦区|虹口区|普陀区|闸北区|长宁区|崇明县|卢湾区|上海',
  146. 'hebei''石家庄市|唐山市|保定市|邯郸市|邢台市|河北区|沧州市|秦皇岛市|张家口市|衡水市|廊坊市|承德市|河北',
  147. 'zhejiang':'温州市|宁波市|杭州市|台州市|嘉兴市|金华市|>湖州市|绍兴市|舟山市|丽水市|衢州市|浙江',
  148. 'shanxi':'西安市|咸阳市|宝鸡市|汉中市|渭南市|安康市|榆>林市|商洛市|延安市|铜川市|陕西',
  149. 'hunan':'长沙市|邵阳市|常德市|衡阳市|株洲市|湘潭市|永州市|岳阳市|怀化市|郴州市|娄底市|益阳市|张家界市|湘西州|湖南',
  150. 'chongqing':'江北区|渝北区|沙坪坝区|九龙坡区|万州区|永川市|南岸区|酉阳县|北碚区|涪陵区|秀山县|巴南区|渝中区|石柱县|忠县|合川市|大渡口区|开县|长寿区|荣昌县|云阳县|梁平县|潼南县|江津市|彭水县|綦江县|璧山县|黔江区|大足县|巫山县|巫溪县|垫江县|丰都县|武隆县|万盛区|铜梁县|南川市|奉节县|双桥区|城口县|重庆',
  151. 'fujian':'漳州市|厦门市|泉州市|福州市|莆田市|宁德市|三明市|南平市|龙岩市|福建',
  152. 'tianjin':'和平区|北辰区|河北区|河西区|西青区|津南区|东丽区|武清区|宝坻区|红桥区|大港区|汉沽区|静海县|塘沽区|宁河县|蓟县|南开区|河东区|天津',
  153. 'yunnan':'昆明市|红河州|大理州|文山州|德宏州|曲靖市|昭通市|楚雄州|保山市|玉溪市|丽江地区|临沧地区|思茅地区|西双版纳州|怒江州|迪庆州|云南',
  154. 'sichuan':'成都市|绵阳市|广元市|达州市|南充市|德阳市|广安市|阿坝州|巴中市|遂宁市|内江市|凉山州|攀枝花市|乐山市|自贡市|泸州市|雅安市|宜宾市|资阳市|眉山市|甘孜州|四川',
  155. 'guangxi':'贵港市|玉林市|北海市|南宁市|柳州市|桂林市|梧州市|钦州市|来宾市|河池市|百色市|贺州市|崇左市|防城港市|广西',
  156. 'anhui':'安徽|芜湖市|合肥市|六安市|宿州市|阜阳市|安庆市|马鞍山市|蚌埠市|淮北市|淮南市|宣城市|黄山市|铜陵市|亳州市|池州市|巢湖市|滁州市',
  157. 'hainan':'三亚市|海口市|琼海市|文昌市|东方市|昌江县|陵水县|乐东县|保亭县|五指山市|澄迈县|万宁市|儋州市|临高县|白沙县|定安县|琼中县|屯昌县|海南',
  158. 'jiangxi':'南昌市|赣州市|上饶市|吉安市|九江市|新余市|抚州市|宜春市|景德镇市|萍乡市|鹰潭市|江西',
  159. 'hubei':'武汉市|宜昌市|襄樊市|荆州市|恩施州|黄冈市|孝感市|十堰市|咸宁市|黄石市|仙桃市|天门市|随州市|荆门市|潜江市|鄂州市|神农架林区|湖北',
  160. 'shanxi2':'太原市|大同市|运城市|长治市|晋城市|忻州市|临汾市|吕梁市|晋中市|阳泉市|朔州市|山西',
  161. 'liaoning':'大连市|沈阳市|丹东市|辽阳市|葫芦岛市|锦州市|朝阳市|营口市|鞍山市|抚顺市|阜新市|盘锦市|本溪市|铁岭市|辽宁',
  162. 'taiwan':'台北市|高雄市|台中市|新竹市|基隆市|台南市|嘉义市|台湾',
  163. 'heilongjiang':'齐齐哈尔市|哈尔滨市|大庆市|佳木斯市|双鸭山市|牡丹江市|鸡西市|黑河市|绥化市|鹤岗市|伊春市|大兴安岭地区|七台河市|黑龙江',
  164. 'neimenggu':'赤峰市|包头市|通辽市|呼和浩特市|鄂尔多斯市|乌海市|呼伦贝尔市|兴安盟|巴彦淖尔盟|乌兰察布盟|锡林郭勒盟|阿拉善盟|内蒙古',
  165. 'guizhou':'贵阳市|黔东南州|黔南州|遵义市|黔西南州|毕节地区|铜仁地区|安顺市|六盘水市',
  166. 'gansu':'兰州市|天水市|庆阳市|武威市|酒泉市|张掖市|陇南地区|白银市|定西地区|平凉市|嘉峪关市|临夏回族自治州|金昌市|甘南州|甘肃',
  167. 'qinghai':'西宁市|海西州|海东地区|海北州|果洛州|玉树州|黄南藏族自治州|青海',
  168. 'xinjiang':'乌鲁木齐市|伊犁州|昌吉州|石河子市|哈密地区|阿克苏地区|巴音郭楞州|喀什地区|塔城地区|克拉玛依市|和田地区|阿勒泰州|吐鲁番地区|阿拉尔市|博尔塔拉州|五家渠市|克孜勒苏州|图木舒克市|新疆',
  169. 'xizang':'拉萨市|山南地区|林芝地区|日喀则地区|阿里地区|昌都地区|那曲地区|西藏',
  170. 'jiling':'吉林市|长春市|白山市|延边州|白城市|松原市|辽源市|通化市|四平市|吉林',
  171. 'ningxia':'银川市|吴忠市|中卫市|石嘴山市|固原市|宁夏'
  172.     }
  173.     numdict = {}
  174.     for key in citydict :
  175. sql = "select count(*) from model where location REGEXP  '%s'" % citydict[key]
  176. city = cur.execute(sql)
  177. num  = int(cur.fetchmany(city)[0][0])
  178. numdict[key] = num
  179.     return render(request, 'area.html',{'jianxi':numdict['jianxi'],'beijin':numdict['beijin'],'guangdong':numdict['guangdong'],'shandong':numdict['shandong'],'jiangsu':numdict['jiangsu'],'henan':numdict['henan'],'shanghai':numdict['shanghai'],'hebei':numdict['hebei'],'zhejiang':numdict['zhejiang'],'shanxi':numdict['shanxi'],'hunan':numdict['hunan'],'chongqing':numdict['chongqing'],'fujian':numdict['fujian'],'tianjin':numdict['tianjin'],'yunnan':numdict['yunnan'],'sichuan':numdict['sichuan'],'guangxi':numdict['guangxi'],'anhui':numdict['anhui'],'hainan':numdict['hainan'],'jiangxi':numdict['jiangxi'],'hubei':numdict['hubei'],'shanxi2':numdict['shanxi2'],'liaoning':numdict['liaoning'],'taiwan':numdict['taiwan'],'heilongjiang':numdict['heilongjiang'],'neimenggu':numdict['neimenggu'],'guizhou':numdict['guizhou'],'gansu':numdict['gansu'],'qinghai':numdict['qinghai'],'xinjiang':numdict['xinjiang'],'xizang':numdict['xizang'],'jiling':numdict['jiling'],'ningxia':numdict['ningxia']})
  1. {% load staticfiles %}
  2. <!DOCTYPE html>
  3. <html>
  4. <head>    
  5.     <meta charset="utf-8">    
  6.     <title>Charts demo</title>  
  7.     <script src="{% static "js/echarts.js" %}"></script>
  8.     <script src="{% static "js/china.js" %}"></script>
  9.     <script src="https://code.jquery.com/jquery-3.1.1.min.js"></script>
  10.   
  11. </head>    
  12. <body>    
  13.   
  14.     <div id="main" style="height:600px;"></div>   
  15.     <script type="text/javascript">    
  16.   
  17.                 var myChart = echarts.init(document.getElementById('main'));  
  18.                 option = {
  19.                     title : {
  20.                         text: '淘宝模特所在省份分部情况',
  21.                         subtext: '',
  22.                         x:'center'
  23.                     },
  24.                     tooltip : {
  25.                         trigger: 'item'
  26.                     },
  27.                     legend: {
  28.                         orient: 'vertical',
  29.                         x:'left',
  30.                         data:['']
  31.                     },
  32.                     dataRange: {
  33.                         min: 0,
  34.                         max: 2500,
  35.                         x: 'left',
  36.                         y: 'bottom',
  37.                         text:['高','低'],           // 文本,默认为数值文本
  38.                         calculable : true
  39.                     },
  40.                     toolbox: {
  41.                         show: true,
  42.                         orient : 'vertical',
  43.                         x: 'right',
  44.                         y: 'center',
  45.                         feature : {
  46.                             mark : {show: true},
  47.                             dataView : {show: true, readOnly: false},
  48.                             restore : {show: true},
  49.                             saveAsImage : {show: true}
  50.                         }
  51.                     },
  52.                     roamController: {
  53.                         show: true,
  54.                         x: 'right',
  55.                         mapTypeControl: {
  56.                             'china': true
  57.                         }
  58.                     },
  59.                     series : [
  60.                         {
  61.                             name: '人数',
  62.                             type: 'map',
  63.                             mapType: 'china',
  64.                             roam: false,
  65.                             itemStyle:{
  66.                                 normal:{label:{show:true}},
  67.                                 emphasis:{label:{show:true}}
  68.                             },
  69.                             data:[
  70.                                 {name: '北京',value: {{ beijin }}},
  71.                                 {name: '江西',value: {{ jianxi }}},
  72.                                 {name: '广东',value: {{ guangdong }}},
  73.                                 {name: '山东',value: {{ shandong }}},
  74.                                 {name: '江苏',value: {{ jiangsu }}},
  75.                                 {name: '河南',value: {{ henan }}},
  76.                                 {name: '上海',value: {{ shanghai }}},
  77.                                 {name: '河北',value: {{ hebei }}},
  78.                                 {name: '浙江',value: {{ zhejiang }}},
  79.                                 {name: '陕西',value: {{ shanxi }}},
  80.                                 {name: '湖南',value: {{ hunan }}},
  81.                                 {name: '重庆',value: {{ chongqing }}},
  82.                                 {name: '福建',value: {{ fujian }}},
  83.                                 {name: '天津',value: {{ tianjin }}},
  84.                                 {name: '云南',value: {{ yunnan }}},
  85.                                 {name: '四川',value: {{ sichuan }}},
  86.                                 {name: '广西',value: {{ guangxi }}},
  87.                                 {name: '安徽',value: {{ anhui }}},
  88.                                 {name: '海南',value: {{ hainan }}},
  89.                                 {name: '江西',value: {{ jiangxi }}},
  90.                                 {name: '湖北',value: {{ hubei }}},
  91.                                 {name: '山西',value: {{ shanxi2 }}},
  92.                                 {name: '辽宁',value: {{ liaoning }}},
  93.                                 {name: '台湾',value: {{ taiwan }}},
  94.                                 {name: '黑龙江',value: {{ heilongjiang }}},
  95.                                 {name: '贵州',value: {{ guizhou }}},
  96.                                 {name: '甘肃',value: {{ gansu }}},
  97.                                 {name: '青海',value: {{ qinghai }}},
  98.                                 {name: '新疆',value: {{ xinjiang }}},
  99.                                 {name: '西藏',value: {{ xizang }}},
  100.                                 {name: '吉林',value: {{ jiling }}},
  101.                                 {name: '宁夏',value: {{ ningxia }}},
  102.                                 {name: '内蒙古',value: {{ neimenggu }}},
  103.                               
  104.                             ]
  105.                         }
  106.                     ]
  107.                 };
  108.                 myChart.setOption(option);                     
  109.   
  110.           
  111.     </script>    
  112.   
  113. </body>
  114. </html>
  1. {% load staticfiles %}
  2. <!DOCTYPE html>
  3. <head>
  4.     <meta charset="utf-8">
  5.     <title>动态数据展示</title>
  6. </head>
  7. <body>
  8.     <!-- 为ECharts准备一个具备大小(宽高)的Dom -->
  9.     <div id="main" style="height:400px"></div>
  10.     <!-- ECharts单文件引入 -->
  11.     <script src="http://echarts.baidu.com/build/dist/echarts.js"></script>
  12.     <script type="text/javascript">
  13.         // 路径配置
  14.         require.config({
  15.             paths: {
  16.                 echarts'http://echarts.baidu.com/build/dist'
  17.             }
  18.         });
  19.         
  20.         // 使用
  21.         require(
  22.             [
  23.                 'echarts',
  24.                 'echarts/chart/bar' // 使用柱状图就加载bar模块,按需加载
  25.             ],
  26.             function (ec) {
  27.                 // 基于准备好的dom,初始化echarts图表
  28.                 var myChart = ec.init(document.getElementById('main')); 
  29.                 var option = {
  30.                     tooltip: {
  31.                         showtrue
  32.                     },
  33.                     legend: {
  34.         color:'#0000FF',
  35.                         data:['模特年龄']
  36.                     },
  37.                     xAxis : [
  38.                         {
  39.                             type : 'category',
  40.       data : {{ category }}
  41.                         }
  42.                     ],
  43.                     yAxis : [
  44.                         {
  45.                             type : 'value'
  46.                         }
  47.                     ],
  48.                     series : [
  49.                         {
  50.                             "name":"模特年龄",
  51.                             "type":"bar",
  52.                             "data":{{ agedata  }}
  53.                         }
  54.                     ]
  55.                 };
  56.         
  57.                 // 为echarts对象加载数据 
  58.                 myChart.setOption(option); 
  59.             }
  60.         );
  61.     </script>
  62. </body>

网站首页:

wKiom1mDVp2hfXN0ABPLdF45jqM777.png-wh_50

wKioL1mDVp3jYhbxAACYv1H08vc655.png-wh_50

wKiom1mDVqODt8eiAAvxE08wkQk915.png-wh_50

提交的信息会写入数据库中:

wKiom1mDXrKTXgs4AAAxE8LhOTE976.png-wh_50

模特年龄正态分布情况:

wKiom1mDV97COrtKAABQ7DzjMnc778.png-wh_50

首先对信息进行分词处理,然后排序,选取出现频率最高的前100个词。

wKioL1mDV7qBwA9OAAdJuL8pNrs066.png-wh_50

这个花了我很多时间,要解决echarts地图只精确到省或者直辖市,而我爬取到的数据可能是具体的某一个地方市名,针对这个问题:我首先找了一下各省下面的市都有哪些,sql语句使用正则匹配想要获取的信息。我创建了个字典存放省名和下属的市名。另外创建个字典存放省名和匹配到的人数。

wKioL1mDV7vQAdEzAAHNHMtc9Bs608.png-wh_50

简单小结:这里面涉及到的知识点还挺多的:

爬虫:我使用的requests和beautiful这俩库。

数据库:使用的是mysql,涉及到数据库编码,sql查询,模糊匹配,python对数据库的操作,中文显示乱码的问题。

词云:jieba进行分词,pytagcloud用来生成词云。

django:views、templates、static 、url,因为我用的MySQLdb,所以没有使用django自身的ORM(models),这样我觉得更灵活。

前端展示:bootstrap(主要用来做网站的布局)和echarts(进行图表展示和数据分析用)。






声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号