【python爬虫】携程旅行景点游客数据分析与可视化

一.选题背景

  随着旅游业的快速发展,越来越多的人选择通过互联网平台预订旅行产品,其中携程网作为国内领先的在线旅行服务提供商,拥有大量的旅游产品和用户数据。利用爬虫技术可以获取携程网上各个景点的游客数据,包括游客数量、游客来源地、游客年龄段、游客满意度等信息。通过分析这些数据,可以为景点的管理者提供客流量预测、市场分析、产品改进等方面的参考,也可以为旅游从业者提供市场营销、产品开发等方面的参考。因此,选题背景是基于爬虫技术获取携程网景点游客数据,分析这些数据对于旅游行业和景点管理的意义,为旅游行业的发展和景点的管理提供参考。

二.主题式网络爬虫设计方案

数据来源:三亚亚龙湾热带天堂森林公园游玩攻略简介,三亚亚龙湾热带天堂森林公园门票/地址/图片/开放时间/照片/门票价格【携程攻略】 (ctrip.com)

1.名称:携程旅行景点游客数据分析与可视化

2.爬取的数据内容:携程网旅游景点的用户评论内容、评论IP属地

3.爬虫设计方案概述:本次案例使用request对携程网景点页面进行爬取,使用xlutils对excel文件进行处理,之后使用pandas、pyecharts、jieba对数据进行可视化

4.技术难点:携程网上的景点数据庞大,需要爬虫技术能够高效地获取和处理大量数据,同时要考虑到数据更新的频率和实时性,也要预防访问检测。

三.主题式页面结构分析

1.页面结构 

(1)搜索栏、导航栏位于页面顶部

(2)评论区位置包裹于页面中间部分(要爬取的部分)

(3)页面底部显示其它信息

 2.页面结构解析

 (1)<div id = "commentModule">评论区整体位置

 (2)<div class="commentList">评论区内容列表

 (3)<div class = "contentInfo">评论区评论信息元素

  节点(标签)查找方法与遍历方法

     for循环迭代遍历

 四.网络爬虫设计

1.爬取到的数据

2.代码实现

将爬虫方法封装为类Spider_XieCheng,在对爬取到的数据进行逐条解析时顺便进行数据清洗

get_data方法:设置请求头以及规则和cookie,发起请求,获取响应数据

analyze_data方法:对传入的数据进行逐条解析,把IP属地的空值和特殊地区进行处理(提前进行数据清洗以方便后面数据可视化绘制地图)

