广东省携程网旅欧景点爬取

🐍 用Python爬取广东景点数据

本文将带你一步步实现广东省旅游景点的自动化数据采集,涵盖爬虫编写、数据解析、CSV存储及MySQL入库等完整流程

🎯 项目概述

作为一名技术博主,我最近完成了一个有趣的项目:使用Python爬虫技术自动化采集广东省旅游景点数据。这个项目不仅涉及网页数据抓取,还包括数据清洗、存储和数据库操作,是一个相对完整的数据采集与分析实践案例。

🛠 技术栈

  • Python 3.x - 核心编程语言
  • Requests - HTTP请求库
  • lxml - HTML/XML解析库
  • pymysql - MySQL数据库连接
  • csv - CSV文件操作
  • time/random - 请求间隔控制

📊 项目架构

数据采集 → 数据解析 → CSV存储 → MySQL入库

🚀 核心代码详解

1. 数据采集模块

def scrape_data_to_csv():
    # 设置请求头模拟浏览器行为
    headers = {
        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',
        'referer': 'https://you.ctrip.com/',
        # ... 其他头部信息
    }
    
    # 使用会话cookies维持登录状态
    cookies = {
        'UBT_VID': '1728978531192.7a32iNJ24XYh',
        # ... 其他cookies
    }

🔍 关键点说明

  • User-Agent:模拟真实浏览器访问,避免被反爬
  • Referer:设置来源页面,增加请求合法性
  • Cookies:维持会话状态,访问需要登录的页面

2. 分页请求与参数构造

# 生成唯一追踪ID
n1 = int(time.time() * 1000)
n2 = int(1e7 * random.random())
t = cookies.get("GUID")
n = f'{t} + "-" + {n1} + "-" + {n2}'

params = {
    '_fxpcqlniredt': t,
    'x-traceID': n,  # 唯一标识每次请求
}

json_data = {
    'districtId': 100051,  # 广东地区ID
    'index': index,        # 页码
    'count': 10,           # 每页数量
    'sortType': 1,         # 排序方式
}

🎯 技术要点

  • 时间戳+随机数:生成唯一请求ID,避免重复请求被拦截
  • 分页参数:通过修改index参数实现翻页
  • 地区标识districtId指定广东省

3. 数据解析与提取

# 提取基础信息
poiName = card['poiName']           # 景点名称
districtName = card['districtName'] # 所在城市
commentScore = card.get('commentScore', 0)  # 用户评分
price = card.get('price', '未提供')  # 门票价格

# 深度爬取详情页信息
result_response = requests.get(url)
result_tree = etree.HTML(result_response.text)

# 提取开放时间
openTime = '未提供'
time_elements = result_tree.xpath('//开放时间XPath')
if time_elements:
    time_str = time_elements[0]
    if '今日' in time_str and '开放' in time_str:
        openTime = time_str.split('今日')[1].split('开放')[0]

📝 数据字段说明

  • 基础信息:名称、城市、评分、价格等
  • 深度信息:开放时间、服务设施、图片链接等
  • 热度指标:评论数量、热度评分等

4. 反爬虫策略

# 随机延迟避免频繁请求
time.sleep(random.uniform(1, 3))

# 异常处理保证程序稳定性
try:
    # 数据处理逻辑
    writer.writerow([poiName, price, features, ...])
except Exception as e:
    print(f"第{index}页的第{i + 1}个信息框出错: {str(e)}")

🛡️ 防护措施

  • 随机延迟:模拟人类操作间隔
  • 异常捕获:保证单条数据错误不影响整体流程
  • 进度输出:实时监控爬取状态

5. 数据存储到CSV

# 创建CSV文件并写入表头
csv_file = 'attractions_data.csv'
file_exists = os.path.isfile(csv_file)

with open(csv_file, mode='a', newline='', encoding='utf-8-sig') as f:
    writer = csv.writer(f)
    if not file_exists:
        writer.writerow([
            'poiName', 'price', 'features', 'sightCategoryInfo', 
            'commentScore', 'heatScore', 'districtName', 
            'displayField', 'url', 'imageUrl', 'commentCount', 
            'openTime', 'service'
        ])

