当前位置: 首页 > news >正文

Python爬虫实战:用requests和BeautifulSoup4搞定携程美食、景点、酒店数据(附完整代码)

Python爬虫实战:从携程网高效获取结构化旅游数据

每次看到旅游网站上琳琅满目的景点推荐和酒店信息,你有没有想过这些数据是怎么整理出来的?作为刚接触Python爬虫的开发者,掌握从主流旅游平台获取结构化数据的能力,不仅能完成课程项目,更能为未来的数据分析打下基础。今天我们就用最基础的requests和BeautifulSoup4库,带你系统性地抓取携程网的美食、景点和酒店数据。

1. 环境准备与目标分析

在开始编写爬虫之前,我们需要明确几个关键点:首先,确保你的Python环境已经安装了必要的库。打开终端运行以下命令:

pip install requests beautifulsoup4 lxml

为什么选择这组工具?requests库以其简洁的API成为HTTP请求的行业标准,而BeautifulSoup4则是HTML解析的瑞士军刀。相比Scrapy等框架,这个组合对初学者更加友好,能让你专注于爬虫逻辑本身。

携程网的数据结构特点:

  • 美食数据分布在城市专属页面,按菜系和评分分类
  • 景点信息包含详细描述、用户评分和地理位置
  • 酒店数据则按星级、价格区间和用户评价组织

关键挑战在于:

  • 动态加载内容的处理
  • 反爬机制的规避
  • 数据结构的统一化

提示:实际操作前建议阅读携程网的robots.txt文件,了解其允许爬取的页面范围,通常公开的旅游信息页面是相对开放的。

2. 破解携程网URL规律

任何高效爬虫的第一步都是分析目标网站的URL结构。以北京为例,我们观察到了以下模式:

  • 景点数据:https://you.ctrip.com/sight/beijing1.html(首页)https://you.ctrip.com/sight/beijing1/s0-p2.html(第二页)

  • 美食数据:https://you.ctrip.com/fooditem/beijing1.htmlhttps://you.ctrip.com/fooditem/beijing1/s0-p3.html

  • 酒店数据:https://hotels.ctrip.com/hotel/beijing1/https://hotels.ctrip.com/hotel/beijing1/p2/

通过分析可以发现,URL主要由三部分组成:

  1. 基础域名(you.ctrip.com或hotels.ctrip.com)
  2. 城市代码(如beijing1、shanghai2)
  3. 分页标识(s0-p2表示第二页)

我们可以用字典来映射城市名称和代码:

city_mapping = { "北京": "beijing1", "上海": "shanghai2", "广州": "guangzhou152", "成都": "chengdu104" }

3. 构建稳健的请求系统

直接发送裸请求很容易被服务器拒绝。我们需要模拟浏览器行为,这包括:

必备请求头设置

headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)", "Accept-Language": "zh-CN,zh;q=0.9", "Referer": "https://you.ctrip.com/", }

请求间隔控制

import time import random def safe_request(url): time.sleep(random.uniform(1, 3)) # 随机延迟1-3秒 response = requests.get(url, headers=headers) return response

处理分页的典型模式:

base_url = "https://you.ctrip.com/sight/{city_code}/s0-p{page}.html" for page in range(1, 6): # 爬取前5页 url = base_url.format(city_code="beijing1", page=page) response = safe_request(url) # 处理响应内容

注意:当连续收到403状态码时,应该立即停止请求并检查反爬策略,可能需要更换IP或增加延迟时间。

4. 精准解析HTML内容

BeautifulSoup4提供了多种定位元素的方法,针对携程网的结构,我们主要使用CSS类选择器:

景点信息提取模板

def parse_attraction(html): soup = BeautifulSoup(html, 'lxml') items = [] for item in soup.select('.rdetailbox'): name = item.select_one('a[target="_blank"]').text.strip() position = item.select_one('.ellipsis').text.strip() score = item.select_one('.score').text if item.select_one('.score') else '无评分' items.append({ 'name': name, 'position': position, 'score': score }) return items

不同数据类型的解析要点:

数据类型关键元素提取方式
景点信息.rdetailboxCSS选择器
美食数据.fooditem属性选择
酒店详情.hotel_new_list组合选择

处理嵌套结构的技巧:

# 获取景点详细介绍 detail_soup = BeautifulSoup(detail_html, 'lxml') description = '\n'.join([ p.text for p in detail_soup.select('.text_style p') ])

5. 数据存储与结构化处理

原始数据需要经过清洗和转换才能用于分析。我们采用JSON格式存储,因为它兼具可读性和易用性。

数据清洗函数示例

def clean_text(text): text = text.replace('\n', '').replace('\r', '') text = ' '.join(text.split()) # 去除多余空格 return text.strip()

完整的数据处理流程:

  1. 原始HTML解析
  2. 字段提取与清洗
  3. 数据验证
  4. 结构化存储
import json def save_to_json(data, filename): with open(f'{filename}.json', 'w', encoding='utf-8') as f: json.dump(data, f, ensure_ascii=False, indent=2)

