写在开头

之前详细说明了代码过程的伊犁篇[传送门],是基于jupyter notebook一步步交互得来的,所以代码是一段段的,所以在这里用函数整理了一下。

1、步骤思路

STEP1. 确定要去的区域,获得去哪儿网景点评价的网页地址
STEP2. 通过爬虫爬取网页数据,把感兴趣的数据爬取下来,同时获得景点的详细页面链接
STEP3. 通过pandas工具对数据进行清洗整理,转换格式
STEP4. 进行综合评价,得出排名,再爬取前n个景点的详细数据,添加表格
STEP5. 进行空间落位,筛选出想去的地方

2、代码

遵循一个函数解决一个事情,

import requests
from bs4 import BeautifulSoup
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import time#获取页面链接
def get_urls(ui,n):  #ui:地址,n:页码数urllst = []for i in range(1,n+1):urllst.append(ui+str(i))return urllst#获得每个页面10个基本信息
def get_onepage_data(u): #u:网址r = requests.get(u)soup = BeautifulSoup(r.text, 'lxml')infor = soup.find('ul',class_ = "list_item clrfix").find_all('li')data_jd = []data_link = []for i in infor:dic = {}dic_link = {}dic['lat'] = i['data-lat']dic['lng'] = i['data-lng']dic['景点名称'] = i.find('span', class_="cn_tit").textdic['攻略提到数量'] = i.find('div', class_="strategy_sum").textdic['点评数量'] = i.find('div', class_="comment_sum").textdic['景点排名'] = i.find('span', class_="ranking_sum").textdic['驴友去过'] = i.find('span', class_="sum").text.split('%')[0]dic['星级'] = i.find('span', class_="cur_star")['style'].split(':')[1].split('%')[0]dic['描述'] = i.find('div', class_="desbox").textdic['链接'] = i.find('a')['href']data_jd.append(dic)        return data_jd#获得n页网页信息
def get_all_data(urls): #urls 网址列表data_list= []for i in urls:       data_list.extend(get_onepage_data(i))        #print('成功采集%i个景点数据' % len(data_list)) df = pd.DataFrame(data_list)   #导入pandas的DataFrame   df.index = df['景点名称']del df['景点名称']               return df#数据字符转数字,以便计算处理
def data_collation(df):      df['lng'] = df['lng'].astype(np.float)df['lat'] = df['lat'].astype(np.float)df['点评数量'] = df['点评数量'].astype(np.int)df['攻略提到数量'] = df['攻略提到数量'].astype(np.int)df['驴友去过'] = df['驴友去过'].astype(np.int)df['星级'] = df['星级'].astype(np.int)df.fillna(value = 0,inplace = True)  #填充空值,如果列是lnt类型就0;如果是str就用nanreturn df# 筛选综合得分前n名的数据
def data_top(urls,n):  # 前n个数据df = get_all_data(urls)df = data_collation(df)# 构建函数实现字段标准化,标准分cols = ['攻略提到数量','星级','点评数量']for col in cols:df[col + '_b'] = round((df[col] - df[col].min())/(df[col].max() - df[col].min())*100,2)            #由驴友去过比例得分+攻略提到数量得分+星级得分+点评数得分,每项均为0-100分df['综合得分'] = df['驴友去过']+df['攻略提到数量_b']+df['星级_b']+df['点评数量_b']top_n = df.sort_values(by = '综合得分', ascending=False).iloc[:n]    del top_n['攻略提到数量_b']del top_n['点评数量_b']del top_n['星级_b']return top_n#通过景点链接爬取景点详细信息
def get_onepage_info(name,u): #u:网址r = requests.get(u)soup = BeautifulSoup(r.text, 'lxml')dic_jd = {}dic_jd['景点名称'] = namedic_jd['开放时间'] = soup.find('td',class_ = "td_r")if dic_jd['开放时间'] is None:  #判断空值,防止出错dic_jd['开放时间'] = '无'else:dic_jd['开放时间'] = dic_jd['开放时间'].find('p').text            dic_jd['门票价格'] = soup.find('div',class_ = "b_detail_section b_detail_ticket")if dic_jd['门票价格'] is None:  #判断空值,防止出错dic_jd['门票价格'] = '无'else:dic_jd['门票价格'] = dic_jd['门票价格'].find('div',class_ = "e_db_content_box e_db_content_dont_indent").text   dic_jd['旅游时节'] = soup.find('div',class_ = "b_detail_section b_detail_travelseason")if dic_jd['旅游时节'] is None:  #判断空值,防止出错dic_jd['旅游时节'] = '全年'else:dic_jd['旅游时节'] = dic_jd['旅游时节'].find('div',class_ ='e_db_content_box e_db_content_dont_indent').textdic_jd['其他'] = soup.find('td',class_ = "td_l")if dic_jd['其他'] is None:  #判断空值,防止出错dic_jd['其他'] = '无'else:dic_jd['其他'] = dic_jd['其他'].textreturn dic_jd#通过爬取的景点链接,获得所有景点详细信息
def get_detailed(df):detailed_data = []for index,row in df.iterrows():#print(index,row['链接'])detailed_data.append(get_onepage_info(index,row['链接']))detailed_df = pd.DataFrame(detailed_data)detailed_df.index = detailed_df['景点名称']del detailed_df['景点名称']#为了让数据简洁一些,这里得说明所有数据都指向同一个数据集,删除后前面df的也都没有这些数据了del df['链接']del df['攻略提到数量']del df['点评数量']del df['星级']del df['驴友去过']res = pd.concat([df,detailed_df],axis= 1)  #添加景点详细数据return resif __name__=="__main__":start_time = time.time()urls = get_urls('https://travel.qunar.com/p-cs299861-nanjing-jingdian-1-',5) #链接及页数top30_data = data_top(urls,30)  # 前30的数据top30_data.to_excel('F://nanj_top30.xlsx')  #导出文件end_time1 = time.time()print ("爬取基本数据,耗时:",end_time1 - start_time)    res = get_detailed(top30_data)  # 添加详细景点信息,比较费时间res.to_excel('F://nanj_detailed.xlsx')  #导出文件end_time2 = time.time()print ("添加详细信息,耗时:",end_time2 - start_time)

