一文掌握Splash的详细使用

news2025/2/26 22:59:53

文章目录

    • 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/

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,可以直接安装 Splash:pip install scrapy-splash,然后启动 Splash 服务:

splash

2. 基本用法

2.1 访问 Splash 界面

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

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 脚本示例:

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 代码并返回结果。以下是一个示例:

# 样例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 文件。

​截图:

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:

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

3.3 处理 AJAX 请求

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

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 脚本设置请求头:

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:

# 样例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:

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 集成。

4.1 安装 Scrapy-Splash

pip install scrapy scrapy-splash

4.2 配置 Scrapy

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

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'

4.3 使用 SplashRequest

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

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.coloradmin.cn/o/2306588.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MybatisPlus-扩展功能-枚举处理器

在Mybatis里有一个叫TypeHandler的类型处理器,我们常见的PO当中的这些成员变量的数据类型,它都有对应的处理器,因此它就能自动实现这些Java数据类型与数据库类型的相互转换。 它里面还有一个叫EnumOrdinalTypeHandler的枚举处理器&#xff0…

力扣2454. 下一个更大元素 IV

力扣2454. 下一个更大元素 IV 题目 题目解析及思路 题目要求对于每个数&#xff0c;找到右边比它大的第二个数&#xff0c;并记录在ans数组中 如果是右边第一个大的&#xff0c;就用一个递减栈即可&#xff0c;栈顶元素如果<当前元素则弹出 第二个大数就要利用弹出的栈顶…

unity学习51:所有UI的父物体:canvas画布

目录 1 下载资源 1.1 在window / Asset store下下载一套免费的UI资源 1.2 下载&#xff0c;导入import 1.3 导入后在 project / Asset下面可以看到 2 画布canvas&#xff0c;UI的父物体 2.1 创建canvas 2.1.1 画布的下面是 event system是UI相关的事件系统 2.2 canvas…

Ollama部署与常用命令

Ollama是一款开源工具&#xff0c;其目标是简化大语言模型在本地环境的部署和使用。它支持多种流行的开源大语言模型&#xff0c;如 Llama 2、Qwen2.5等。 通过Ollama&#xff0c;用户无需具备深厚的技术背景&#xff0c;就能在普通的消费级硬件上快速搭建一个强大的语言处理环…

Visual Studio Code 远程开发方法

方法1 共享屏幕远程控制&#xff0c;如 to desk, 向日葵 &#xff0c;像素太差&#xff0c;放弃 方法2 内网穿透 ssh 第二个方法又很麻烦&#xff0c;尤其是对于 windows 电脑&#xff0c;要使用 ssh 还需要额外安装杂七杂八的东西&#xff1b;并且内网穿透服务提供商提供的…

C语言预编译

大家好&#xff0c;这里是小编的博客频道 小编的博客&#xff1a;就爱学编程 很高兴在CSDN这个大家庭与大家相识&#xff0c;希望能在这里与大家共同进步&#xff0c;共同收获更好的自己&#xff01;&#xff01;&#xff01; 本文目录 引言正文一、预处理的作用与流程&#xf…

汽车智能制造企业数字化转型SAP解决方案总结

一、项目实施概述 项目阶段划分&#xff1a; 蓝图设计阶段主数据管理方案各模块蓝图设计方案下一阶段工作计划 关键里程碑&#xff1a; 2022年6月6日&#xff1a;项目启动会2022年12月1日&#xff1a;系统上线 二、总体目标 通过SAP实施&#xff0c;构建研产供销协同、业财一…

flowable-ui 的会签功能实现

场景&#xff1a;在进行智慧保时通开发时&#xff0c;有个协作合同入围功能&#xff0c;这个功能的流程图里有个评审小组&#xff0c;这个评审小组就需要进行会签操作&#xff0c;会签完成后&#xff0c;需要依据是否有不通过的情况选择下一步走的流程 思考步骤&#xff1a; 首…

大连指令数据集的创建--数据收集与预处理_02

1.去哪儿爬虫 编程语言&#xff1a;Python爬虫框架&#xff1a;Selenium&#xff08;用于浏览器自动化&#xff09;解析库&#xff1a;BeautifulSoup&#xff08;用于解析HTML&#xff09; 2.爬虫策略 目标网站&#xff1a;去哪儿&#xff08;https://travel.qunar.com/trav…

STM32MP157A-FSMP1A单片机移植Linux系统SPI总线驱动

