Python+Selenium自动化爬取携程动态加载游记

简介: Python+Selenium自动化爬取携程动态加载游记
  1. 引言
    在旅游行业数据分析、舆情监测或竞品研究中,获取携程等平台的游记数据具有重要价值。然而,携程的游记页面通常采用动态加载(Ajax、JavaScript渲染),传统的Requests+BeautifulSoup方案难以直接获取完整数据。
    解决方案:使用Selenium模拟浏览器行为,配合BeautifulSoup或lxml解析动态加载的游记内容。本文将详细介绍如何利用Python+Selenium爬取携程动态加载的游记,并存储至CSV文件。
  2. 技术选型与工具准备
    2.1 技术栈
    ● Python 3.8+(推荐使用最新稳定版)
    ● Selenium(浏览器自动化工具)
    ● BeautifulSoup4(HTML解析库)
    ● Pandas(数据存储与处理)
    ● ChromeDriver(与Chrome浏览器配合使用)
    2.2 环境安装
    2.3 下载浏览器驱动
    ● ChromeDriver:下载地址(需与本地Chrome版本匹配)
    ● GeckoDriver(Firefox):下载地址
  3. 爬取携程动态加载游记的步骤
    3.1 分析携程游记页面结构
    目标URL示例(以“北京”为例):
    https://you.ctrip.com/travels/beijing1/t3.html
    关键观察点:
  4. 动态加载:游记列表通过滚动或点击“加载更多”动态获取。
  5. Ajax请求:可通过浏览器开发者工具(F12→Network→XHR)查看数据接口。
  6. 反爬机制:
    ○ User-Agent检测
    ○ IP限制(需代理或控制请求频率)
    ○ 登录验证(部分内容需登录)
    3.2 Selenium 模拟浏览器操作
    from selenium import webdriver
    from selenium.webdriver.common.by import By
    from selenium.webdriver.common.keys import Keys
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    import time
    import pandas as pd
    from bs4 import BeautifulSoup

配置ChromeDriver路径

driver_path = "chromedriver.exe" # 替换为你的驱动路径
options = webdriver.ChromeOptions()
options.add_argument("--headless") # 无头模式(可选)
options.add_argument("--disable-gpu")
options.add_argument("user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36")

driver = webdriver.Chrome(executable_path=driver_path, options=options)
3.3 访问目标页面并滚动加载数据
def scroll_to_bottom(driver, maxscroll=5):
"""模拟滚动加载"""
for
in range(max_scroll):
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
time.sleep(2) # 等待数据加载

url = "https://you.ctrip.com/travels/beijing1/t3.html"
driver.get(url)
scroll_to_bottom(driver) # 滚动加载更多游记
3.4 解析游记数据
def parse_travel_notes(driver):
soup = BeautifulSoup(driver.page_source, 'html.parser')
notes = soup.findall('div', class='journalslist') # 游记列表容器

data = []
for note in notes:
    title = note.find('a', class_='journal-title').get_text(strip=True)
    author = note.find('a', class_='nickname').get_text(strip=True)
    date = note.find('span', class_='time').get_text(strip=True)
    views = note.find('span', class_='num').get_text(strip=True)
    content = note.find('p', class_='journal-content').get_text(strip=True)

    data.append({
        "标题": title,
        "作者": author,
        "发布时间": date,
        "阅读量": views,
        "内容摘要": content
    })

return data

travel_data = parse_travel_notes(driver)
3.5 存储数据至CSV
df = pd.DataFrame(travel_data)
df.to_csv("ctrip_travel_notes.csv", index=False, encoding="utf_8_sig") # 避免中文乱码

  1. 完整代码实现

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from bs4 import BeautifulSoup
import pandas as pd
import time
from selenium.webdriver.chrome.options import Options

def scroll_to_bottom(driver, maxscroll=5):
"""模拟滚动加载"""
for
in range(max_scroll):
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
time.sleep(2)