针对不同类型数据的存储策略:

  • 景点数据:保留名称、评分、位置、描述
  • 酒店信息:存储名称、地址、星级、价格区间
  • 美食推荐:记录餐厅、菜系、人均消费

6. 异常处理与反爬对策

真实环境中的爬虫必须考虑各种异常情况。以下是常见的处理方案:

网络请求异常

try: response = requests.get(url, headers=headers, timeout=10) response.raise_for_status() except requests.exceptions.RequestException as e: print(f"请求失败: {e}") return None

页面解析容错

name = item.find('h2', class_='title').text if item.find('h2', class_='title') else '未知'

应对反爬的高级技巧:

  • 使用代理IP轮询
  • 随机化请求头信息
  • 模拟鼠标移动轨迹
  • 处理Cookie会话

重要:当发现验证码出现时,应该立即停止爬取,考虑使用更温和的采集策略或改为API请求(如果官方提供)。

7. 项目实战:完整爬虫示例

下面是一个整合了所有技术的景点爬虫实例:

import requests from bs4 import BeautifulSoup import json import time import random class CtripSpider: def __init__(self): self.headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)", "Accept-Language": "zh-CN,zh;q=0.9", } self.base_url = "https://you.ctrip.com/sight/{city}/{page}.html" def get_page(self, url): try: time.sleep(random.uniform(1, 3)) response = requests.get(url, headers=self.headers) return response.text except Exception as e: print(f"Error fetching {url}: {e}") return None def parse_page(self, html): soup = BeautifulSoup(html, 'lxml') attractions = [] for item in soup.select('.rdetailbox'): try: name = item.select_one('a[target="_blank"]').text.strip() position = item.select_one('.ellipsis').text.strip() score = item.select_one('.score').text if item.select_one('.score') else '无' attractions.append({ 'name': clean_text(name), 'position': clean_text(position), 'score': clean_text(score) }) except Exception as e: print(f"解析错误: {e}") continue return attractions def run(self, city_code='beijing1', pages=3): all_data = [] for page in range(1, pages+1): url = self.base_url.format(city=city_code, page=f"s0-p{page}") html = self.get_page(url) if html: all_data.extend(self.parse_page(html)) save_to_json(all_data, f'ctrip_attractions_{city_code}') return all_data

在实际项目中,我发现携程网的页面结构会不定期微调,所以定期检查选择器是必要的。另一个经验是,将爬取间隔设置为2-5秒随机值,可以大幅降低被封风险。

http://www.jsqmd.com/news/572644/

相关文章:

  • 收藏!小白程序员必看:多智能体系统“团伙作案”与GroupGuard防护框架深度解析
  • OpenClaw 命令
  • 火影AI绘画实战:用忍者绘卷Z-Image Turbo生成鸣人、佐助角色图教程
  • 如何构建可靠的网页历史档案系统:Wayback Machine浏览器扩展技术解析
  • 性能调优该何时介入?越早越好吗?
  • 2025届毕业生推荐的五大降重复率神器推荐
  • CosyVoice模型音色定制功能初探:少量样本微调效果演示
  • DeepSeek句式重构指令怎么用?手把手教你降AI率超过30%
  • 基于YOLO26深度学习的【苹果质量智能检测与识别系统】【python源码+Pyqt5界面+数据集+训练代码】
  • 2026中国SAE法兰及无焊接管道连接系统优质厂家推荐指南 - 呼呼拉呼
  • 高效DOCX转LaTeX的终极解决方案:docx2tex一站式自动化转换指南
  • 洛谷 P11054
  • Flutter 开发工具有哪些 跨平台项目开发与上架实操指南
  • 2026届毕业生推荐的五大AI写作工具实测分析
  • 4款降AI率工具实测横评:最便宜和最贵的效果差多少?
  • 告别调参噩梦!聊聊Anchor-Free目标检测(以YOLOv8为例)为什么越来越香
  • 2026 年提词器 App 的新方向:AI 改稿 + 语速匹配,正在重新定义“读稿“这件事
  • Qwen3.5-2B轻量模型案例:车载中控屏集成图文问答与导航辅助
  • 天猫超市卡怎么提现到微信?速看攻略 - 京顺回收
  • 基于爬虫技术的电影数据可视化系统 Python+Django+Vue.js+MySQL
  • 2026最权威的六大AI辅助论文方案实际效果
  • 智能体撰写专利文件,风险知多少?
  • DeepSeek风格迁移降AI怎么用?从0到1完整操作教程
  • C++ 智能指针的生命周期陷阱
  • 忍者像素绘卷开源模型解析:Z-Image-Turbo-rinaiqiao checkpoint深度拆解
  • Java基础复习05:正则表达式和常用API(包装类、String、StringBuilder、Object、System、Math、Arrays、Random、BigDecimal、时间日期类)
  • AI图像增强工具Real-ESRGAN-GUI:让模糊影像重获新生的完整指南
  • 数据架构怎么设计?一文全面掌握数据架构设计方法论
  • 2026年本科论文AI率30%标准怎么过?3款降AI工具实测最稳
  • 万象视界灵坛惊艳效果集:同一张风景照在‘秋日山林’‘摄影比赛获奖作品’等神谕下的同步率对比