作者 |徐麟

来源 | 数据森麟

一、前言

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

二、数据爬取

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

PART1:获得城市编号

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

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

def find_cat_url(url):      headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:23.0) Gecko/20100101 Firefox/23.0'}          req=request.Request(url,headers=headers)      html=urlopen(req)      bsObj=BeautifulSoup(html.read(),"html.parser")    bs = bsObj.find('div',attrs={'class':'hot-list clearfix'}).find_all('dt')    cat_url = []    cat_name = []    for i in range(0,len(bs)):        for j in range(0,len(bs[i].find_all('a'))):            cat_url.append(bs[i].find_all('a')[j].attrs['href'])            cat_name.append(bs[i].find_all('a')[j].text)    cat_url = ['http://www.mafengwo.cn'+cat_url[i] for i in range(0,len(cat_url))]      return cat_urldef find_city_url(url_list):    city_name_list = []    city_url_list = []    for i in range(0,len(url_list)):                    driver = webdriver.Chrome()        driver.maximize_window()        url = url_list[i].replace('travel-scenic-spot/mafengwo','mdd/citylist')        driver.get(url)        whileTrue:            try:                time.sleep(2)                bs = BeautifulSoup(driver.page_source,'html.parser')                url_set = bs.find_all('a',attrs={'data-type':'目的地'})                city_name_list = city_name_list +[url_set[i].text.replace('\n','').split()[0] for i in range(0,len(url_set))]                city_url_list = city_url_list+[url_set[i].attrs['data-id'] for i in range(0,len(url_set))]                                js="var q=document.documentElement.scrollTop=800"                  driver.execute_script(js)                time.sleep(2)                driver.find_element_by_class_name('pg-next').click()            except:                break        driver.close()    return city_name_list,city_url_listurl = 'http://www.mafengwo.cn/mdd/'url_list = find_cat_url(url)city_name_list,city_url_list=find_city_url(url_list)city = pd.DataFrame({'city':city_name_list,'id':city_url_list})PART2:获得城市信息城市数据分别从以下几个页面获取:(a)小吃页面(b)景点页面(c)标签页面我们将每个城市获取数据的过程封装成函数,每次传入之前获得的城市编码,部分代码如下:复制编辑def get_city_info(city_name,city_code):    this_city_base = get_city_base(city_name,city_code)    this_city_jd = get_city_jd(city_name,city_code)    this_city_jd['city_name'] = city_name    this_city_jd['total_city_yj'] = this_city_base['total_city_yj']    try:        this_city_food = get_city_food(city_name,city_code)        this_city_food['city_name'] = city_name        this_city_food['total_city_yj'] = this_city_base['total_city_yj']    except:        this_city_food=pd.DataFrame()    return this_city_base,this_city_food,this_city_jddef get_city_base(city_name,city_code):    url = 'http://www.mafengwo.cn/xc/'+str(city_code)+'/'    bsObj = get_static_url_content(url)    node =  bsObj.find('div',{'class':'m-tags'}).find('div',{'class':'bd'}).find_all('a')    tag = [node[i].text.split()[0] for i in range(0,len(node))]    tag_node = bsObj.find('div',{'class':'m-tags'}).find('div',{'class':'bd'}).find_all('em')    tag_count = [int(k.text) for k in tag_node]    par = [k.attrs['href'][1:3] for k in node]    tag_all_count = sum([int(tag_count[i]) for i in range(0,len(tag_count))])    tag_jd_count = sum([int(tag_count[i]) for i in range(0,len(tag_count)) if par[i]=='jd'])    tag_cy_count = sum([int(tag_count[i]) for i in range(0,len(tag_count)) if par[i]=='cy'])    tag_gw_yl_count = sum([int(tag_count[i]) for i in range(0,len(tag_count)) if par[i] in['gw','yl']])    url = 'http://www.mafengwo.cn/yj/'+str(city_code)+'/2-0-1.html '    bsObj = get_static_url_content(url)      total_city_yj = int(bsObj.find('span',{'class':'count'}).find_all('span')[1].text)    return{'city_name':city_name,'tag_all_count':tag_all_count,'tag_jd_count':tag_jd_count,            'tag_cy_count':tag_cy_count,'tag_gw_yl_count':tag_gw_yl_count,            'total_city_yj':total_city_yj}def get_city_food(city_name,city_code):    url = 'http://www.mafengwo.cn/cy/'+str(city_code)+'/gonglve.html'    bsObj = get_static_url_content(url)    food=[k.text for k in bsObj.find('ol',{'class':'list-rank'}).find_all('h3')]    food_count=[int(k.text) for k in bsObj.find('ol',{'class':'list-rank'}).find_all('span',{'class':'trend'})]    return pd.DataFrame({'food':food[0:len(food_count)],'food_count':food_count})def get_city_jd(city_name,city_code):    url = 'http://www.mafengwo.cn/jd/'+str(city_code)+'/gonglve.html'    bsObj = get_static_url_content(url)    node=bsObj.find('div',{'class':'row-top5'}).find_all('h3')    jd = [k.text.split('\n')[2] for k in node]    node=bsObj.find_all('span',{'class':'rev-total'})    jd_count=[int(k.text.replace(' 条点评','')) for k in node]    return pd.DataFrame({'jd':jd[0:len(jd_count)],'jd_count':jd_count})三、数据分析PART1:城市数据首先我们看一下游记数量最多的TOP10城市:游记数量TOP10数量基本上与我们日常所了解的热门城市相符,我们进一步根据各个城市游记数量获得全国旅行目的地热力图:看到这里,是不是有种似曾相识的感觉,如果你在朋友圈晒的足迹图与这幅图很相符,那么说明蚂蜂窝的数据与你不谋而合。最后我们看一下大家对于各个城市的印象是如何的,方法就是提取标签中的属性,我们将属性分为了休闲、饮食、景点三组,分别看一下每一组属性下大家印象最深的城市:看来对于蚂蜂窝的用户来说,厦门给大家留下的印象是非常深的,不仅游记数量充足,并且能从中提取的有效标签也非常多。重庆、西安、成都也无悬念的给吃货们留下了非常深的印象,部分代码如下:bar1 = Bar("餐饮类标签排名")bar1.add("餐饮类标签分数", city_aggregate.sort_values('cy_point',0,False)['city_name'][0:15],         city_aggregate.sort_values('cy_point',0,False)['cy_point'][0:15],         is_splitline_show =False,xaxis_rotate=30)bar2 = Bar("景点类标签排名",title_top="30%")bar2.add("景点类标签分数", city_aggregate.sort_values('jd_point',0,False)['city_name'][0:15],         city_aggregate.sort_values('jd_point',0,False)['jd_point'][0:15],         legend_top="30%",is_splitline_show =False,xaxis_rotate=30)bar3 = Bar("休闲类标签排名",title_top="67.5%")bar3.add("休闲类标签分数", city_aggregate.sort_values('xx_point',0,False)['city_name'][0:15],         city_aggregate.sort_values('xx_point',0,False)['xx_point'][0:15],         legend_top="67.5%",is_splitline_show =False,xaxis_rotate=30)grid = Grid(height=800)grid.add(bar1, grid_bottom="75%")grid.add(bar2, grid_bottom="37.5%",grid_top="37.5%")grid.add(bar3, grid_top="75%")grid.render('城市分类标签.html')PART2:景点数据我们提取了各个景点评论数,并与城市游记数量进行对比,分别得到景点评论的绝对值和相对值,并据此计算景点的人气、代表性两个分数,最终排名TOP15的景点如下:蚂蜂窝网友对于厦门真的是情有独钟,鼓浪屿也成为了最具人气的景点,在城市代表性方面西塘古镇和羊卓雍措位列前茅。小长假来临之际,如果担心上排的景点人太多,不妨从下排的景点中挖掘那些人少景美的旅游地。PART3:小吃数据最后我们看一下大家最关注的的与吃相关的数据,处理方法与PART2景点数据相似,我们分别看一下最具人气和最具城市代表性的小吃出乎意料,蚂蜂窝网友对厦门果真爱得深沉,让沙茶面得以超过火锅、烤鸭、肉夹馍跻身最具人气的小吃。在城市代表性方面,海鲜的出场频率非常高,这点与大(ben)家(ren)的认知也不谋而合,PART2与3的部分代码如下:bar1 = Bar("景点人气排名")bar1.add("景点人气分数", city_jd_com.sort_values('rq_point',0,False)['jd'][0:15],         city_jd_com.sort_values('rq_point',0,False)['rq_point'][0:15],         is_splitline_show =False,xaxis_rotate=30)bar2 = Bar("景点代表性排名",title_top="55%")bar2.add("景点代表性分数", city_jd_com.sort_values('db_point',0,False)['jd'][0:15],         city_jd_com.sort_values('db_point',0,False)['db_point'][0:15],         is_splitline_show =False,xaxis_rotate=30,legend_top="55%")grid=Grid(height=800)grid.add(bar1, grid_bottom="60%")grid.add(bar2, grid_top="60%",grid_bottom="10%")grid.render('景点排名.html')-end-你心中的最好吃小吃是什么?