SPI总线驱动整体上与I2C总线驱动类型&#xff0c;差别主要在设备树和数据传输上&#xff0c;由于SPI是由4根线实现主从机的通信&#xff0c;在设备树上配置时需要对SPI进行设置。 原理图可知&#xff0c;数码管使用的SPI4对应了单片机上的PE11-->SPI4-NSS,PE12-->SPI4-S…

java医院多维度综合绩效考核源码,医院绩效管理系统,支持一键核算和批量操作,设有审核机制,允许数据修正

医院绩效考核管理系统&#xff0c;java医院绩效核算系统源码&#xff0c;采用多维度综合绩效考核的形式&#xff0c;针对院内实际情况分别对工作量、KPI指标、科研、教学、管理等进行全面考核。医院可结合实际需求&#xff0c;对考核方案中各维度进行灵活配置&#xff0c;对各维…

C语言学习笔记-初阶(13)scanf介绍

当我们有了变量&#xff0c;我们需要给变量输入值就可以使用 scanf 函数&#xff0c;如果需要将变量的值输出在屏幕上的时候可以使用 printf 函数&#xff0c;下面看⼀个例子&#xff1a; #include <stdio.h> int main() {int score 0;printf("请输⼊成绩:")…

如何让传统制造企业从0到1实现数字化突破?

随着全球制造业不断向智能化、数字化转型&#xff0c;传统制造企业面临着前所未有的机遇与挑战。数字化转型不仅是技术的革新&#xff0c;更是管理、文化、业务流程等全方位的变革。从零开始&#xff0c;如何带领一家传统制造企业走向数字化突破&#xff0c;是许多企业领导者面…

【HarmonyOS Next】鸿蒙应用公钥和证书MD5指纹的获取

【HarmonyOS Next】鸿蒙应用公钥和证书MD5指纹的获取 一、问题背景 政府的icp备案时&#xff0c;或者某些三方SDK以来的管理后台&#xff0c;都需要配置鸿蒙应用的公钥和证书MD5指纹 二、解决方案 专有名词解释&#xff1a; 华为AppGallery Connect简称 AGC平台&#xff0…

【原创工具】同文件夹PDF文件合并 By怜渠客

【原创工具】同文件夹PDF文件合并 By怜渠客 原贴&#xff1a;可批量合并多个文件夹内的pdf工具 - 吾爱破解 - 52pojie.cn 他这个存在一些问题&#xff0c;并非是软件内自主实现的PDF合并&#xff0c;而是调用的pdftk这一工具&#xff0c;但楼主并没有提供pdftk&#xff0c;而…

【红队利器】单文件一键结束火绒6.0

关于我们 4SecNet 团队专注于网络安全攻防研究&#xff0c;目前团队成员分布在国内多家顶级安全厂商的核心部门&#xff0c;包括安全研究领域、攻防实验室等&#xff0c;汇聚了行业内的顶尖技术力量。团队在病毒木马逆向分析、APT 追踪、破解技术、漏洞分析、红队工具开发等多个…

Linux中文件目录类指令

1、pwd指令 基本语法&#xff1a;pwd 功能&#xff1a;显示当前工作目录的绝对路径 1.相对路径访问和绝对路径访问 当前处于home目录下&#xff0c;访问a.txt文件 相对路径访问&#xff1a;kim/better/a.txt&#xff0c;从当前位置开始定位 绝对路径访问&#xff1a;/home…

开源模型应用落地-LangChain实用小技巧-获取token消耗(五)

一、前言 在当今的自然语言处理领域&#xff0c;LangChain 框架因其强大的功能和灵活性而备受关注。掌握一些实用的小技巧&#xff0c;能够让您在使用 LangChain 框架时更加得心应手&#xff0c;从而更高效地开发出优质的自然语言处理应用。 计算 Token 消耗对有效管理和优化语…

LangChain大模型应用开发:LangGraph快速构建Agent工作流应用

介绍 大家好&#xff0c;博主又来给大家分享知识了。今天给大家分享的内容是使用LangChain进行大规模应用开发中的LangGraph快速构建Agent工作流应用。 通过对前几次对LangChain的技术分享。我们知道LangChain作为一个强大的工具集&#xff0c;为开发者们提供了丰富的资源和便…

鸿蒙Next-方法装饰器以及防抖方法注解实现

以下是关于 鸿蒙Next&#xff08;HarmonyOS NEXT&#xff09;中 MethodDecorator 的详细介绍及使用指南&#xff0c;结合了多个技术来源的实践总结&#xff1a; 一、MethodDecorator 的概念与作用 MethodDecorator 是鸿蒙Next框架中用于装饰类方法的装饰器&#xff0c;属于 Ark…