save_excel方法:将传入的数据存储到excel

  1 import requests
  2 import xlrd, xlwt, os
  3 from xlutils.copy import copy
  4 import time
  5 
  6 class Spider_XieCheng(object):
  7     def __init__(self):
  8         self.data_id = 0 
  9 
 10     #发起请求获取响应数据
 11     def get_data(self):
 12         pages = 100  # 页数设置(一页10个游客)
 13         for page in range(1, int(pages) + 1):
 14             url = 'https://m.ctrip.com/restapi/soa2/13444/json/getCommentCollapseList'
 15             cookies = {
 16                 'MKT_CKID': '1701184519791.j1nes.9ll0',
 17                 'GUID': '09031019117090895670',
 18                 '_RSG': 'B2KZgmdz1O8o4Y4R.sklxB',
 19                 '_RDG': '28e94143a9de482aae2e935bd882f5ef15',
 20                 '_RGUID': '8601f67c-2a8d-408b-beef-bb6f9b122132',
 21                 '_bfaStatusPVSend': '1',
 22                 'UBT_VID': '1701184519782.37bb85',
 23                 'MKT_Pagesource': 'PC',
 24                 'nfes_isSupportWebP': '1',
 25                 '_ubtstatus': '%7B%22vid%22%3A%221701184519782.37bb85%22%2C%22sid%22%3A2%2C%22pvid%22%3A3%2C%22pid%22%3A600002501%7D',
 26                 '_bfaStatus': 'success',
 27                 'ibulanguage': 'CN',
 28                 'ibulocale': 'zh_cn',
 29                 'cookiePricesDisplayed': 'CNY',
 30                 'cticket': '0CDDE357337AEC6A065861D35A34D9162AA75BCB8063AE80366ACD8D40269DA2',
 31                 'login_type': '0',
 32                 'login_uid': 'CC94CD2D359B73CD9CC2E002839E204163EA360CBAD672051EAA872D50CC7913',
 33                 'DUID': 'u=0AE96CC05C93DD44B84C2281D96800D1&v=0',
 34                 'IsNonUser': 'F',
 35                 'AHeadUserInfo': 'VipGrade=0&VipGradeName=%C6%D5%CD%A8%BB%E1%D4%B1&UserName=&NoReadMessageCount=0',
 36                 '_resDomain': 'https%3A%2F%2Fbd-s.tripcdn.cn',
 37                 '_pd': '%7B%22_o%22%3A6%2C%22s%22%3A11%2C%22_s%22%3A0%7D',
 38                 '_ga': 'GA1.2.652696142.1702191431',
 39                 '_gid': 'GA1.2.323708382.1702191431',
 40                 '_RF1': '2409%3A895e%3Ab451%3A620%3A8c52%3Ad1d7%3Aa25d%3A6909',
 41                 '_ga_5DVRDQD429': 'GS1.2.1702191431.1.0.1702191431.0.0.0',
 42                 '_ga_B77BES1Z8Z': 'GS1.2.1702191431.1.0.1702191431.60.0.0',
 43                 'MKT_CKID_LMT': '1702191445465',
 44                 'Union': 'OUID=xc&AllianceID=4897&SID=799748&SourceID=&createtime=1702191446&Expires=1702796246013',
 45                 'MKT_OrderClick': 'ASID=4897799748&AID=4897&CSID=799748&OUID=xc&CT=1702191446014&CURL=https%3A%2F%2Fhotels.ctrip.com%2F%3Fallianceid%3D4897%26sid%3D799748%26ouid%3Dxc%26bd_creative%3D11072932488%26bd_vid%3D7491298425880010041%26keywordid%3D42483860484&VAL={"pc_vid":"1701184519782.37bb85"}',
 46                 '_jzqco': '%7C%7C%7C%7C1702191484275%7C1.256317328.1701184519797.1702191888543.1702192188644.1702191888543.1702192188644.0.0.0.17.17',
 47                 '_bfa': '1.1701184519782.37bb85.1.1702191890469.1702192248624.4.7.290510',
 48             }
 49             headers = {
 50                 'authority': 'm.ctrip.com',
 51                 'accept': '*/*',
 52                 'accept-language': 'zh-CN,zh;q=0.9',
 53                 'cache-control': 'no-cache',
 54                 'cookieorigin': 'https://you.ctrip.com',
 55                 'origin': 'https://you.ctrip.com',
 56                 'pragma': 'no-cache',
 57                 'referer': 'https://you.ctrip.com/',
 58                 'sec-ch-ua': '"Google Chrome";v="119", "Chromium";v="119", "Not?A_Brand";v="24"',
 59                 'sec-ch-ua-mobile': '?0',
 60                 'sec-ch-ua-platform': '"Windows"',
 61                 'sec-fetch-dest': 'empty',
 62                 'sec-fetch-mode':
### 设计实现基于Python携程四川酒店数据爬虫 为了有效抓取并处理来自携程网上的四川地区酒店数据,可以采用Scrapy框架来构建爬虫程序。该框架提供了强大的功能用于自动化网页内容提取,并能很好地应对大规模数据采集的需求[^3]。 #### 构建环境准备 确保安装了必要的库文件,包括但不限于`scrapy`, `selenium`以及数据库接口工具如`pymysql`以便于后续的数据存储操作。对于反爬机制较为严格的网站来说,配置稳定可靠的代理服务也是必不可少的一环,这有助于维持长时间稳定的请求发送过程而不易被目标服务器识别为异常行为进而遭到封禁[^4]。 #### 编写Spider类定义 创建一个新的Scrapy Spider实例,在其中指定起始URL列表指向含有四川区域内各城市酒店信息汇总页链接;编写解析函数以定位到具体每家旅馆详情入口地址,从而进一步深入挖掘更多有用情报,比如评分、价格区间等重要参数。 ```python import scrapy from ..items import HotelItem class SichuanHotelsSpider(scrapy.Spider): name = "SichuanHotels" start_urls = [ 'https://hotels.ctrip.com/domestic-city-hotel.html?city=chengdu', # 添加其他城市的初始查询页面... ] def parse(self, response): for hotel in response.css('div.hotel_item'): item = HotelItem() try: item['name'] = hotel.xpath('.//h2/a/text()').get().strip(), item['address'] = hotel.css('span.address_txt::text').get().strip(), item['price'] = int(hotel.css('strong.price_now>em::text').re(r'\d+')[0]), yield item except Exception as e: print(f"Parsing Error: {e}") ``` 此段代码展示了如何利用CSS选择器和XPath表达式相结合的方式高效地筛选出所需字段值,并将其封装进自定义的数据容器对象内等待传输给下游组件做下一步加工处理[^1]。 #### 数据清洗保存逻辑设定 通过重载`pipeline.py`中的方法完成对传入项目的初步清理工作——去除空白字符、转换数值类型等等之后再决定是否存入关系型数据库(MySQL)或是任何形式适合长期保管结构化记录的地方。此外还可以在此阶段实施去重策略防止重复录入相同条目造成资源浪费现象发生。 ```python def process_item(self, item, spider): cleaned_data = { key: (value.strip() if isinstance(value,str) else value) for key,value in dict(item).items() } sql = """INSERT INTO hotels(name,address,price) VALUES (%s,%s,%s);""" self.cursor.execute(sql,(cleaned_data['name'],cleaned_data['address'],cleaned_data['price'])) self.conn.commit() return item ``` 上述示例说明了怎样在接收到上游传递过来的对象后执行一系列预设动作最终达到优化入库效果的目的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值