def parse_travel_notes(driver):
"""解析游记数据"""
soup = BeautifulSoup(driver.page_source, 'html.parser')
notes = soup.findall('div', class='journalslist')

data = []
for note in notes:
    title = note.find('a', class_='journal-title').get_text(strip=True)
    author = note.find('a', class_='nickname').get_text(strip=True)
    date = note.find('span', class_='time').get_text(strip=True)
    views = note.find('span', class_='num').get_text(strip=True)
    content = note.find('p', class_='journal-content').get_text(strip=True)

    data.append({
        "标题": title,
        "作者": author,
        "发布时间": date,
        "阅读量": views,
        "内容摘要": content
    })

return data

def main():

# 代理配置
proxyHost = "www.16yun.cn"
proxyPort = "5445"
proxyUser = "16QMSOML"
proxyPass = "280651"

# 初始化浏览器配置
options = Options()

# 设置User-Agent
options.add_argument("user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36")

# 设置代理(带认证)
proxy_options = {
    'proxy': {
        'http': f'http://{proxyUser}:{proxyPass}@{proxyHost}:{proxyPort}',
        'https': f'https://{proxyUser}:{proxyPass}@{proxyHost}:{proxyPort}',
        'no_proxy': 'localhost,127.0.0.1'
    }
}

# 添加代理扩展(适用于需要认证的代理)
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.proxy import Proxy, ProxyType

# 方法1:使用ChromeOptions添加代理(基础方法,可能不支持认证)
# options.add_argument(f'--proxy-server=http://{proxyUser}:{proxyPass}@{proxyHost}:{proxyPort}')

# 方法2:使用插件方式添加认证代理(推荐)
# 需要先创建一个代理认证插件
manifest_json = """
{
    "version": "1.0.0",
    "manifest_version": 2,
    "name": "Chrome Proxy",
    "permissions": [
        "proxy",
        "tabs",
        "unlimitedStorage",
        "storage",
        "<all_urls>",
        "webRequest",
        "webRequestBlocking"
    ],
    "background": {
        "scripts": ["background.js"]
    },
    "minimum_chrome_version":"22.0.0"
}
"""

background_js = """
var config = {
    mode: "fixed_servers",
    rules: {
        singleProxy: {
            scheme: "http",
            host: "%s",
            port: parseInt(%s)
        },
        bypassList: ["localhost"]
    }
};

chrome.proxy.settings.set({value: config, scope: "regular"}, function() {});

function callbackFn(details) {
    return {
        authCredentials: {
            username: "%s",
            password: "%s"
        }
    };
}

chrome.webRequest.onAuthRequired.addListener(
    callbackFn,
    {urls: ["<all_urls>"]},
    ['blocking']
);
""" % (proxyHost, proxyPort, proxyUser, proxyPass)

# 创建临时插件目录
import os
import tempfile
import zipfile

plugin_dir = tempfile.mkdtemp()
with open(os.path.join(plugin_dir, "manifest.json"), 'w') as f:
    f.write(manifest_json)
with open(os.path.join(plugin_dir, "background.js"), 'w') as f:
    f.write(background_js)

# 打包插件
proxy_plugin_path = os.path.join(plugin_dir, "proxy_auth_plugin.zip")
with zipfile.ZipFile(proxy_plugin_path, 'w') as zp:
    zp.write(os.path.join(plugin_dir, "manifest.json"), "manifest.json")
    zp.write(os.path.join(plugin_dir, "background.js"), "background.js")

# 添加插件到ChromeOptions
options.add_extension(proxy_plugin_path)

try:
    # 初始化浏览器(带代理)
    driver = webdriver.Chrome(executable_path="chromedriver.exe", options=options)

    # 访问页面并滚动加载
    url = "https://you.ctrip.com/travels/beijing1/t3.html"
    driver.get(url)
    scroll_to_bottom(driver)

    # 解析数据
    travel_data = parse_travel_notes(driver)

    # 存储数据
    df = pd.DataFrame(travel_data)
    df.to_csv("ctrip_travel_notes.csv", index=False, encoding="utf_8_sig")
    print("数据爬取完成,已保存至 ctrip_travel_notes.csv")

