Python数据采集和分析项目(去哪儿旅行)----数据采集部分

1.项目背景:

     在线旅游平台已成为我们规划旅行的重要工具。去哪儿网作为国内领先的在线旅游平台之一,提供了丰富的旅游攻略和用户反馈,为我们的研究提供了宝贵的数据资源。

2.项目需求:

   在去哪儿旅行官网使用Python爬虫技术爬取攻略数据,并保存到本地,对CSV文件里的数据进行可视化分析,并写一份数据分析报告

3.项目目的:

  1. 市场趋势分析:通过采集和分析去哪儿网上的旅行攻略数据,了解当前旅游市场的趋势和用户偏好,为旅游企业提供市场策略的参考依据  用户行为研究:
  2. 分析用户在选择旅游目的地、旅游方式、旅游时间和旅游消费等方面的偏好,以便更好地理解消费者需求
  3. 旅游攻略推荐:利用数据分析结果,为用户提供个性化的旅行攻略和建议,帮助用户规划更合理、更有趣的旅行行程

4.项目范围:

  1. 数据集 来 自 对 去 哪 儿 官 网 旅 游 攻 略 的 数 据 采 集
  2. 时间 :  2024年1月份到10月份

5.技术栈:

  1. 工具和库:Pycharm和Edge浏览器驱动
  2. 模块和库:os,用于操作文件系统;threading,用于创建多线程;pandas,用于数据处理和CSV文件的读写;selenium,用于Web自动化测试;Xpath,提取网页中数据元素;matplotlib,设置图形参数,以支持中文显示和负号显示;Pyrcharts,数据可视化分析

6.数据采集部分:

   6.1  设计思路:
  • 使用threading库来实现多线程爬取,以提高爬取效率;
  • 对于每一页中的每个攻略项(共10项),使用XPath定位元素,提取攻略的标题、用户名、出发日期等信息;
  • 将提取的数据存储到Pandas DataFrame中。
   6.2   主要代码: 
   6.2.1 导入相关的模块
import os
import threading
import pandas as pd
from selenium import webdriver
from selenium.common import NoSuchElementException
from selenium.webdriver.edge.service import Service
from selenium.webdriver.common.by import By
import time
  • os:用于处理与操作系统交互的功能,如文件路径和操作。
  • threading:用于创建和管理线程,使得网络爬取可以并发进行,提高效率。
  • pandas:一个强大的数据处理和分析库,特别适合用于处理表格数据。
  • selenium:一个用于自动化浏览器操作的库。这里用到了它的webdriver模块来控制浏览器。
  • NoSuchElementException:Selenium中用于处理没有找到元素异常的类。
  • Service:用于启动和停止WebDriver的服务。
  • By:用于定位网页元素的方式。
  • time:用于处理时间相关的操作,如延迟。
   6.2.2 启动驱动服务