3、 空间可视化结果如下

带有坐标的数据可以进行空间可视化,能看到景点的分布,旅游达人们就能知道大致的路线了。

景点主要分布在中山陵景区及附近

老门东—夫子庙—总统府—鸡鸣寺—玄武湖这条地铁3号线沿线,相对来说比较好组织路线


外围分布有大屠杀纪念馆、南京长江大桥、浦口火车站等个别景点,纯看个人兴趣了。

4、看看我们的数据集

nanj_top30.xlsx 的数据

nanj_detailed.xlsx的数据
详细信息里有多种信息,可以看到很多详细描述供参考!
看其中一个:
1、中山陵景区Sun Yatsen Mausoleum
描述:
沿着长长的石阶墓道爬上中山陵顶,瞻仰一代伟人的雕像。
门票价格:
免费开放。
开放时间:
周二-周日8:30-17:00;周一祭堂维护不开放,只能走到陵门为止(如恰逢法定节假日则正常开放)。中山陵陵寝自2018年6月1日起,试运行实施游客“预约”参观和“禁噪”管理。在试运行平稳基础上,拟于2019年1月1日起,正式施行中山陵陵寝“预约”参观和“禁噪”管理。
旅游时节:
四季皆宜。6月中旬-7月初为梅雨季节。南京以前有“火炉”之称,7-8月极端最高气温有时高达40℃,一般也在35℃左右。“夏热冬寒”是南京较之其它江南城市有过之而无不及的显著气候特征,通常12月份下雪机会最多,如果您有缘在南京遇上大雪,那也是令人神往的,江南的雪景更显妩媚动人。
其他:
地址:南京市玄武区石象路7号
电话:400-9288-312

