模板户:专注于dede模板,织梦源码,织梦模板,网站模板,dedecms模板,网站源码,dedecms教程以及各类手机网站模板和企业网站模板分享.

织梦模板

VIP

CMS教程

站长学院

随机织梦教程

最新织梦教程

织梦模板随机Tags

关键词排名 原创 用户体验 玩具外贸网站源码 关键词优化 搜索引擎 汽车配件织梦模板 网站title 太阳能光伏网站源码 网站 财务会计网站源码 餐饮管理织梦模板 餐饮加盟网站源码 关键词 汽车润滑油网站源码 蜘蛛 优化 织梦伪静态 高亮 个人网站

Python爬虫&可视化第1季-城市旅游数据分析

www.mobanhu.com / 2019-03-15 08:14:40
徐麟 Python爱好者社区

作者:徐麟,数据分析师,就职于上海唯品会。热爱数据挖掘和分析,喜欢用R、Python玩点不一样的数据。

个人公众号:数据森麟(微信ID:shujusenlin)


前言:


本着跟大家一同探讨学习的态度,今后几期文章会更新一些用python实现爬虫&可视化的文章。Python对于本人来讲也是一个在逐渐学习掌握的过程,这次的内容就从旅游开始讲起,进入正文前首先附(fang)上(du)最令我垂涎欲滴的海鲜盛宴。



数据爬取:


最近几天朋友圈被大家的旅行足迹刷屏了,惊叹于那些把全国所有省基本走遍的朋友。与此同时,也萌生了写一篇旅行相关的内容,本次数据来源于一个对于爬虫十分友好的旅行攻略类网站:蚂蜂窝


PART1:获得城市编号


蚂蜂窝中的所有城市、景点以及其他的一些信息都有一个专属的5位数字编号,我们第一步要做的就是获取城市(直辖市+地级市)的编号,进行后续的进一步分析。