python parser count_Python分析哪座城市小吃最好吃相关推荐

  1. 天一冷,就想大口吃肉,爬取一座城市里的烤肉店数据(附完整Python爬虫代码)

    前言 天一冷,就想吃肉,贴好秋膘才能好过冬.对于肉食主义者,吃肉简直幸福感爆棚!特别是烤肉,看着一块块肉慢慢变熟,听着烤盘上"滋滋"的声响,这种期待感是任何其他食物都无法带来的.如 ...

  2. 我不就是吃点肉,应该没事吧——爬取一座城市里的烤肉店数据(附完整Python爬虫代码)

    写在前面的一点屁话: 对于肉食主义者,吃肉简直幸福感爆棚!特别是烤肉,看着一块块肉慢慢变熟,听着烤盘上"滋滋"的声响,这种期待感是任何其他食物都无法带来的.如果说甜点是" ...

  3. python 在南京发展_南京和杭州,哪一座城市潜力大?

    先说我个人的观点:长期来看,还是南京潜力更大一些. 南京和杭州,自诞生以来就在东南产生了一场没有硝烟的竞争,一个是江南佳丽地,自古帝王州的六朝古都南京,另一个是暖风熏的游人醉,只把杭州作汴州的人间天堂 ...

  4. python爬取去哪里_详解Python 爬取13个旅游城市,告诉你五一大家最爱去哪玩?

    今年五一放了四天假,很多人不再只是选择周边游,因为时间充裕,选择了稍微远一点的景区,甚至出国游.各个景点成了人山人海,拥挤的人群,甚至去卫生间都要排队半天,那一刻我突然有点理解灭霸的行为了. 今天通过 ...

  5. 谁还不爱吃肉?现在就教你采集一座城市里的烤肉店数据(附完整代码)

    文章目录 前言 正文 准备环境 了解爬虫最基本的思路 一. 数据来源分析 二. 代码实现过程 代码实现过程 发送请求 2.获取数据 3.解析数据 4.解析数据 5.翻页 运行代码得到数据 完整代码 前 ...

  6. NLP实战:利用Python理解、分析和生成文本 | 赠书

    导读:本文内容参考自<自然语言处理实战:利用Python理解.分析和生成文本>一书,由Hobson Lane等人所著. 本书是介绍自然语言处理(NLP)和深度学习的实战书.NLP已成为深度 ...

  7. 南京、苏州、杭州、上海你更喜欢哪座城市?

    南京.苏州.杭州.上海你更喜欢哪座城市? 这个问题笔者来回答,实在是很合适.笔者在这四个城市里工作过,以出差做SAP咨询项目的方式,在这些城市里至少生活过半年.在这些城市生活期间笔者游历了这些城市的各 ...

  8. 阿里达摩院 AI医疗 「铸剑」四年:上线170家医院,落地57座城市

    疫情突然,对于各行各业来说都是一场大考,尤其是 AI 医疗行业,从疫情咨询.药物研发.病毒基因分析再到临床诊断等多个环节,紧急上阵,达摩院医疗 AI 团队却连点成线,应用「处处开花」. 在这背后,是达 ...

  9. 用python进行营销分析_用python进行covid 19分析

    用python进行营销分析 Python is a highly powerful general purpose programming language which can be easily l ...