python爬取景点数据看该去哪里玩——南京篇相关推荐

  1. python爬取景点数据看该去哪里玩——伊犁篇

    写在开头 六月的新疆美如天境,一直想去自驾游,在网易云课堂看到城市数据团大鹏老师讲的<用数据做攻略:找到一个城市最有趣的地方>传送门,于是尝试用python爬取景点数据,进行综合评价,然后 ...

  2. python爬取数据时报错:`aiohttp.client_exceptions.ClientConnectorCertificateError: Cannot connect to host sea

    python爬取数据时报错:aiohttp.client_exceptions.ClientConnectorCertificateError: Cannot connect to host sear ...

  3. python爬虫tableau数据分析_完美!Python爬招聘数据,Tableau做可视化分析

    原标题:完美!Python爬招聘数据,Tableau做可视化分析 交流群预热好久的可视化交互大屏来啦 1.项目背景 随着科技的飞速发展,数据呈现爆发式的增长,任何人都摆脱不了与数据打交道,社会对于&q ...

  4. Python:爬取数据出现response.status_code为403解决方法

    目录 前言 1. 原理 2. 代码 前言 出现403的返回结果 主要是有些服务器为了防止访问量过大,承受服务器的压力,或者是拒绝你的访问.服务器接收到这个信息,理应返回了这个403的信息 在前一块的代 ...

  5. 15分钟,教你用Python爬网站数据,并用BI可视化分析!

    作为一名在数据行业打拼了两年多的数据分析师,虽然目前收入还算ok,但每每想起房价,男儿三十还未立,内心就不免彷徨不已~ 两年时间里曾经换过一份工作,一直都是从事大数据相关的行业.目前是一家企业的BI工 ...

  6. 如何用python爬股票数据_python爬虫股票数据,如何用python 爬虫抓取金融数据

    Q1:如何用python 爬虫抓取金融数据 获取数据是数据分析中必不可少的一部分,而网络爬虫是是获取数据的一个重要渠道之一.鉴于此,我拾起了Python这把利器,开启了网络爬虫之路. 本篇使用的版本为 ...

  7. python爬网站数据实例-如何用Python爬数据?(一)网页抓取

    如何用Python爬数据?(一)网页抓取 你期待已久的Python网络数据爬虫教程来了.本文为你演示如何从网页里找到感兴趣的链接和说明文字,抓取并存储到Excel. 需求 我在公众号后台,经常可以收到 ...

  8. python数据比例_知乎人均985?Python爬50W数据,BI做出可视化后,我有了答案

    一次完整的python数据分析流程是怎么样的? 使用python从网站抓取数据,并将这些数据保存到SQLite数据库中,然后对数据进行清洗,最后对数据进行数据可视化分析. 可是熟悉的人应该知道,pyt ...

  9. sqlite 可视化_知乎人均985?Python爬50W数据,BI做出可视化后,我有了答案

    友情提醒:文末有.... 一次完整的python数据分析流程是怎么样的? 使用python从网站抓取数据,并将这些数据保存到SQLite数据库中,然后对数据进行清洗,最后对数据进行数据可视化分析. 可 ...

  10. 知乎人均985?Python爬50W数据,BI做出可视化后,我有了答案

    一次完整的python数据分析流程是怎么样的? 使用python从网站抓取数据,并将这些数据保存到SQLite数据库中,然后对数据进行清洗,最后对数据进行数据可视化分析. 可是熟悉的人应该知道,pyt ...

最新文章

  1. Markdwon中多张图片的并排显示(Mardown的灵动使用技巧)
  2. ArcGIS 网络分析[8.2] 资料2 使用IDatasetContainer2接口的CreateDataset方法创建网络数据集...
  3. iOS 键盘风格详解UIKeyboardType
  4. 这一次,终于弄懂了协变和逆变
  5. 【学习笔记】左偏树的可持久化(【模板】k短路 / [SDOI2010]魔法猪学院)
  6. IMAX影厅专候天神下凡 巨幕电影2010年观影指南
  7. CCF CSP201903-2二十四点
  8. 集成学习lgb库调参的粒子群方法
  9. MATLAB中SVM(支持向量机)的用法
  10. IOS开发者证书申请及应用上线发布详解(2014版)
  11. python编写个人信息_Python爬取个人微信朋友信息操作示例
  12. 基于SpringBoot/SSM的旅游论坛
  13. TOGAF架构学习总结
  14. 基于CNN的车牌识别
  15. 推荐一款个人感觉比较舒服的idea主题
  16. 《统计会犯错——如何避免数据分析中的统计陷阱》导读
  17. springboot2.0和mysql8的时间问题
  18. Android序列化之Parcel
  19. 商城项目商品列表页的渲染实现(含动图)
  20. 游戏蓝牙耳机哪个好用?性价比高的游戏蓝牙耳机推荐

热门文章

  1. 【网络原理】数据链路层
  2. 国内服务器 显示国外ip,国外ip访问国内服务器地址
  3. Thinkphp金融超市贷超平台源码带三级分销
  4. win10 完全卸载 MYsql8.0
  5. 社区版PyCharm(PyCharm Community)也可以有可视化的数据库工具呀
  6. 俄罗斯方块、纯前端实现俄罗斯方块、俄罗斯方块代码
  7. 软件测试肖sir__简历模板制作
  8. 免费——离散数学(左孝凌)课后习题答案
  9. java桌面开发_java开发windows桌面应用
  10. 简易语音助手—python