一文掌握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 来处理动态网页抓取任务了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/24247.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【NLP 23、预训练语言模型】

人类发明后悔,来证明拥有的珍贵 —— 25.1.15 Bert的优势:① 预训练思想 ② Transformer模型结构 一、传统方法 VS 预训练方式 Pre-train: ① 收集海量无标注文本数据 ② 进行模型预训练,并在任务模型中使用 Fine-tune&#xff1a…

嵌入式硬件基础知识

1.电阻(主要是贴片电阻) 01 基础课程-电阻 1.电阻封装 2.相关参数 1.功率额定值: 电阻能够长期承受的最大功率,功率过大可能导致电阻过热或损坏。封装尺寸越大,散热能力越强,功率额定值通常越高。 2.容差: 电阻…

VMware建立linux虚拟机

本文适用于初学者,帮助初学者学习如何创建虚拟机,了解在创建过程中各个选项的含义。 环境如下: CentOS版本: CentOS 7.9(2009) 软件: VMware Workstation 17 Pro 17.5.0 build-22583795 1.配…

DeepSeek+Kimi 一键生成100种PPT

一 简介 PPT在工作中经常用到,无论是给老板汇报,还是同事、朋友之间的分享,或是去见投资人:) ,都离不开它,然而写PPT经常让人感觉不胜其烦,无论是逻辑的展开、还是页面的布局、字体、配图,都像个…

循环神经网络rnn

1.了解词嵌入层的作用 2.了解循环网络层的作用 1.词嵌入层 将文本进行数值化,词嵌入层首先会根据输入的词的数量构建一个词向量矩阵,例如:我们有 100 个词,每个词希望转换成 128 维度的向量,那么构建的矩阵形状即为:100*128,输入…

雷池WAF动态防护技术实测

作者; Hacker / 0xh4ck3r 介绍 长亭雷池(SafeLine)是由北京长亭科技有限公司耗时近10年研发并推出的Web应用防火墙(WAF),其核心检测能力由智能语义分析算法驱动。雷池旨在为用户提供高质量的Web攻击防护、…

MATLAB应用介绍

MATLAB 数据分析 MATLAB 在数据分析方面的强大功能和优势,涵盖数据处理、分析、可视化、结果分享等多个环节,为工程师和科学家提供了全面的数据分析解决方案。 MATLAB 数据分析功能概述:工程师和科学家利用 MATLAB 整理、清理和分析来自气候学…

玩机日记 14 飞牛fnOS部署qBittorrent、AList、Jellyfin,实现下载、存取、刮削、观看一体的家庭影音中心

目录 观前提示: 1、前置条件 2、安装配置qBittorrent 简单配置 延时启动 配置AList的离线下载 配置qBittorrent不走代理 3、安装配置Jellyfin 建立媒体库目录 安装Jellyfin 配置Jellyfin媒体库 打开硬件解码 启用备用字体 配置Jellyfin的SSL 观前提示&…

基于全志T527+FPGA全国产异步LED显示屏控制卡/屏幕拼接解决方案

T527FPGA方案: 内置8核Cortex-A55,主频最高1.8Ghz;G57 MC1 GPU,2Tops算力NPU;同时内置1RISC-V2DSP核,拥有4K高清解码强大性能,配备多种显示接口与2千兆以太网口,4RS485(…

电脑键盘知识

1、键盘四大功能区 1. 功能区 2. 主要信息输入区 3. 编辑区 4. 数字键盘区 笔记本电脑键盘的功能区,使用前需先按Fn键 1.1、功能区 ESC:退出 F1:显示帮助信息 F2:重命名 F4:重复上一步操作 F5:刷新网页 …

代码审计入门学习

简介 HadSky轻论坛程序为个人原创PHP系统,作者为蒲乐天,后端基于puyuetianPHP框架驱动,前端基于 puyuetianUI框架驱动,默认编辑器为puyuetianEditor富文本编辑器,其他非原创框架及驱动JQuery.js 及Font-Awesome字体库…

基于 C++ Qt 的 Fluent Design 组件库 QFluentWidgets

简介 QFluentWidgets 是一个基于 Qt 的 Fluent Designer 组件库,内置超过 150 个开箱即用的 Fluent Designer 组件,支持亮暗主题无缝切换和自定义主题色。 编译示例 以 Qt5 为例(Qt6 也支持),将 libQFluentWidgets.d…

架构思维:分布式缓存_提升系统性能的关键手段(上)

文章目录 引言一、缓存的特点二、缓存的关键指标-命中率三、缓存的使用场景四、缓存的种类与应用五、缓存存储:哈希表实现六、分布式缓存与一致性哈希七、优化缓存性能总结 引言 分布式架构 缓存技术作为架构设计中重要的性能优化手段,在现代互联网系统…

C# 打印Word文档 – 4种打印方法

Word文档是日常办公和学习中不可或缺的一部分。比如在商务往来中,经常需要打印 Word 文档用于撰写和传递正式的商务信函、合作协议、项目提案等。打印出来的文档便于双方签字盖章,具有法律效力和正式性。本文将提供以下4种通过C# 打印Word文档的方法&…

数据结构(陈越,何钦铭) 第四讲 树(中)

4.1 二叉搜索树 4.1.1 二叉搜索树及查找 Position Find(ElementTyoe X,BinTree BST){if(!BST){return NULL;}if(X>BST->Data){return Find(X,BST->Right)}else if(X<BST->Data){return Find(X,BST->Left)}else{return BST;} } Position IterFind(ElementTyp…

网络空间安全(1)web应用程序的发展历程

前言 Web应用程序的发展历程是一部技术创新与社会变革交织的长卷&#xff0c;从简单的文档共享系统到如今复杂、交互式、数据驱动的平台&#xff0c;经历了多个重要阶段。 一、起源与初期发展&#xff08;1989-1995年&#xff09; Web的诞生&#xff1a; 1989年&#xff0c;欧洲…

【Matlab仿真】Matlab Function中如何使用静态变量?

背景 根据Simulink的运行机制&#xff0c;每个采样点会调用一次MATLAB Function的函数&#xff0c;两次调用之间&#xff0c;同一个变量的前次计算的终值如何传递到当前计算周期来&#xff1f;其实可以使用persistent变量实现函数退出和进入时内部变量值的保持。 persistent变…

网络安全 linux学习计划 linux网络安全精要

2.使用命令行 文件系统层次标准&#xff08;FHS&#xff09;是一个文件和目录在Unix和Linux操作系统上面应该如何存储的定义。 /bin 重要的二进制可执行程序/boot 与系统启动有关的文件/etc 系统配置文件/home 普通用户家目录/lib 重要的系统库/media 可移动介质的挂载路径/m…

基于SSM的《计算机网络》题库管理系统(源码+lw+部署文档+讲解),源码可白嫖!

摘 要 《计算机网络》题库管理系统是一种新颖的考试管理模式&#xff0c;因为系统是用Java技术进行开发。系统分为三个用户进行登录并操作&#xff0c;分别是管理员、教师和学生。教师在系统后台新增试题和试卷&#xff0c;学生进行在线考试&#xff0c;还能对考生记录、错题…

Pretraining Language Models with Text-Attributed Heterogeneous Graphs

Pretraining Language Models with Text-Attributed Heterogeneous Graphs EMNLP 推荐指数&#xff1a;#paper/⭐⭐#​ 贡献&#xff1a; 我们研究了在更复杂的数据结构上预训练LM的问题&#xff0c;即&#xff0c;TAHG。与大多数只能从每个节点的文本描述中学习的PLM不同&…