💾 存储特点

  • 追加模式:支持断点续爬
  • UTF-8编码:正确处理中文
  • 表头管理:仅首次写入表头

6. 数据库入库模块

def csv_to_mysql():
    # 数据库连接配置
    db_config = {
        'host': '127.0.0.1',
        'database': 'jingdian_guangdong',
        'user': 'root',
        'password': '123456',
        'charset': 'utf8'
    }
    
    # 批量插入数据
    insert_sql = """
    INSERT INTO Places (poiName, price, features, sightCategoryInfo, 
    commentScore, heatScore, districtName, displayField, url, 
    imageUrl, commentCount, openTime, service) 
    VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)
    """

🗄️ 数据库设计

  • 连接池管理:稳定的数据库连接
  • 事务处理:保证数据一致性
  • 字符集设置:支持中文存储

🎨 项目特色功能

🌟 智能数据提取

# 动态解析开放时间
if '今日' in time_str and '开放' in time_str:
    openTime = time_str.split('今日')[1].split('开放')[0]

🌟 断点续爬能力

file_exists = os.path.isfile(csv_file)
# 如果文件已存在,追加数据而不覆盖

🌟 完整错误处理

try:
    # 数据处理
except Exception as e:
    print(f"错误位置定位: 第{index}页的第{i + 1}个信息框")

📈 数据成果

通过这个爬虫项目,我们成功采集了以下维度的景点数据:

数据类别具体字段用途
🔖 基本信息景点名称、所在城市基础识别
💰 价格信息门票价格、服务设施消费参考
⭐ 评价数据用户评分、评论数量口碑分析
🏷️ 分类信息景点类别、特色标签内容分类
🕒 时间信息开放时间行程规划
🌐 资源链接详情页URL、图片链接资源引用

🚧 挑战与解决方案

🔥 遇到的挑战

  1. 反爬机制:网站对频繁请求有检测
  2. 数据异构:不同景点信息格式不统一
  3. 网络不稳定:请求超时或失败
  4. 编码问题:中文乱码处理

💡 解决方案

  1. 请求间隔:添加随机延迟模拟人工操作
  2. 异常处理:多层try-catch保证程序健壮性
  3. 编码统一:全程使用UTF-8编码
  4. 数据清洗:对缺失值设置默认值

🎯 使用指南

快速开始

if __name__ == '__main__':
    # 第一步:爬取数据到CSV
    scrape_data_to_csv()
    
    # 第二步:导入MySQL数据库
    csv_to_mysql()

自定义配置

  • 修改districtId可爬取其他地区
  • 调整random.uniform(1, 3)控制请求频率
  • 配置db_config连接自己的数据库

🔮 扩展应用

这个爬虫框架可以轻松扩展到其他应用场景:

  • 🏨 酒店数据采集:修改请求参数和目标URL
  • 🍽️ 餐厅信息收集:调整数据解析逻辑
  • 🎭 文化活动监控:变更目标网站和数据结构

💡 学习收获

通过这个项目,我深刻体会到:

  1. 🛠️ 实践出真知:理论结合实践才能真正掌握爬虫技术
  2. 🔧 工具链重要性:合适的库能极大提升开发效率
  3. 📋 规划先行:良好的项目结构设计是关键
  4. 🐛 调试能力:解决问题的能力比写代码更重要

🤝 贡献与交流

如果你对这个项目感兴趣,欢迎:

  • ⭐ Star 这个项目
  • 🐛 提交 Issue 报告问题
  • 🔧 发起 Pull Request 贡献代码
  • 💬 留言讨论技术细节

在这里插入图片描述

在这里插入图片描述

希望这个项目能帮助你更好地理解Python爬虫开发,如果有任何问题欢迎交流讨论!🚀

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

追寻定义的熊百涛!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值