一文掌握Splash的详细使用

news/2025/2/26 21:35:08

文章目录

    • 1. 安装与启动 Splash
      • 1.1 使用 Docker 安装
      • 1.2 直接安装
    • 2. 基本用法
      • 2.1 访问 Splash 界面
      • 2.2 使用 Splash 渲染页面
      • 2.3 使用 Lua 脚本
    • 3. 高级用法
      • 3.1 处理 JavaScript
      • 3.2 截图与 PDF
      • 3.3 处理 AJAX 请求
      • 3.4 设置请求头
      • 3.5 处理 Cookies
    • 4. 与 Scrapy 集成
      • 4.1 安装 Scrapy-Splash
      • 4.2 配置 Scrapy
      • 4.3 使用 SplashRequest
    • 5. 常见问题与解决方案
      • 5.1 页面加载不完全
      • 5.2 内存不足
    • 6. 总结

Splash 是一个基于 JavaScript 的渲染服务,主要用于抓取动态网页内容。它能够执行 JavaScript 代码并返回渲染后的 HTML 内容,适用于需要处理动态加载内容的爬虫场景。以下是 Splash 的详细使用指南:

官方文档:https://splash.readthedocs.io/en/stable/

Splash_8">1. 安装与启动 Splash

1.1 使用 Docker 安装

Splash 推荐通过 Docker 安装和运行。

docker pull scrapinghub/splash
docker run -p 8050:8050 scrapinghub/splash

启动后,Splash 服务会运行在 http://localhost:8050。

1.2 直接安装

如果你不想使用 Docker,可以直接安装 Splashpip install scrapy-splash,然后启动 Splash 服务:

splash

2. 基本用法

Splash__25">2.1 访问 Splash 界面

在浏览器中访问 http://localhost:8050,可以看到 Splash 的 Web 界面。在这里,可以输入 URL 并查看渲染结果。

Splash__28">2.2 使用 Splash 渲染页面

通过 HTTP API 调用 Splash 渲染页面。以下是一个简单的示例:

curl 'http://localhost:8050/render.html?url=https://example.com&wait=2'

参数说明:

  • url: 需要渲染的页面 URL。
  • wait: 等待时间(秒),用于等待页面加载完成。

2.3 使用 Lua 脚本

Splash 支持通过 Lua 脚本自定义渲染逻辑。以下是一个简单的 Lua 脚本示例:

lua">function main(splash)
    splash:go("https://example.com")
    splash:wait(2)
    return splash:html()
end

通过 HTTP API 调用该脚本:

curl -X POST 'http://localhost:8050/execute' --data '{
    "lua_source": "function main(splash) splash:go(\"https://example.com\") splash:wait(2) return splash:html() end"
}'

3. 高级用法

3.1 处理 JavaScript

Splash 可以执行 JavaScript 代码并返回结果。以下是一个示例:

lua"># 样例1
function main(splash)
    splash:go("https://example.com")
    splash:wait(2)
    local title = splash:evaljs("document.title")
    return title
end

# 样例2
function main(splash)
    splash:go("https://example.com")
    splash:wait(0.5)
    splash:runjs("document.title = 'New Title';")
    return splash:html()
end

3.2 截图与 PDF

Splash 支持截取页面截图和生成 PDF 文件。

​截图:

lua">function main(splash)
    splash:go("https://example.com")
    splash:wait(2)
    return splash:png()
end

通过 HTTP API 请求截图:

curl -X POST 'http://localhost:8050/execute' --data '{
    "lua_source": "function main(splash) splash:go(\"https://example.com\") splash:wait(0.5) return splash:png() end"
}' --output screenshot.png

​生成 PDF:

lua">function main(splash)
    splash:go("https://example.com")
    splash:wait(2)
    return splash:pdf()
end

3.3 处理 AJAX 请求

Splash 可以等待 AJAX 请求完成后再返回结果。

