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优化请求速度。
相关文章
|
2月前
|
数据采集 人工智能 API
推荐一款Python开源的AI自动化工具:Browser Use
Browser Use 是一款基于 Python 的开源 AI 自动化工具,融合大型语言模型与浏览器自动化技术,支持网页导航、数据抓取、智能决策等操作,适用于测试、爬虫、信息提取等多种场景。
585 4
推荐一款Python开源的AI自动化工具:Browser Use
|
2月前
|
数据采集 存储 监控
Python爬虫自动化:定时监控快手热门话题
Python爬虫自动化:定时监控快手热门话题
|
2月前
|
安全 数据库 数据安全/隐私保护
Python办公自动化实战:手把手教你打造智能邮件发送工具
本文介绍如何使用Python的smtplib和email库构建智能邮件系统,支持图文混排、多附件及多收件人邮件自动发送。通过实战案例与代码详解,帮助读者快速实现办公场景中的邮件自动化需求。
235 0
|
4月前
|
数据采集 存储 前端开发
Python爬虫自动化:批量抓取网页中的A链接
Python爬虫自动化:批量抓取网页中的A链接
|
4月前
|
数据采集 Web App开发 前端开发
Python+Selenium爬虫:豆瓣登录反反爬策略解析
Python+Selenium爬虫:豆瓣登录反反爬策略解析
|
4月前
|
数据采集 Web App开发 前端开发
Python爬虫中time.sleep()与动态加载的配合使用
Python爬虫中time.sleep()与动态加载的配合使用
|
3月前
|
测试技术 Python
Python接口自动化测试中Mock服务的实施。
总结一下,Mock服务在接口自动化测试中的应用,可以让我们拥有更高的灵活度。而Python的 `unittest.mock`库为我们提供强大的支持。只要我们正确使用Mock服务,那么在任何情况下,无论是接口是否可用,都可以进行准确有效的测试。这样,就大大提高了自动化测试的稳定性和可靠性。
151 0
|
6月前
|
机器学习/深度学习 存储 设计模式
Python 高级编程与实战:深入理解性能优化与调试技巧
本文深入探讨了Python的性能优化与调试技巧,涵盖profiling、caching、Cython等优化工具,以及pdb、logging、assert等调试方法。通过实战项目,如优化斐波那契数列计算和调试Web应用,帮助读者掌握这些技术,提升编程效率。附有进一步学习资源,助力读者深入学习。
|
3月前
|
Python
Python编程基石:整型、浮点、字符串与布尔值完全解读
本文介绍了Python中的四种基本数据类型:整型(int)、浮点型(float)、字符串(str)和布尔型(bool)。整型表示无大小限制的整数,支持各类运算;浮点型遵循IEEE 754标准,需注意精度问题;字符串是不可变序列,支持多种操作与方法;布尔型仅有True和False两个值,可与其他类型转换。掌握这些类型及其转换规则是Python编程的基础。
212 33
|
2月前
|
数据采集 分布式计算 大数据
不会Python,还敢说搞大数据?一文带你入门大数据编程的“硬核”真相
不会Python,还敢说搞大数据?一文带你入门大数据编程的“硬核”真相
87 1

推荐镜像

更多