# 设置Edge驱动路径
    edge_path = 'D:\Pycharm\Python数据采集和分析\项目实战\driver\msedgedriver.exe'
    # 创建Edge驱动服务
    service = Service(edge_path)
    # 初始化Edge浏览器驱动
    driver = webdriver.Edge(service=service)
    # 最大化浏览器窗口
    driver.maximize_window()
  • 这段代码的主要功能是初始化Selenium中的Edge浏览器驱动,包括设置驱动路径、创建服务对象、启动浏览器以及最大化浏览器窗口。这为后续的网页爬取操作提供了一个可用的浏览器环境,确保能够顺利地访问和操作网页,从而获取所需的数据。
  6.2.3 提取网页数据 
 for i in range(start_page, end_page+1):
        # 构造每页的URL
        url = f'https://travel.qunar.com/travelbook/list/24-zhongguo-300667/hot_heat/{i}.htm'
        # 输出当前爬取的页码
        print(f'正在爬取第{i}页')
        # 请求页面
        driver.get(url)
        # 隐式等待,最大等待时间为15秒
        driver.implicitly_wait(15)
        # 遍历页面上的每个旅行记录
        for j in range(1, 11):
            # 标题
            title = driver.find_element(By.XPATH,f'//ul/li[{j}]/h2/a').text
            # 用户名
            name = driver.find_element(By.XPATH,f"//ul/li[{j}]/p[1]/span[1]/span[1]/a").text
            # 出发日期
            start_date = driver.find_element(By.XPATH,f"//ul/li[{j}]/p[1]/span[1]/span[2]").text
            # 天数
            day = driver.find_element(By.XPATH,f"//ul/li[{j}]/p[1]/span[1]/span[3]").text
            # 照片数量
            photo = driver.find_element(By.XPATH,f"//ul/li[{j}]/p[1]/span[1]/span[4]").text
            # 人均消费
            try:
                fee = driver.find_element(By.XPATH,f"//ul/li[{j}]/p[1]/span[1]/span[@class='fee']").text
            except NoSuchElementException:
                fee = '暂无'
            # 出行团体
            try:
                group = driver.find_element(By.XPATH,f"//ul/li[{j}]/p[1]/span[1]/span[@class='people']").text
            except NoSuchElementException:
                group = '暂无'
            # 出行类型
            try:
                type = driver.find_element(By.XPATH,f"//ul/li[{j}]/p[1]/span[1]/span[@class='trip']").text
            except NoSuchElementException:
                type = '暂无'
            # 浏览量
            view = driver.find_element(By.XPATH,f"//ul/li[{j}]/p[1]/span[@class='nums']/span[1]/span").text
            # 点赞数
            like = driver.find_element(By.XPATH,f"//ul/li[{j}]/p[1]/span[@class='nums']/span[2]/span").text
            # 评论数
            comment = driver.find_element(By.XPATH,f"//ul/li[{j}]/p[1]/span[@class='nums']/span[3]/span").text
  • 这段代码的主要功能是依次提取每页上旅行记录的相关信息,包括标题、用户名、出发日期、天数、照片数量、人均消费、出行团体、出行类型、浏览量、点赞数和评论数。它通过使用Selenium库和XPath来定位和获取网页元素
   6.2.4 处理异常机制
            try:
            # 途经
                through = driver.find_element(By.XPATH,f"//ul/li[{j}]/p[2]").text
            except NoSuchElementException:
                through = '暂无'
            # 行程
            try:
                itinerary = driver.find_element(By.XPATH,f"//ul/li[{j}]/p[3]").text
            except NoSuchElementException:
                itinerary = '暂无'
  • 这段代码的主要功能是从爬取的旅行数据中提取每条记录的“途经”和“行程”信息。通过使用try-except结构,它能够有效地处理因元素缺失而导致的异常,确保程序的稳定性。在未找到特定信息的情况下,将默认值设置为'暂无',以避免程序因缺失信息而崩溃。
   6.2.5 保存数据
 data = pd.DataFrame({
                '标题': [title], '用户名': [name], '出发日期': [start_date], '天数': [day], '照片数量': [photo], '人均消费': [fee],
                '出行团体': [group], '出行类型': [type], '浏览量': [view], '点赞数': [like], '评论数': [comment], '途经': [through],
                '行程': [itinerary]
            })
            # 如果CSV文件不存在,则写入表头和第一行数据,否则追加数据
            if not os.path.exists('travel_date.csv'):
                data.to_csv('travel_date.csv', mode='w', header=True, index=False)
            else:
                data.to_csv('travel_date.csv', mode='a', header=False, index=False)
  • 从网页中提取的旅行攻略数据保存到一个结构化的CSV文件中,以便于后续的数据分析和处理。通过检查文件是否存在,代码能够智能地处理首次写入和后续追加的情况,确保数据的完整性和准确性。

以上爬虫环节的所有内容,最后在主程序中添加多线程去同时爬取网页数据就好了,关于去哪儿旅行数据可视化分析在篇博客中哦 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值