服务器一关机就报错了(服务器关机后主动重启)「服务器关机了怎么办」

  金秋九月,丹桂飘香,在这天高气爽,阳光光辉光耀的劳绩季候里,我们送走了一个个暑假余额耗尽哭着走向校园的孩子们,又即将迎来一年一度巨大母亲的生日趴体(无心上班,如饥似渴想为故国母亲庆生)。

  那么题目来了,去哪儿玩呢?百度输了个“国庆”,出来的第一条居然是“去那边旅游人少”……emmmmmmm,因缺思厅。

  于是我萌生了通过旅游网站的景点销量来判定近期各景点流量环境的想法(这个想法很伤害啊)。

  以是这次的目标呢,是爬去哪儿网景点页面,并得到景点的信息,各人可以先思考下大概必要几步。

  本文发起有肯定Python底子和前端(html,js)底子的朋侪阅读,零底子可以去看我之前的文。(咳咳,不能总更小白文,如许显得我不(mei)够(you)专(xue)业(xi))。

  百度的舆图API和echarts

  由于前反复爬虫都是爬一些文本信息,做一下词云之类的,我以为:没!意!思!了!这次恰好爬的是数据,我决定用数据的好基友——图表来输出我爬取的数据,也就是说我要用爬取的景点销量以及景点的具体位置来天生一些可视化数据。

  安利一下百度的舆图API和echarts,前者是专门提供舆图API的工具,听说很多多少APP都在用它,后者是数据处理惩罚居家观光的好搭档,用了之后,它好,我也好(隐隐以为那边不对)。

  API是什么,API是应用程序的编程接口,就好像插头与插座一样,我们的程序必要电(这是什么程序?),插座中提供了电,我们只必要在程序中写一个与插座匹配的插头接口,就可以利用电来做我们想做的事变,而不必要知道电是怎样产生的。

引入数据后的百度热力图

通过API对接的开辟者与服务商

  确定输出文件

  有人大概说,我已经懂了API是啥意思了,但是咋个用呢。关于这一点,我很负责任的告诉你:我也不会。

  但是!百度舆图提供了很多API利用示例,有html底子,大抵可以看懂,有js底子就可以实行改函数了(不会js的,我冷静地复制源代码),细致观察源代码,可以知道热力图天生的重要数据都存放在points这个变量中。

  这种[{x:x,x:x},{x:x,x:x}]格式的数据,是一种json格式的数据,由于具有自我形貌性,以是比力普通易懂,大概可以知道这里的三个值,前两个是经纬度,末了一个应该是权重(我猜的)。

  也就是说,假如我盼望将景点的热门程度天生为热力图,我必要得到景点的经纬度,以及它的权重,景点的销量可以作为权重,而且这个数据应该是json格式的出现方式。

服务器一关机就报错了(服务器关机后自动重启) 服务器一关机就报错了(服务器关机后主动
重启)「服务器关机了怎么办」 行业资讯

  echarts也是一样滴(*^__^*)。

  爬取数据

  这次的爬虫部分是比力简单的。分析网址(去哪儿景点)→爬取分页中信息(景点经纬度、销量)→转为json文件。

  分析去哪儿景点页的网址,可得出布局:https://piao.qunar.com/ticket/list.htm?keyword=搜刮地点region=from=mpl_search_suggestpage=页数

  这次没有效正则来匹配内容,而利用了xpath匹配,非常好用。

  defgetList():

  place=raw_input('请输入想搜刮的地区、范例(如北京、热门景点等):')

  url='https://piao.qunar.com/ticket/list.htm?keyword='+str(place)+'region=from=mpl_search_suggestpage={}'

  i=1

  sightlist=[]

  whilei:

  page=getPage(url.format(i))

  selector=etree.HTML(page)

  print'正在爬取第'+str(i)+'页景点信息'

  i+=1

  informations=selector.xpath('//div[@class="result_list"]/div')

  forinfininformations:#获取须要信息

  sight_name=inf.xpath('./div/div/h3/a/text()')[0]

  sight_level=inf.xpath('.//span[@class="level"]/text()')

  iflen(sight_level):

  sight_level=sight_level[0].replace('景区','')

  else:

  sight_level=0

  sight_area=inf.xpath('.//span[@class="area"]/a/text()')[0]

  sight_hot=inf.xpath('.//span[@class="product_star_level"]//span/text()')[0].replace('热度','')

  sight_add=inf.xpath('.//p[@class="addresscolor999"]/span/text()')[0]

  sight_add=re.sub('地点:|(.*?)|(.*?)|,.*?$|/.*?$','',str(sight_add))

  sight_slogen=inf.xpath('.//div[@class="introcolor999"]/text()')[0]

  sight_price=inf.xpath('.//span[@class="sight_item_price"]/em/text()')

  iflen(sight_price):

  sight_price=sight_price[0]

  else:

  i=0

  break

  sight_soldnum=inf.xpath('.//span[@class="hot_num"]/text()')[0]

  sight_url=inf.xpath('.//h3/a[@class="name"]/@href')[0]

  sightlist.append([sight_name,sight_level,sight_area,float(sight_price),int(sight_soldnum),float(sight_hot),sight_add.replace('地点:',''),sight_slogen,sight_url])

  time.sleep(3)

  returnsightlist,place