最新文章

  1. 笔记 JVM调优流程
  2. 微信小程序的搜索和重置功能
  3. 介绍了如何取成员函数的地址以及调用该地址
  4. 利用python制作的可视化批量文件后缀处理工具
  5. querySelector() 选择器语法
  6. 尝鲜ESXi7.0,手工注入LSI MegaRAID 9260-8i驱动,封装iso安装文件
  7. 黑盒测试方法|测试用例的设计方法--等价类划分方法
  8. VMware Workstation 14.1.1 精简特别版
  9. Android代码里面设置字体颜色的三种方法
  10. springboot集成quartz
  11. 使用虚幻4进行安卓打包
  12. 用标准普尔家庭资产象限图规划收入分配
  13. 如何使用 R 从 Internet 下载文件
  14. 南天收藏库为什么大不了_那么,密码有什么大不了的呢?
  15. GOF23设计模式之适配器模式
  16. ApiPost与PostMan,你可以任选一款不错的接口管理工具
  17. NJR日清纺微理光R5445系列 单节锂电池保护芯片,内置驱动器高位Nch FET开关温度保护
  18. 【MAPBOX基础功能】19、mapbox修改鼠标在地图上的样式
  19. Managed to do/down payment
  20. 问道量化投资用matlab来敲门 pdf,问道量化投资-用MATLAB来敲门

热门文章

  1. python学生管理系统-python实现学生成绩管理系统
  2. python装饰器原理-简单了解python装饰器原理及使用方法
  3. python一个月能学成嘛-一个月可以学好基础的Python吗?
  4. python编程基础是什么-Python面向对象编程基础解析(一)
  5. python一般用什么编译器-Python常用编译器原理及特点解析
  6. 少儿python编程培训-无锡江阴少儿Python编程培训一对一
  7. python读取excel表格-python xlrd读取excel(表格)详解
  8. MapStruct在Eclipse中的使用
  9. PHPMailer配置QQ邮箱163邮箱和谷歌邮箱发送邮件
  10. 进程与线程的区别联系