源/数据森麟文/徐麟

前言:

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_url

def

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)

while

True

:

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_list

url =

'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_jd

def

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'

)

python哪些城市好发展_我用Python爬了各大城市的旅游数据后发现,最好玩的还是这里......相关推荐

  1. python哪些城市好就业_目前最全的python的就业方向

    Python是一门面向对象的编程语言,编译速度超快,从诞生到现在已经25个年头了.它具有丰富和强大的库,常被称为"胶水语言",能够把用其他语言编写的各种模块(尤其是C/C++)很轻 ...

  2. python wx窗口无法关闭_菜鸟学Python,双手奉上老司机给上路新手总结的Python实战问题…...

    针对Python这一话题每天后台都会有不少小伙伴提出问题,下面我就将这些问题进行汇整,产出"Python实战问题篇",我认为这些问题非常具有代表性,希望可以帮到大家. 第一类问题: ...

  3. 计算机编程导论python程序设计答案-学堂在线_计算机科学与Python编程导论_作业课后答案...

    学堂在线_计算机科学与Python编程导论_作业课后答案 答案: 更多相关问题 近代中国完全沦为半殖民地半封建社会的标志是:A.<马关条约>B.<辛丑条约>C.<凡尔赛和 ...

  4. python在中国的发展-未来十年Python的前景会怎样?

    回答过类似相关的问题,再引用一波,Python在人工智能.大数据.自动化运维.全栈开发方面有着得天独厚的优势,随着Python继续占领编程语言主流的趋势,全国各城市的招聘职位和薪资均会大幅度上涨. / ...

  5. python write 写多行_如何用 Python 执行单行命令

    一般来说,面对日常处理的一些小任务,直接用 sed,grep 之类的就可以搞定,更复杂一点的就会考虑 awk 或者用一些现成的轮子,要是 awk 搞不定我就只好用 Python 了.但有些时候,我仅仅 ...

  6. python将字符串逆序_为什么说Python是一门伟大的入门语言?(附免费教程)

    Python 是一门伟大的入门语言.作为一门伟大的编程语言,一定要具备一些特征,其中有五项特征是非常重要的: 非常棒的首次体验:就像书的开始,首先一定要能够"沉迷",学习新知识一定 ...

  7. 计算机编程导论python程序设计答案-学堂云_计算机科学与Python编程导论_作业课后答案...

    学堂云_计算机科学与Python编程导论_作业课后答案 答案: 更多相关问题 保本基金参与股指期货交易,应当根据风险管理的原则,以套期保值为目的.() 基金经理主要依据股票投资价值报告来决定实际的投资 ...

  8. python怎么开发安卓程序_怎样用python开发安卓app-到底如何使用Python开发Android程序.txt...

    Python是一种动态语言,是比较简单的. Android不直接支持使用Python开发的应用程序,它需要使用它的中间件或数据库.它提供了在Android平台上的Python语言的支持; Python ...

  9. python中的列表理解_掌握『Python列表理解』需要知道的9件事,你知道了吗?

    越来越多的人开始学习Python,它已经成为最流行的编程语言之一,这几乎发生在所有领域.比如网络开发.科学计算,当然还有人工智能. 无论想用python干什么,都绕不开学习Python的数据结构.变量 ...

最新文章

  1. 再也不用担心过拟合的问题了
  2. go语言编程之字符串操作
  3. 详解浏览器解析一个URL的全过程
  4. Linux expect与Shell交互
  5. DPCM 压缩系统的实现和分析
  6. Hadoop学习笔记—11.MapReduce中的排序和分组
  7. 夯实基础项目工程之图论——Uncle Bogdan and Country Happiness,Graph Coloring,How Many Paths?,Array Differentiation
  8. 今天才发现自己美工其实很厉害!
  9. 记录一些js面试题以及解法
  10. uva 12086 树状数组
  11. javascript中的var浅析
  12. 组态王软件自动邮件EMAIL发送
  13. python关键字保留字
  14. RFID技术在物联网中有哪些应用
  15. 酷播云视频列表功能教程,简单实现视频列表连播
  16. 【JavaScript】打印星型金字塔
  17. 非常规的自我实现——听陆向谦讲创业
  18. java word文本框_Java 读取Word文本框中的文本、图片、表格
  19. 不会写SQL?ChatGPT 来帮你
  20. tpwr886n路由器设置虚拟服务器,tl-wr886n路由器设置步骤图解 | 192路由网

热门文章

  1. 计算机专业的女生适合干什么工作?
  2. 从拼产品到拼营销,头条是不是走偏了?
  3. 纷享销客产品副总裁李杰:连接型CRM如何支撑快消品牌企业新增长
  4. ZOJ1516 Uncle Tom's Inherited Land(二分图最大匹配)
  5. 全球及中国辉光放电质谱仪(GDMS)市场商业模式与十四五投资战略规划研究报告2022-2028年
  6. WZOI-237猜猜谁是冠军
  7. android 蓝牙发送失败怎么办,【报Bug】蓝牙模块CC2640R2F 安卓发送数据包第二次发送不成功{code:10007,message:property not support}...
  8. 【有利可图网】PS实战教程37:制作一颗晶莹剔透的水珠
  9. java1.8日期类_JDK1.8-日期使用
  10. Java Map集合的详解