这里把每个景点的全部信息都趴下来了(着实是为了练习利用xpath……)。

利用了while循环,for循环的break的方式是发现无销量时给i值赋零,如许while循环也会同时竣事。

地点的匹配利用re.sub()函数去除了n多复杂信息,这点背面表明。

服务器一关机就报错了(服务器关机后自动重启) 服务器一关机就报错了(服务器关机后主动
重启)「服务器关机了怎么办」 行业资讯

  输出本地文本

  为了防止代码运行错误,维护代码运行的寂静,将输出的信息列表存入到excel文件中了,方便日后查阅,很简单的代码,必要相识pandas的用法。

  deflistToExcel(list,name):

  df=pd.DataFrame(list,columns=['景点名称','级别','地点地区','起步价','贩卖量','热度','地点','标语','详情网址'])

  df.to_excel(name+'景点信息.xlsx')

  百度经纬度API

  非常伤心的,(?﹏?)我没找到去哪儿景点的经纬度,以为这次学(zhuang)习(bi)筹划要就此流产了。(假如有人知道景点经纬度在那边请告诉我)

  但是,enhahhahahaha,我怎么会放弃呢,我又找到了百度经纬度API。

  网址:https://api.map.baidu.com/geocoder/v2/?address=地点output=jsonak=百度密钥,修改网址里的“地点”和“百度密钥”,在欣赏器打开,就可以看到经纬度的json信息。

  #上海市东方明珠的经纬度信息

  {"status":0,"result":{"location":{"lng":121.5064701060957,"lat":31.245341811634675},"precise":1,"confidence":70,"level":"UNKNOWN"}}

  百度密钥申请方法:https://jingyan.baidu.com/article/363872eccda8286e4aa16f4e.html

  如许我就可以根据爬到的景点地点,查到对应的经纬度辣!Python获取经纬度json数据的代码如下:

  defgetBaiduGeo(sightlist,name):

  ak='密钥'

  headers={

  'User-Agent':'Mozilla/5.0(Macintosh;IntelMacOSX10_12_6)AppleWebKit/537.36(KHTML,likeGecko)Chrome/60.0.3112.113Safari/537.36'

  }

  address=地点

  url='https://api.map.baidu.com/geocoder/v2/?address='+address+'output=jsonak='+ak

  json_data=requests.get(url=url).json()

  json_geo=json_data['result']['location']

  观察获取的json文件,location中的数据和百度API所必要的json格式根本是一样,还必要将景点销量参加到json文件中,这里可以相识一下json的浅拷贝和深拷贝知识,末了将整理好的json文件输出到本地文件中。

  defgetBaiduGeo(sightlist,name):

  ak='密钥'

  headers={

  'User-Agent':'Mozilla/5.0(Macintosh;IntelMacOSX10_12_6)AppleWebKit/537.36(KHTML,likeGecko)Chrome/60.0.3112.113Safari/537.36'

  }

  list=sightlist

  bjsonlist=[]

  ejsonlist1=[]

  ejsonlist2=[]

  num=1

  forlinlist:

  try:

  try:

  try:

  address=l[6]

  url='https://api.map.baidu.com/geocoder/v2/?address='+address+'output=jsonak='+ak

  json_data=requests.get(url=url).json()

  json_geo=json_data['result']['location']

  exceptKeyError,e:

  address=l[0]

  url='https://api.map.baidu.com/geocoder/v2/?address='+address+'output=jsonak='+ak

  json_data=requests.get(url=url).json()

  json_geo=json_data['result']['location']

  exceptKeyError,e:

  address=l[2]

  url='https://api.map.baidu.com/geocoder/v2/?address='+address+'output=jsonak='+ak

  json_data=requests.get(url=url).json()

  json_geo=json_data['result']['location']

  exceptKeyError,e:

  continue

  json_geo['count']=l[4]/100

  bjsonlist.append(json_geo)

  ejson1={l[0]:[json_geo['lng'],json_geo['lat']]}

  ejsonlist1=dict(ejsonlist1,**ejson1)

  ejson2={'name':l[0],'value':l[4]/100}

  ejsonlist2.append(ejson2)

  print'正在天生第'+str(num)+'个景点的经纬度'

  num+=1

  bjsonlist=json.dumps(bjsonlist)

  ejsonlist1=json.dumps(ejsonlist1,ensure_ascii=False)

  ejsonlist2=json.dumps(ejsonlist2,ensure_ascii=False)

  withopen('./points.json',"w")asf:

  f.write(bjsonlist)

  withopen('./geoCoordMap.json',"w")asf:

  f.write(ejsonlist1)

  withopen('./data.json',"w")asf:

  f.write(ejsonlist2)

  在设置获取经纬度的地点时,为了匹配到更正确的经纬度,我选择了匹配景点地点,然而,景点地点里有各种神奇的地点,带括号表明在XX对面的,说一堆你应该左拐右拐各种拐就能到的,尚有英文的……

  于是就有了第三章中复杂的去除信息(我终于圆返来了!)。

  然而,就算去掉了复杂信息,尚有一些匹配不到的景点地点,于是我利用了嵌套try,假如景点地点匹配不到;就匹配景点名称,假如景点名称匹配不到;就匹配景点地点地区,假如依然匹配不到,那我……那我就……那我就跳过ㄒ_ㄒ……

  身为一个景点,你怎么能,这么难找呢!不要你了!

  这里天生的三个json文件,一个是给百度舆图API引入用的,另两个是给echarts引入用的。

  网页读取json文件

  将第二章中所述的百度舆图API示例中的源代码复制到表明器中,添加密钥,生存为html文件,打开就可以看到和官网上一样的表现结果。

  echarts必要在实例页面,点击页面右上角的EN切换到英文版,然后点击downloaddemo下载完备源代码。

  根据html导入json文件修改网页源码,导入json文件。

  #百度舆图api示例代码中各位置修改部分

  head

  src="https://libs.baidu.com/jquery/2.0.0/jquery.js"/

  /head

  type="text/java"

  $.getJSON("points.json",function(data){

  varpoints=data;

  中原有函数;

  });

  /

  这里利用了jQuery之后,纵然网页调试乐成了,在本地打开也无法表现网页了,在chrome中右键查抄,发现报错提示是必要在服务器上表现,但是,服务器是什么呢?

  百度了一下,可以在本地创建一个服务器,在终端进入到html文件地点文件夹,输入python-mSimpleHTTPServer,再在欣赏器中打开https://127.0.0.1:8000/,记得要将html文件名设置成index.html哦!

  跋文

  由于注册但没有认证开辟者账号,以是每天只能获取6K个经纬度API(这是一个很好的偷懒来由),以是我选择了热门景点中前400页(每页15个)的景点。

  结果可想而知,(?﹏?)为了调试由于数据增多出现的额外Bug,终极的获取的景点数据大概在4500条左右(爬取时间为2017年9月10日,爬取关键词:热门景点,仅代表当时销量)。