finally:
    driver.quit()
    # 清理临时插件文件
    import shutil
    shutil.rmtree(plugin_dir)

if name == "main":
main()

  1. 进阶优化
    5.1 反反爬策略
    ● 随机User-Agent:使用fake_useragent库动态切换UA。
    ● IP代理池:结合requests+proxies绕过IP限制。
    ● 模拟登录:处理需要登录才能查看的游记。
    5.2 数据增强
    ● 情感分析:使用SnowNLP或TextBlob分析游记情感倾向。
    ● 关键词提取:利用jieba分词提取热门景点关键词。
    5.3 分布式爬虫
    ● Scrapy+Redis:提升爬取效率。
    ● 多线程/异步爬取:使用asyncio或aiohttp优化请求速度。
相关文章
|
4月前
|
安全 JavaScript 开发者
Python 自动化办公神器|一键转换所有文档为 PDF
本文介绍一个自动化批量将 Word、Excel、PPT、TXT、HTML 及图片转换为 PDF 的 Python 脚本。支持多格式识别、错误处理与日志记录,适用于文档归档、报告整理等场景,大幅提升办公效率。仅限 Windows 平台,需安装 Office 及相关依赖。
254 0
|
2月前
|
存储 数据采集 监控
Python定时爬取新闻网站头条:从零到一的自动化实践
在信息爆炸时代,本文教你用Python定时爬取腾讯新闻头条,实现自动化监控。涵盖请求、解析、存储、去重、代理及异常通知,助你构建高效新闻采集系统,适用于金融、电商、媒体等场景。(238字)
423 2
|
3月前
|
SQL 测试技术 数据库
healenium+python+selenium
上次介绍了如何利用healenium+java+selenium来实现selenium的自愈,这次介绍如何healenium+python+selenium。关于healenium+python+selenium网上资料更少,并且甚至是错误的。在著名的书籍《软件测试权威指南中》也是有一定问题的。现在介绍如下
192 4
|
3月前
|
数据采集 监控 Shell
无需Python:Shell脚本如何成为你的自动化爬虫引擎?
Shell脚本利用curl/wget发起请求,结合文本处理工具构建轻量级爬虫,支持并行加速、定时任务、增量抓取及分布式部署。通过随机UA、异常重试等优化提升稳定性,适用于日志监控、价格追踪等场景。相比Python,具备启动快、资源占用低的优势,适合嵌入式或老旧服务器环境,复杂任务可结合Python实现混合编程。
|
5月前
|
存储 数据采集 数据可视化
Python自动化分析知网文献:爬取、存储与可视化
Python自动化分析知网文献:爬取、存储与可视化
|
5月前
|
数据采集 存储 监控
Python爬虫自动化:定时监控快手热门话题
Python爬虫自动化:定时监控快手热门话题
|
5月前
|
安全 数据库 数据安全/隐私保护
Python办公自动化实战:手把手教你打造智能邮件发送工具
本文介绍如何使用Python的smtplib和email库构建智能邮件系统,支持图文混排、多附件及多收件人邮件自动发送。通过实战案例与代码详解,帮助读者快速实现办公场景中的邮件自动化需求。
496 0
|
3月前
|
数据采集 机器学习/深度学习 人工智能
Python:现代编程的首选语言
Python:现代编程的首选语言
321 102
|
3月前
|
数据采集 机器学习/深度学习 算法框架/工具
Python:现代编程的瑞士军刀
Python:现代编程的瑞士军刀
348 104
|
3月前
|
人工智能 自然语言处理 算法框架/工具
Python:现代编程的首选语言
Python:现代编程的首选语言
279 103

推荐镜像

更多