lua">function main(splash)
    splash:go("https://example.com")
    splash:wait_for_resume('
        function() {
            setTimeout(function() {
                document.title = "New Title";
                splash.resume();
            }, 2000);
        }
    ')
    return splash:html()
end

3.4 设置请求头

可以通过 Lua 脚本设置请求头:

lua">function main(splash)
    splash:set_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")
    splash:go("https://example.com")
    splash:wait(2)
    return splash:html()
end

3.5 处理 Cookies

Splash 支持设置和获取 Cookies。

​设置 Cookies:

lua"># 样例1
function main(splash)
    splash:init_cookies({
        { name = "test", value = "123", domain = "example.com" }
    })
    splash:go("https://example.com")
    splash:wait(2)
    return splash:html()
end

# 样例2
function main(splash)
    splash:go("https://example.com")
    splash:wait(0.5)
    splash:set_cookie("name", "value", "/", "example.com")
    return splash:html()
end

​获取 Cookies:

lua">function main(splash)
    splash:go("https://example.com")
    splash:wait(2)
    local cookies = splash:get_cookies()
    return cookies
end

4. 与 Scrapy 集成

Scrapy 是一个强大的 Python 爬虫框架,可以通过 scrapy-splash 插件与 Splash 集成。

Splash_173">4.1 安装 Scrapy-Splash

pip install scrapy scrapy-splash

4.2 配置 Scrapy

在 settings.py 中添加以下配置:

python">SPLASH_URL = 'http://localhost:8050'

DOWNLOADER_MIDDLEWARES = {
    'scrapy_splash.SplashCookiesMiddleware': 723,
    'scrapy_splash.SplashMiddleware': 725,
    'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware': 810,
}

SPIDER_MIDDLEWARES = {
    'scrapy_splash.SplashDeduplicateArgsMiddleware': 100,
}

DUPEFILTER_CLASS = 'scrapy_splash.SplashAwareDupeFilter'
HTTPCACHE_STORAGE = 'scrapy_splash.SplashAwareFSCacheStorage'

SplashRequest_198">4.3 使用 SplashRequest

在 Scrapy 爬虫中使用 SplashRequest 渲染页面:

python">import scrapy
from scrapy_splash import SplashRequest

class MySpider(scrapy.Spider):
    name = 'example'
    start_urls = ['https://example.com']

    def start_requests(self):
        for url in self.start_urls:
            yield SplashRequest(url, self.parse, args={'wait': 2})

    def parse(self, response):
        title = response.css('title::text').get()
        yield {'title': title}

5. 常见问题与解决方案

5.1 页面加载不完全

原因: 页面内容可能通过 AJAX 动态加载。

解决方案: 增加 wait 参数,或使用 Lua 脚本等待特定元素出现。

5.2 内存不足

原因: 渲染大量页面可能导致内存不足。

解决方案: 增加 Docker 容器的内存限制,或优化 Lua 脚本减少内存使用。

6. 总结

Splash 是一个强大的工具,专为网页抓取和 JavaScript 渲染设计。通过本文的介绍,你应该已经掌握了 Splash 的基本用法和一些高级技巧。现在,你可以开始使用 Splash 来处理动态网页抓取任务了。


http://www.niftyadmin.cn/n/5869182.html

相关文章

日语学习-日语知识点小记-构建基础-JLPT-N4N5阶段(11): 助动词使用 なります&なりました:復習(ふくしゅう)

日语学习-日语知识点小记-构建基础-JLPT-N4&N5阶段(11): 助动词使用 & なります&なりました:復習(ふくしゅう)  1、前言(1)情况说明(2)工程师的信仰2、知识点(1)基本助词复习(2)なります&なりました:復習(ふくしゅう)3、单词(1)日语单词(2)…

git常用命令(时常更新)

Git基础 添加&#xff06;提交 分支管理 远程仓库 版本回退 处理冲突 暂存改动 git stash 其他常用Git命令 日常git流程&#xff1a; 日常使用 git init # 初始化仓库 git remote add origin <远程地址> # 绑定远程仓库 git checkout -b dev # 创建并切换分支 git a…

优选算法大集合(待更新)

1.双指针 1.1.移动零 leetcode链接&#xff1a;283. 移动零 - 力扣&#xff08;LeetCode&#xff09;​​​​​​ 移动零的问题我们可以将它归类为数组划分的问题&#xff0c;我们将数组划分为非零部分和零部分。我们会使用到双指针的算法&#xff0c;在这里&#xff0c;我…

【PyQt】图像处理系统

@[toc]pyqt实现图像处理系统 图像处理系统 1.创建阴影去除ui文件 2.阴影去除代码 1.创建阴影去除ui文件 UI文件效果图: 1.1QT Desiger设置组件 1.两个Pushbutton按钮 2.两个label来显示图像 3.Text Browser来显示输出信息 1.2布局的设置 1.先不使用任何Layout,把所…

从电子管到量子计算:计算机技术的未来趋势

计算机发展的历史 自古以来人类就在不断地发明和改进计算工具,从结绳计数到算盘,计算尺,手摇计算机,直到1946年第一台电子计算机诞生,虽然电子计算机至今虽然只有短短的半个多世纪,但取得了惊人的发展吗,已经经历了五代的变革。计算机的发展和电子技术的发展密切相关,…

日本IT|SQL工程师的工作内容以及所需的技能·资格

SQLエンジニアとは&#xff1f; 1.データベースの設計・開発、管理、運用を担うエンジニア データ抽出と整形 SQLエンジニアにおいて、データの抽出と整形は重要な仕事です。 リレーショナルデータベースではテーブルという形式でデータを管理しており、複数のテーブルから…

Android Realm数据库使用与集成指南

本地存储storage集成创建Realm数据模型插入和更新数据模型数据查询统计数据分页查询处理表数据删除操作总结Realm 是一款专为移动端和嵌入式场景设计的高性能、跨平台的 对象数据库(NoSQL),由 MongoDB 团队维护。它的核心思想是将数据模型直接映射到对象(如 Java/Kotlin、S…

第2课 树莓派镜像的烧录

树莓派的系统通常是安装在SD卡上的‌。SD卡作为启动设备,负责启动树莓派并加载操作系统。这种设计使得树莓派具有便携性和灵活性,用户可以通过更换SD卡来更换操作系统或恢复出厂设置。 烧录树莓派的镜像即是将树莓派镜像烧录到SD卡上,在此期间会格式化SD卡,如果SD卡…