热门景点热力图

热门景点表示图

  这些舆图上很火爆的地区,我想在国庆大概是如许的

  将舆图上热门景点的销量Top20提取出来,大多数都是耳熟能详的地点,北京的故宫排在了第一位,而大四川则占据了Top5中的三位,排在Top20中四川省景点就占了6位。

热门景点销量Top20

  于是我又做了一个各都会包罗热门景点数量标排行,没想到在4千多个热门景点中,数量最多的竟是我大浙江,是第二个都会的1.5倍,而北京作为都城也……可以说是景点数/总面积的第一位了。

重要都会热门景点数

  这些都会有辣么多热门景点,都是些什么级别的景点呢?由下图看来,各都会的各级别景点根本与都会总热门景点呈正相干,而且重要由4A景区贡献而来。

重要都会热门景点级别

  既然去哪些地方人多,去那边景多都已经知道了,那再看看去哪些地方烧得钱最多吧。

  下图是由各都会景点贩卖起步价的最大值-最小值扇形构成的圆,此中湖北以单景点贩卖起步价600占据首位。

  但也可以看到,湖北的景点贩卖均价并不高(在赤色扇形中的藏蓝色线条)。而假如国庆去香港玩,请做好钱包减肥的生理和生理预备(??ω??)?。

各省旅游景点贩卖起步价

  好啦分析完啦,ヾ(*ΦωΦ)ツ各人可要好好玩呀。

  PS:写了个网页,展示百度舆图的热力图结果和echarts的景点排行榜,方便各人查察。

  热力度结果:https://easyinfo.online

  gayhub源码:https://github.com/otakurice/notravellist/tree/master

  写完这篇文的时间发现echarts有针对Python的模块可以引入,以是筹划去学一下Django、Flask之类的Web框架,近来会更一些纯理论的意识流文,各人一起进步吧~

  参考资料:

  1.舆图API:https://developer.baidu.com/map/reference/index.php

  2.echarts:https://echarts.baidu.com/

  3.API利用示例:https://developer.baidu.com/map/jsdemo.htm#c1_15

  4.json:https://www.runoob.com/json/json-tutorial.html

  5.xpath:https://www.runoob.com/xpath/xpath-tutorial.html

  6.pandas:https://python.jobbole.com/84416/

  7.百度经纬度api:https://lbsyun.baidu.com/index.php?title=webapi/guide/webservice-geocoding

  8.浅拷贝和深拷贝:https://python.jobbole.com/82294/

  9.html导入json文件:https://www.jb51.net/article/36678.htm

  泉源:简书

客户评论

我要评论