先上兩張圖:

十一熱門景點前10景點分布(mark點標(biāo)注)
樣本數(shù)據(jù)間的方差貌似有點大。。點與點之間的差別確實有點大。。
本不是搞統(tǒng)計學(xué)或者數(shù)據(jù)挖掘的,只是一個不稱職的小前端,所以請忽略下文中不嚴(yán)謹(jǐn)?shù)慕y(tǒng)計方法:)

1500個熱門景點的分布圖(有的點確實很小..)
前幾天就在簡書上看到一篇關(guān)于十一黃金周旅游熱點分布的爬蟲+數(shù)據(jù)可視化的文章,一時興趣,覺得學(xué)了一段時間爬蟲了自己也可以做,所以就花了點時間做了這個項目。爬蟲用的是python+scrapy框架,數(shù)據(jù)庫存儲使用的mongodb,數(shù)據(jù)可視化用的是js+echarts。

首先,我們需要獲取數(shù)據(jù),選取某哪兒旅游網(wǎng)站作為爬取對象,經(jīng)過一頓分析后開始動手寫爬蟲代碼,說實話這個網(wǎng)站的頁面結(jié)構(gòu)比較規(guī)整,爬起來也比較方便順手。。分析獲取下一頁鏈接的方法(好幾種方法,也可以用selenium)。
try:
current_page = selector.xpath('//div[@id="pager-container"]/div/em/text()').extract()[0]
except:
return
yield Request(url='http://piao.qunar.com/ticket/list.htm?keyword=%E4%B8%AD%E5%9B%BD&page='+str(int(current_page)+1),callback=self.parse)

選取的范圍是爬蟲熱門景點的前100頁,每個頁面15個,共1500個景點。爬取的數(shù)據(jù)存放到本地的mongodb中。業(yè)務(wù)邏輯很簡單,代碼就沒有必要再貼上來了。。。爬蟲成果:


爬到數(shù)據(jù)后就是數(shù)據(jù)可視化的過程了。之前寫過一兩個echarts的頁面,所以寫起來也比較快了。首先可以先做一個熱門景點的排行情況的圖,參考的指標(biāo)是網(wǎng)站中每個景點的售出票的數(shù)量,然后進行排序,將mongodb中的數(shù)據(jù)處理成“景點名-xxx,售票數(shù)量-xxx”這樣的對應(yīng)關(guān)系如下圖:

之后就是對echarts的的配置項進行設(shè)置,篩選出前20名的熱門景點。配置項series如下
series : [
{
"name":"熱門景點排行榜",
"type":"bar",
"data":data.sort(function(a,b){
return b.value-a.value
}).slice(0,21).sort(function(a,b){
return a.value-b.value
}),
itemStyle : { normal: {label : {show: true,position: 'right',fontSize:18}}}
}
]
先來一個條形圖:

條形圖比較直觀的反映出排行的情況。
再從另外一個角度分析下,來看看每個省份的熱門景點各有多少。簡單的進行處理數(shù)據(jù),然后用條形圖展示:

可以看到排名前三的分別是四川、陜西和福建。
同樣的處理方法,我們也可以對城市的熱門景點進行統(tǒng)計,統(tǒng)計結(jié)果如下:

如果不考慮統(tǒng)計學(xué)原理,只為了好玩,還可以將這前10名的信息匯總成餅狀圖:

熱門景點最多的省份-廣東。

家鄉(xiāng)河南熱門景點有63個:)

熱門景點最多的城市-北京。

