1.项目背景:
在线旅游平台已成为我们规划旅行的重要工具。去哪儿网作为国内领先的在线旅游平台之一,提供了丰富的旅游攻略和用户反馈,为我们的研究提供了宝贵的数据资源。
2.项目需求:
在去哪儿旅行官网使用Python爬虫技术爬取攻略数据,并保存到本地,对CSV文件里的数据进行可视化分析,并写一份数据分析报告
3.项目目的:
-
市场趋势分析:通过采集和分析去哪儿网上的旅行攻略数据,了解当前旅游市场的趋势和用户偏好,为旅游企业提供市场策略的参考依据 用户行为研究:
-
分析用户在选择旅游目的地、旅游方式、旅游时间和旅游消费等方面的偏好,以便更好地理解消费者需求
-
旅游攻略推荐:利用数据分析结果,为用户提供个性化的旅行攻略和建议,帮助用户规划更合理、更有趣的旅行行程
4.项目范围:
-
数据集 :来 自 对 去 哪 儿 官 网 旅 游 攻 略 的 数 据 采 集
-
时间范围 : 2024年1月份到10月份
5.技术栈:
-
工具和库:Pycharm和Edge浏览器驱动
-
模块和库: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文件中,以便于后续的数据分析和处理。通过检查文件是否存在,代码能够智能地处理首次写入和后续追加的情况,确保数据的完整性和准确性。
以上爬虫环节的所有内容,最后在主程序中添加多线程去同时爬取网页数据就好了,关于去哪儿旅行数据可视化分析在篇博客中哦