一文掌握Splash的详细使用
文章目录
- 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 SplashRequestclass 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 来处理动态网页抓取任务了。
相关文章:
一文掌握Splash的详细使用
文章目录 1. 安装与启动 Splash1.1 使用 Docker 安装1.2 直接安装 2. 基本用法2.1 访问 Splash 界面2.2 使用 Splash 渲染页面2.3 使用 Lua 脚本 3. 高级用法3.1 处理 JavaScript3.2 截图与 PDF3.3 处理 AJAX 请求3.4 设置请求头3.5 处理 Cookies 4. 与 Scrapy 集成4.1 安装 Sc…...
从 Linux 服务器到前端到网关到后端业务逻辑的分析
前言 在现代 Web 应用程序的架构中,一个完整的请求处理流程涉及多个组件,涵盖了用户界面、服务器环境、网关层和后端业务逻辑。理解这一过程有助于优化系统性能、提高用户体验,并确保系统的可维护性和可扩展性。本文将详细分析从 Linux 服务…...
Java中的Stream API:从入门到实战
引言 在现代Java开发中,Stream API 是处理集合数据的强大工具。它不仅让代码更加简洁易读,还能通过并行处理提升性能。本文将带你从基础概念入手,逐步深入Stream API的使用,并通过实战案例展示其强大功能。 1. 什么是Stream API…...
【python随手记】——读取文本文件内容转换为json格式
文章目录 前言一、TXT文件转换为JSON数组1.txt文件内容2.python代码3.输出结果 二、TXT文件转换为JSON对象1.txt文件2.python代码3.输出结果 前言 场景:用于读取包含空格分隔数据的TXT文件,并将其转换为结构化JSON文件 一、TXT文件转换为JSON数组 1.tx…...
【蓝桥杯】第十五届省赛大学真题组真题解析
【蓝桥杯】第十五届省赛大学真题组真题解析 一、智能停车系统 1、知识点 (1)flex-wrap 控制子元素的换行方式 属性值有: no-wrap不换行wrap伸缩容器不够则自动往下换行wrap-reverse伸缩容器不够则自动往上换行 (2࿰…...
MybatisPlus-扩展功能-枚举处理器
在Mybatis里有一个叫TypeHandler的类型处理器,我们常见的PO当中的这些成员变量的数据类型,它都有对应的处理器,因此它就能自动实现这些Java数据类型与数据库类型的相互转换。 它里面还有一个叫EnumOrdinalTypeHandler的枚举处理器࿰…...
力扣2454. 下一个更大元素 IV
力扣2454. 下一个更大元素 IV 题目 题目解析及思路 题目要求对于每个数,找到右边比它大的第二个数,并记录在ans数组中 如果是右边第一个大的,就用一个递减栈即可,栈顶元素如果<当前元素则弹出 第二个大数就要利用弹出的栈顶…...
unity学习51:所有UI的父物体:canvas画布
目录 1 下载资源 1.1 在window / Asset store下下载一套免费的UI资源 1.2 下载,导入import 1.3 导入后在 project / Asset下面可以看到 2 画布canvas,UI的父物体 2.1 创建canvas 2.1.1 画布的下面是 event system是UI相关的事件系统 2.2 canvas…...
Ollama部署与常用命令
Ollama是一款开源工具,其目标是简化大语言模型在本地环境的部署和使用。它支持多种流行的开源大语言模型,如 Llama 2、Qwen2.5等。 通过Ollama,用户无需具备深厚的技术背景,就能在普通的消费级硬件上快速搭建一个强大的语言处理环…...
Visual Studio Code 远程开发方法
方法1 共享屏幕远程控制,如 to desk, 向日葵 ,像素太差,放弃 方法2 内网穿透 ssh 第二个方法又很麻烦,尤其是对于 windows 电脑,要使用 ssh 还需要额外安装杂七杂八的东西;并且内网穿透服务提供商提供的…...
C语言预编译
大家好,这里是小编的博客频道 小编的博客:就爱学编程 很高兴在CSDN这个大家庭与大家相识,希望能在这里与大家共同进步,共同收获更好的自己!!! 本文目录 引言正文一、预处理的作用与流程…...
汽车智能制造企业数字化转型SAP解决方案总结
一、项目实施概述 项目阶段划分: 蓝图设计阶段主数据管理方案各模块蓝图设计方案下一阶段工作计划 关键里程碑: 2022年6月6日:项目启动会2022年12月1日:系统上线 二、总体目标 通过SAP实施,构建研产供销协同、业财一…...
flowable-ui 的会签功能实现
场景:在进行智慧保时通开发时,有个协作合同入围功能,这个功能的流程图里有个评审小组,这个评审小组就需要进行会签操作,会签完成后,需要依据是否有不通过的情况选择下一步走的流程 思考步骤: 首…...
Spring Boot 与 MyBatis 数据库操作
一、核心原理 Spring Boot 的自动配置 通过 mybatis-spring-boot-starter 自动配置 DataSource(连接池)、SqlSessionFactory 和 SqlSessionTemplate。 扫描 Mapper 接口或指定包路径,生成动态代理实现类。 MyBatis 的核心组件 SqlSessionF…...
大连指令数据集的创建--数据收集与预处理_02
1.去哪儿爬虫 编程语言:Python爬虫框架:Selenium(用于浏览器自动化)解析库:BeautifulSoup(用于解析HTML) 2.爬虫策略 目标网站:去哪儿(https://travel.qunar.com/trav…...
vLLM专题(十四)-自动前缀缓存
一、介绍 自动前缀缓存(Automatic Prefix Caching,简称 APC)缓存现有查询的 KV 缓存,以便新查询如果与现有查询共享相同的前缀,可以直接重用 KV 缓存,从而跳过共享部分的计算。 注意 有关 vLLM 如何实现 APC 的技术细节,请参阅此处。 二、在 vLLM 中启用 APC 在 vLLM …...
STM32MP157A-FSMP1A单片机移植Linux系统SPI总线驱动
SPI总线驱动整体上与I2C总线驱动类型,差别主要在设备树和数据传输上,由于SPI是由4根线实现主从机的通信,在设备树上配置时需要对SPI进行设置。 原理图可知,数码管使用的SPI4对应了单片机上的PE11-->SPI4-NSS,PE12-->SPI4-S…...
linux-c 字节序问题--大小端
今天面试被问了一个网络字节系列的问题分享一下: 1.如何将Int转换成byte数组在网络上传输。 2.计算机世界里的大小端问题。 计算机世界里为什么有大小端 硬件设计因素 CPU 架构差异 不同的 CPU 架构在设计时,对于多字节数据在内存中的存储顺序…...
java医院多维度综合绩效考核源码,医院绩效管理系统,支持一键核算和批量操作,设有审核机制,允许数据修正
医院绩效考核管理系统,java医院绩效核算系统源码,采用多维度综合绩效考核的形式,针对院内实际情况分别对工作量、KPI指标、科研、教学、管理等进行全面考核。医院可结合实际需求,对考核方案中各维度进行灵活配置,对各维…...
C语言学习笔记-初阶(13)scanf介绍
当我们有了变量,我们需要给变量输入值就可以使用 scanf 函数,如果需要将变量的值输出在屏幕上的时候可以使用 printf 函数,下面看⼀个例子: #include <stdio.h> int main() {int score 0;printf("请输⼊成绩:")…...
Android MMKV集成指南
首先简单介绍一下MMKV当下Android Studio最版本及Gradle8.7 MMKV集成根据官方文档重新对mmkv重新包了一次(便于开发)总结首先简单介绍一下MMKV MMKV 是腾讯开源的一款专为移动端设计的高性能键值存储组件,旨在替代传统的 SharedPreferences 和 SQLite,尤其在频繁读写和数据…...
如何让传统制造企业从0到1实现数字化突破?
随着全球制造业不断向智能化、数字化转型,传统制造企业面临着前所未有的机遇与挑战。数字化转型不仅是技术的革新,更是管理、文化、业务流程等全方位的变革。从零开始,如何带领一家传统制造企业走向数字化突破,是许多企业领导者面…...
Centos7安装Python3.13
Centos7.5环境上安装Python3.13 # 安装依赖 yum install -y zlib zlib-devel openssl-devel sqlite-devel bzip2-devel libffi libffi-devel gcc gcc-c mkdir -p /opt/software cd /opt/software # openssl高版本安装 # 如果 Centos7 系统默认自带的 openssl 版本太低…...
C++之string类的模拟实现(超详细)
们学习东西,先学习如果使用它,然后再学习如何实现它 文章目录 目录 1. 命名空间以及头文件 2.string类的成员变量 3.string类的成员函数 3.1 构造函数 3.2 析构函数 3.3 拷贝构造函数 3.4 赋值运算符重载 3.5 c_str函数 3.6 size函数 3.7 clea…...
【HarmonyOS Next】鸿蒙应用公钥和证书MD5指纹的获取
【HarmonyOS Next】鸿蒙应用公钥和证书MD5指纹的获取 一、问题背景 政府的icp备案时,或者某些三方SDK以来的管理后台,都需要配置鸿蒙应用的公钥和证书MD5指纹 二、解决方案 专有名词解释: 华为AppGallery Connect简称 AGC平台࿰…...
【原创工具】同文件夹PDF文件合并 By怜渠客
【原创工具】同文件夹PDF文件合并 By怜渠客 原贴:可批量合并多个文件夹内的pdf工具 - 吾爱破解 - 52pojie.cn 他这个存在一些问题,并非是软件内自主实现的PDF合并,而是调用的pdftk这一工具,但楼主并没有提供pdftk,而…...
【红队利器】单文件一键结束火绒6.0
关于我们 4SecNet 团队专注于网络安全攻防研究,目前团队成员分布在国内多家顶级安全厂商的核心部门,包括安全研究领域、攻防实验室等,汇聚了行业内的顶尖技术力量。团队在病毒木马逆向分析、APT 追踪、破解技术、漏洞分析、红队工具开发等多个…...
Linux中文件目录类指令
1、pwd指令 基本语法:pwd 功能:显示当前工作目录的绝对路径 1.相对路径访问和绝对路径访问 当前处于home目录下,访问a.txt文件 相对路径访问:kim/better/a.txt,从当前位置开始定位 绝对路径访问:/home…...
vue2项目打包后js文件过大, 首次加载缓慢
vue2项目打包后js文件过大, 首次加载缓慢 安装插件 npm i compression-webpack-plugin6.1.1 -D配置vue.config.js const CompressionWebpackPlugin require(compression-webpack-plugin)module.exports {configureWebpack: {plugins:[new CompressionWebpackPlugin({filen…...
【DeepSeek】-macOS本地终端部署后运行DeepSeek如何分析图片
【DeepSeek】-macOS本地终端部署后运行DeepSeek如何分析图片 根据您的需求,目前需要了解以下几个关键点及分步解决方案: --- 一、现状分析 1. Ollama 的限制: - 目前Ollama主要面向文本大模型,原生不支持直接上传/处理图片 …...