鄭州居然有16個熱門景點。。沒想到
再就是開頭的那兩張圖了,之前公司做過類似姓氏遷徙的echarts圖表(遷徙的圖比單純的地圖分布的圖表要復(fù)雜的多。。還要考慮數(shù)據(jù)量大影響渲染性能的問題,跟著公司大牛學(xué)了不少),配置項熟悉了后,進行配置。
地圖除了每個點及點對應(yīng)的值,還需要點對應(yīng)的坐標(biāo),所以我們需要兩組數(shù)據(jù),一組是值得集合,一種是坐標(biāo)的集合。值的集合:
var data = [{
"name": "稻城亞丁",
"value": 17857
}, {
"name": "秦始皇陵博物院(兵馬俑)",
"value": 12571
}, {
"name": "鼓浪嶼",
"value": 4346
}, {
"name": "天門山國家森林公園",
"value": 4145
},
坐標(biāo)的集合:
var geoCoordMap = {
"稻城亞丁": [100.324691, 28.540034],
"秦始皇陵博物院(兵馬俑)": [109.266029, 34.386024],
"鼓浪嶼": [118.073486, 24.452261],
"天門山國家森林公園": [110.482089, 29.072408],
"頤和園": [116.276887, 39.999497],
"故宮": [116.403347, 39.922148],
"八達嶺長城": [116.03293, 40.369733],
"布達拉宮": [91.125491, 29.660076],
"長隆野生動物世界": [113.335765, 23.0003],
"黃山風(fēng)景區(qū)": [118.193977, 30.097967],
"長隆水上樂園": [113.331236, 23.005835],
...
地圖的配置:
var convertData = function (data) {
var res = [];
for (var i = 0; i < data.length; i++) {
var geoCoord = geoCoordMap[data[i].name];
if (geoCoord) {
res.push({
name: data[i].name,
value: geoCoord.concat(data[i].value)
});
}
}
return res;
};
option = {
backgroundColor: '#404a59',
title: {
text: '十一黃金周熱門旅游景點分布圖',
left: 'center',
top:50,
textStyle: {
color: '#fff',
fontSize:24
}
},
tooltip: {
trigger: 'item'
},
legend: {
orient: 'vertical',
y: 'bottom',
x: 'right',
data: ['pm2.5'],
textStyle: {
color: '#fff'
}
},
geo: {
map: 'china',
label: {
emphasis: {
show: false
}
},
roam: true,
itemStyle: {
normal: {
areaColor: '#323c48',
borderColor: '#111'
},
emphasis: {
areaColor: '#2a333d'
}
}
},
tooltip:{
trigger: 'item',
formatter:function(params) { //自定義tooltip
console.log(params)
var res = params.name+'<br/>';
var myseries = option.series;
for(var j=0;j<myseries[0].data.length;j++){
if(myseries[0].data[j].name==params.name){
res+='人氣值' +' : '+myseries[0].data[j].value[2]+'</br>';
}
}
return res;
}
},
series: [{
name: '熱門景點',
type: 'scatter',
coordinateSystem: 'geo',
data: convertData(data),
symbolSize: function (val) {
return val[2] / 600;
},
label: {
normal: {
formatter: '',
position: 'down',
show: false
},
emphasis: {
show: true
}
},
itemStyle: {
normal: {
color: '#ddb926'
}
}
},
{
name: 'Top 10',
type: 'effectScatter',
coordinateSystem: 'geo',
data: convertData(data.sort(function (a, b) {
return b.value - a.value;
}).slice(0, 11)),
symbolSize: function (val) {
return val[2] / 600;
},
showEffectOn: 'render',
rippleEffect: {
brushType: 'stroke'
},
hoverAnimation: true,
label: {
normal: {
formatter: '',
position: 'right',
show: false
}
},
itemStyle: {
normal: {
color: '#f4e925',
shadowBlur: 10,
shadowColor: '#333'
}
},
zlevel: 1
}
]
};
然后得到分布圖:

以上就是所有可視化的展示內(nèi)容。
后記:
斷斷續(xù)續(xù)學(xué)習(xí)python爬蟲快兩個月了,也寫了幾個爬蟲的項目:91圖片(大概2w多張)、騰訊公益《活著》活動的展示頁(大概6k張圖片)、天堂網(wǎng)(公司讓爬的。。也不知道要這些數(shù)據(jù)有何用)大概2w多的有效用戶信息、逼乎(水管太小,只爬了大概3w多的用戶信息先作罷)、網(wǎng)易云音樂(爬接口爬了1w多用戶)。現(xiàn)在簡單的爬蟲可以說是應(yīng)付得來了,但是至于分布式隊列,上redis那一套也只是試驗了試驗并沒有深入的爬取,像redis上億數(shù)據(jù)量去重優(yōu)化(加布隆過濾器)這種技術(shù)點沒有深入學(xué)習(xí)只是那別人的直接用(主要還是redis和內(nèi)存優(yōu)化這些之前都沒接觸過),究竟里邊的坑有多深還不得而知,日后肯定要再繼續(xù)學(xué)習(xí)。