爬蟲簡單分析十一熱門旅游景點分布

先上兩張圖:

十一熱門景點前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í)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容