以上两个页面就是我们的城市编码来源,需要首先从目的地页面获得各省编码,之后进入各省城市列表获得编码。过程中需要Selenium进行动态数据爬取,部分代码如下:


  1. def find_cat_url(url):  

  2.    headers = {User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64; rv:23.0) Gecko/20100101 Firefox/23.0}      

  3.    req=request.Request(url,headers=headers)  

  4.    html=urlopen(req)  

  5.    bsObj=BeautifulSoup(html.read(),"html.parser")

  6.    bs = bsObj.find(div,attrs={class:hot-list clearfix}).find_all(dt)

  7.    cat_url = []

  8.    cat_name = []

  9.    for i in range(0,len(bs)):

  10.        for j in range(0,len(bs[i].find_all(a))):

  11.            cat_url.append(bs[i].find_all(a)[j].attrs[href])

  12.            cat_name.append(bs[i].find_all(a)[j].text)

  13.    cat_url = [http://www.mafengwo.cn+cat_url[i] for i in range(0,len(cat_url))]  

  14.    return cat_url



  15. def find_city_url(url_list):

  16.    city_name_list = []

  17.    city_url_list = []

  18.    for i in range(0,len(url_list)):            

  19.        driver = webdriver.Chrome()

  20.        driver.maximize_window()

  21.        url = url_list[i].replace(travel-scenic-spot/mafengwo,mdd/citylist)

  22.        driver.get(url)

  23.        while True:

  24.            try:

  25.                time.sleep(2)

  26.                bs = BeautifulSoup(driver.page_source,html.parser)

  27.                url_set = bs.find_all(a,attrs={data-type:目的地})

  28.                city_name_list = city_name_list +[url_set[i].text.replace( ,).split()[0] for i in range(0,len(url_set))]

  29.                city_url_list = city_url_list+[url_set[i].attrs[data-id] for i in range(0,len(url_set))]                

  30.                js="var q=document.documentElement.scrollTop=800"  

  31.                driver.execute_script(js)

  32.                time.sleep(2)

  33.                driver.find_element_by_class_name(pg-next).click()

  34.            except:

  35.                break

  36.        driver.close()

  37.    return city_name_list,city_url_list






  38. url = http://www.mafengwo.cn/mdd/

  39. url_list = find_cat_url(url)

  40. city_name_list,city_url_list=find_city_url(url_list)

  41. city = pd.DataFrame({city:city_name_list,id:city_url_list})


PART2:获得城市信息


城市数据分别从以下几个页面获取:


(a)小吃页面



(b)景点页面



(c)标签页面



我们将每个城市获取数据的过程封装成函数,每次传入之前获得的城市编码,部分代码如下:


复制编辑


  1. def get_city_info(city_name,city_code):

  2.    this_city_base = get_city_base(city_name,city_code)

  3.    this_city_jd = get_city_jd(city_name,city_code)

  4.    this_city_jd[city_name] = city_name

  5.    this_city_jd[total_city_yj] = this_city_base[total_city_yj]

  6.    try:

  7.        this_city_food = get_city_food(city_name,city_code)

  8.        this_city_food[city_name] = city_name

  9.        this_city_food[total_city_yj] = this_city_base[total_city_yj]

  10.    except:

  11.        this_city_food=pd.DataFrame()

  12.    return this_city_base,this_city_food,this_city_jd





  13. def get_city_base(city_name,city_code):

  14.    url = http://www.mafengwo.cn/xc/+str(city_code)+/

  15.    bsObj = get_static_url_content(url)

  16.    node =  bsObj.find(div,{class:m-tags}).find(div,{class:bd}).find_all(a)

  17.    tag = [node[i].text.split()[0] for i in range(0,len(node))]

  18.    tag_node = bsObj.find(div,{class:m-tags}).find(div,{class:bd}).find_all(em)

  19.    tag_count = [int(k.text) for k in tag_node]

  20.    par = [k.attrs[href][1:3] for k in node]

  21.    tag_all_count = sum([int(tag_count[i]) for i in range(0,len(tag_count))])

  22.    tag_jd_count = sum([int(tag_count[i]) for i in range(0,len(tag_count)) if par[i]==jd])

  23.    tag_cy_count = sum([int(tag_count[i]) for i in range(0,len(tag_count)) if par[i]==cy])

  24.    tag_gw_yl_count = sum([int(tag_count[i]) for i in range(0,len(tag_count)) if par[i] in [gw,yl]])

  25.    url = http://www.mafengwo.cn/yj/+str(city_code)+/2-0-1.html

  26.    bsObj = get_static_url_content(url)  

  27.    total_city_yj = int(bsObj.find(span,{class:count}).find_all(span)[1].text)

  28.    return {city_name:city_name,tag_all_count:tag_all_count,tag_jd_count:tag_jd_count,

  29.            tag_cy_count:tag_cy_count,tag_gw_yl_count:tag_gw_yl_count,

  30.            total_city_yj:total_city_yj}



  31. def get_city_food(city_name,city_code):

  32.    url = http://www.mafengwo.cn/cy/+str(city_code)+/gonglve.html

  33.    bsObj = get_static_url_content(url)

  34.    food=[k.text for k in bsObj.find(ol,{class:list-rank}).find_all(h3)]

  35.    food_count=[int(k.text) for k in bsObj.find(ol,{class:list-rank}).find_all(span,{class:trend})]

  36.    return pd.DataFrame({food:food[0:len(food_count)],food_count:food_count})



  37. def get_city_jd(city_name,city_code):

  38.    url = http://www.mafengwo.cn/jd/+str(city_code)+/gonglve.html

  39.    bsObj = get_static_url_content(url)

  40.    node=bsObj.find(div,{class:row-top5}).find_all(h3)

  41.    jd = [k.text.split( )[2] for k in node]

  42.    node=bsObj.find_all(span,{class:rev-total})

  43.    jd_count=[int(k.text.replace( 条点评,)) for k in node]

  44.    return pd.DataFrame({jd:jd[0:len(jd_count)],jd_count:jd_count})


数据分析:


PART1:城市数据

首先我们看一下游记数量最多的TOP10城市:


游记数量TOP10数量基本上与我们日常所了解的热门城市相符,我们进一步根据各个城市游记数量获得全国旅行目的地热力图:



看到这里,是不是有种似曾相识的感觉,如果你在朋友圈晒的足迹图与这幅图很相符,那么说明蚂蜂窝的数据与你不谋而合。


最后我们看一下大家对于各个城市的印象是如何的,方法就是提取标签中的属性,我们将属性分为了休闲、饮食、景点三组,分别看一下每一组属性下大家印象最深的城市:


看来对于蚂蜂窝的用户来说,厦门给大家留下的印象是非常深的,不仅游记数量充足,并且能从中提取的有效标签也非常多。重庆、西安、成都也无悬念的给吃货们留下了非常深的印象,部分代码如下:


  1. bar1 = Bar("餐饮类标签排名")

  2. bar1.add("餐饮类标签分数", city_aggregate.sort_values(cy_point,0,False)[city_name][0:15],

  3.         city_aggregate.sort_values(cy_point,0,False)[cy_point][0:15],

  4.         is_splitline_show =False,xaxis_rotate=30)


  5. bar2 = Bar("景点类标签排名",title_top="30%")

  6. bar2.add("景点类标签分数", city_aggregate.sort_values(jd_point,0,False)[city_name][0:15],

  7.         city_aggregate.sort_values(jd_point,0,False)[jd_point][0:15],

  8.         legend_top="30%",is_splitline_show =False,xaxis_rotate=30)


  9. bar3 = Bar("休闲类标签排名",title_top="67.5%")

  10. bar3.add("休闲类标签分数", city_aggregate.sort_values(xx_point,0,False)[city_name][0:15],

  11.         city_aggregate.sort_values(xx_point,0,False)[xx_point][0:15],

  12.         legend_top="67.5%",is_splitline_show =False,xaxis_rotate=30)


  13. grid = Grid(height=800)

  14. grid.add(bar1, grid_bottom="75%")

  15. grid.add(bar2, grid_bottom="37.5%",grid_top="37.5%")

  16. grid.add(bar3, grid_top="75%")

  17. grid.render(城市分类标签.html)


PART2:景点数据


我们提取了各个景点评论数,并与城市游记数量进行对比,分别得到景点评论的绝对值和相对值,并据此计算景点的人气、代表性两个分数,最终排名TOP15的景点如下:


蚂蜂窝网友对于厦门真的是情有独钟,鼓浪屿也成为了最具人气的景点,在城市代表性方面西塘古镇和羊卓雍措位列前茅。小长假来临之际,如果担心上排的景点人太多,不妨从下排的景点中挖掘那些人少景美的旅游地。


PART3:小吃数据


最后我们看一下大家最关注的的与吃相关的数据,处理方法与PART2景点数据相似,我们分别看一下最具人气和最具城市代表性的小吃


出乎意料,蚂蜂窝网友对厦门果真爱得深沉,让沙茶面得以超过火锅、烤鸭、肉夹馍跻身最具人气的小吃。在城市代表性方面,海鲜的出场频率非常高,这点与大(ben)家(ren)的认知也不谋而合,PART2与3的部分代码如下:


  1. bar1 = Bar("景点人气排名")

  2. bar1.add("景点人气分数", city_jd_com.sort_values(rq_point,0,False)[jd][0:15],

  3.         city_jd_com.sort_values(rq_point,0,False)[rq_point][0:15],

  4.         is_splitline_show =False,xaxis_rotate=30)


  5. bar2 = Bar("景点代表性排名",title_top="55%")

  6. bar2.add("景点代表性分数", city_jd_com.sort_values(db_point,0,False)[jd][0:15],

  7.         city_jd_com.sort_values(db_point,0,False)[db_point][0:15],

  8.         is_splitline_show =False,xaxis_rotate=30,legend_top="55%")


  9. grid=Grid(height=800)

  10. grid.add(bar1, grid_bottom="60%")

  11. grid.add(bar2, grid_top="60%",grid_bottom="10%")

  12. grid.render(景点排名.html)

Python爱好者社区历史文章大合集

Python爱好者社区历史文章列表(每周append更新一次)

福利:文末扫码立刻关注公众号,“Python爱好者社区”开始学习Python课程

关注后在公众号内回复课程即可获取

小编的Python入门免费视频课程!!!

【最新免费微课】小编的Python快速上手matplotlib可视化库!!!

崔老师爬虫实战案例免费学习视频。

陈老师数据分析报告制作免费学习视频。

玩转大数据分析!Spark2.X+Python 精华实战课程免费学习视频。


    发送中

    本文由AB模板网:织梦模板整理发布, 转载请说明出处:https://www.mobanhu.com
    随机站长资讯
    高级精美的家私企业网站源码 家私家纺类网
    农业绿色生态水果企业dede源码
    驾校类企业网站源码 驾校网站模板
    绿色LED灯管类织梦源码 照明企业网站模板
    蓝色通用织梦博客模板 资讯文章类网站源码
    红色大气装饰公司织梦源码 建筑装修装潢企
    网站建设企业模板 互联网网络营销类网站源
    html5响应式手机自适应网站模板(兼容手机
    黑色HTML5工作室网络公司网站整站模板(适
    简洁大气网站建设网络设计类企业织梦模板
    html5+css3高端网站建设工作室源码 酷炫的h
    红灰色大气网络工作室织梦模板
    织梦dedecms幻灯片模糊解决办法
    织梦dedecms巧用标签实现图片自动Alt功能,
    织梦dedecms文章列表循环标签增加notypeid
    织梦dedecms专题模板应用分析及使用案例
    dedecms织梦让二级栏目标题去除“/”斜杠和
    关于出现“对不起,您安装的不是正版应用..
    Discuz(Can not write to cache files)有关
    Discuz通过修改文章标题更好的实现SEO的方
    DiscuzX中存在不合法的文件被上传的修复方
    关于Discuz x3.1页面空白解决方法
    通用营销工业机械展示型企业织梦模板 电子
    简洁外贸公司电子科技产品网站源码 白色织
    蓝色大气的通信类电子科技企业通用网站源码
    娱乐多媒体类企业公司织梦模板 娱乐设备网
    高端大气数码产品电子类企业源码模板
    高级精美的家私企业网站源码 家私家纺类网
    农业绿色生态水果企业dede源码
    驾校类企业网站源码 驾校网站模板
    绿色LED灯管类织梦源码 照明企业网站模板
    蓝色通用织梦博客模板 资讯文章类网站源码
    红色大气装饰公司织梦源码 建筑装修装潢企
    网站建设企业模板 互联网网络营销类网站源
    html5响应式手机自适应网站模板(兼容手机
    黑色HTML5工作室网络公司网站整站模板(适
    简洁大气网站建设网络设计类企业织梦模板
    html5+css3高端网站建设工作室源码 酷炫的h
    红灰色大气网络工作室织梦模板
    织梦dedecms幻灯片模糊解决办法
    织梦dedecms巧用标签实现图片自动Alt功能,
    织梦dedecms文章列表循环标签增加notypeid
    织梦dedecms专题模板应用分析及使用案例
    dedecms织梦让二级栏目标题去除“/”斜杠和
    最新站长资讯
    高级精美的家私企业网站源码 家私家纺类网
    农业绿色生态水果企业dede源码
    驾校类企业网站源码 驾校网站模板
    绿色LED灯管类织梦源码 照明企业网站模板
    蓝色通用织梦博客模板 资讯文章类网站源码
    红色大气装饰公司织梦源码 建筑装修装潢企
    网站建设企业模板 互联网网络营销类网站源
    html5响应式手机自适应网站模板(兼容手机
    黑色HTML5工作室网络公司网站整站模板(适
    简洁大气网站建设网络设计类企业织梦模板
    html5+css3高端网站建设工作室源码 酷炫的h
    红灰色大气网络工作室织梦模板
    织梦dedecms幻灯片模糊解决办法
    织梦dedecms巧用标签实现图片自动Alt功能,
    织梦dedecms文章列表循环标签增加notypeid
    织梦dedecms专题模板应用分析及使用案例
    dedecms织梦让二级栏目标题去除“/”斜杠和
    关于出现“对不起,您安装的不是正版应用..
    Discuz(Can not write to cache files)有关
    Discuz通过修改文章标题更好的实现SEO的方
    DiscuzX中存在不合法的文件被上传的修复方
    关于Discuz x3.1页面空白解决方法
    通用营销工业机械展示型企业织梦模板 电子
    简洁外贸公司电子科技产品网站源码 白色织
    蓝色大气的通信类电子科技企业通用网站源码
    娱乐多媒体类企业公司织梦模板 娱乐设备网
    高端大气数码产品电子类企业源码模板
    高级精美的家私企业网站源码 家私家纺类网
    农业绿色生态水果企业dede源码
    驾校类企业网站源码 驾校网站模板
    绿色LED灯管类织梦源码 照明企业网站模板
    蓝色通用织梦博客模板 资讯文章类网站源码
    红色大气装饰公司织梦源码 建筑装修装潢企
    网站建设企业模板 互联网网络营销类网站源
    html5响应式手机自适应网站模板(兼容手机
    黑色HTML5工作室网络公司网站整站模板(适
    简洁大气网站建设网络设计类企业织梦模板
    html5+css3高端网站建设工作室源码 酷炫的h
    红灰色大气网络工作室织梦模板
    织梦dedecms幻灯片模糊解决办法
    织梦dedecms巧用标签实现图片自动Alt功能,
    织梦dedecms文章列表循环标签增加notypeid
    织梦dedecms专题模板应用分析及使用案例
    dedecms织梦让二级栏目标题去除“/”斜杠和
    关于出现“对不起,您安装的不是正版应用..
    Discuz(Can not write to cache files)有关
    Discuz通过修改文章标题更好的实现SEO的方
    DiscuzX中存在不合法的文件被上传的修复方
    关于Discuz x3.1页面空白解决方法
    首页 免费源码 VIP专区 会员中心
    收缩