当前位置: 首页 > news >正文

Python爬虫第19节-动态渲染页面抓取之Splash使用下篇

目录

前言

一、Splash 对象方法(后续)

二、Splash HTTP API 调用

三、Splash 负载均衡配置


前言

        在网页数据抓取过程中,面对动态渲染的页面,Splash 工具凭借其强大的功能和灵活性,成为了开发者的得力助手。本文将继续上节的讲解,详细介绍 Splash 的对象方法、HTTP API 调用以及负载均衡配置,帮助你更好地利用 Splash 实现高效的页面抓取。

一、Splash 对象方法(后续)

(一)内容与资源操作

1. `set_content`:该方法可直接设置页面内容,常用于测试或模拟特定页面结构。

function main(splash)assert(splash:set_content("<html><body><h1>hello</h1></body></html>"))return splash:png()
end

运行此脚本会生成包含 `<h1>hello</h1>` 的页面截图。

2. `html`:用于获取渲染后的页面源代码。

function main(splash, args)splash:go("https://httpbin.org/get")return splash:html()
end

返回的是包含请求头、响应数据的 HTML 文本。

3. `png`/`jpeg`:分别用于获取页面的 PNG 和 JPEG 格式截图。JPEG 格式还支持设置质量参数。

-- PNG 截图
function main(splash, args)splash:go("https://www.taobao.com")return splash:png()
end-- JPEG 截图(支持质量参数)
function main(splash, args)splash:go("https://www.taobao.com")return splash:jpeg{quality=80}
end

4. `har`:获取页面加载过程的 HAR 格式日志,包含资源请求详情,如 CSS、JS 等资源的加载时间、状态码等。

function main(splash, args)splash:go("https://www.baidu.com")return splash:har()
end

(二)浏览器状态操作

1. `url`:获取当前页面的 URL。

function main(splash, args)splash:go("https://www.baidu.com")return splash:url()
end

2. `get_cookies`/`add_cookie`/`clear_cookies`
    - `get_cookies`:获取当前页面的 Cookies。

function main(splash, args)splash:go("https://www.baidu.com")return splash:get_cookies()
end

  - `add_cookie`:添加自定义 Cookie。

function main(splash)splash:add_cookie{name="sessionid",value="237465ghgfsd",path="/",domain="http://example.com"}splash:go("http://example.com/")return splash:html()
end


    - `clear_cookies`:清空所有 Cookies。

function main(splash)splash:go("https://www.baidu.com/")splash:clear_cookies()return splash:get_cookies()
end

(三)浏览器配置操作

1. `get_viewport_size`/`set_viewport_size`/`set_viewport_full`
    - `get_viewport_size`:获取当前视口尺寸(宽高)。

function main(splash)splash:go("https://www.baidu.com/")return splash:get_viewport_size()
end

    - `set_viewport_size`:设置视口尺寸。

function main(splash)splash:set_viewport_size(400, 700)assert(splash:go("https://linshantang.blog.csdn.net/"))return splash:png()
end

    - `set_viewport_full`:设置全屏视口。

function main(splash)splash:set_viewport_full()assert(splash:go("https://linshantang.blog.csdn.net/"))return splash:png()
end

2. `set_user_agent`/`set_custom_headers`
    - `set_user_agent`:设置请求的 User - Agent。

function main(splash)splash:set_user_agent('Splash')splash:go("http://httpbin.org/get")return splash:html()
end

    - `set_custom_headers`:设置任意请求头字段。

function main(splash)splash:set_custom_headers{["User-Agent"] = "Splash",["Site"] = "Splash"}splash:go("http://httpbin.org/get")return splash:html()
end

(四)页面元素操作

1. `select`/`select_all`
    - `select`:通过 CSS 选择器选取首个匹配元素。

function main(splash)splash:go("https://www.baidu.com/")local input = splash:select("#kw")input:send_text('Splash')splash:wait(3)return splash:png()
end

    - `select_all`:选取所有匹配元素并遍历。

function main(splash)local treat = require('treat')assert(splash:go("http://quotes.toscrape.com/"))local texts = splash:select_all('.quote .text')local results = {}for index, text in ipairs(texts) doresults[index] = text.node.innerHTMLendreturn treat.as_array(results)
end

2. `mouse_click`:模拟鼠标点击元素,支持坐标或元素对象。

function main(splash)splash:go("https://www.baidu.com/")local input = splash:select("#kw")input:send_text('Splash')local submit = splash:select('#su')submit:mouse_click()splash:wait(3)return splash:png()
end

二、Splash HTTP API 调用

(一)基础接口:获取渲染结果

1. `render.html`:获取渲染后的 HTML 源码。

curl http://localhost:8050/render.html?url=https://www.baidu.com&wait=2
import requests
url = "http://localhost:8050/render.html?url=https://www.taobao.com&wait=5"
print(requests.get(url).text)

2. `render.png`/`render.jpeg`:获取截图,支持尺寸和质量参数。

response = requests.get("http://localhost:8050/render.png?url=https://www.jd.com&width=1000&height=700")
with open("jd.png", "wb") as f:f.write(response.content)

 3. `render.har`/`render.json`
    - `render.har`:获取 HAR 格式的加载日志。

curl http://localhost:8050/render.har?url=https://www.jd.com&wait=5

     - `render.json`**:获取综合 JSON 数据,支持 `html`、`png`、`har` 等参数。

curl http://localhost:8050/render.json?url=https://httpbin.org&html=1&har=1

(二)高级接口:执行 Lua 脚本

`execute`:通过 URL 传递 Lua 脚本,实现复杂交互逻辑。

curl "http://localhost:8050/execute?lua_source=$(echo 'function main(splash) return \"hello\" end' | urlencode)"
import requests
from urllib.parse import quotelua_script = """
function main(splash, args)local response = splash:http_get("http://httpbin.org/get")return {status=response.status, url=response.url}
end
"""
url = f"http://localhost:8050/execute?lua_source={quote(lua_script)}"
print(requests.get(url).json())

(三)核心优势与适用场景

1. 优势
    - 异步处理提升效率,支持分布式部署。
    - 轻量级架构,资源占用低于 Selenium。
    - 灵活的 Lua 脚本控制,支持复杂交互。
2. 场景
    - 动态数据抓取(如电商价格、社交媒体动态)。
    - 单页应用(SPA)爬取。
    - 性能分析与资源加载优化。

三、Splash 负载均衡配置

(一)准备多个 Splash 服务节点

        当爬取任务量较大时,单节点 Splash 服务可能面临性能瓶颈。此时需要搭建负载均衡集群,将请求分发到多个 Splash 实例。示例中使用 4 个节点,服务地址分别为 41.159.27.223:8050、41.159.27.221:8050、41.159.27.9:8050 和 41.159.117.119:8050,通过 Docker 运行 Splash 镜像启动服务,确保各节点服务完全一致。

(二)配置 Nginx 负载均衡器

        选择一台具有公网 IP 的主机作为负载均衡节点,安装并配置 Nginx。修改 Nginx 配置文件 `nginx.conf`,在 `http` 块中定义上游服务集群(`upstream`),可根据不同场景选择不同的负载均衡策略。
1. 最少连接数(`least_conn`):适用于请求处理时间不均的场景,优先分配给当前连接数最少的节点。

nginx配置:

http {upstream splash_cluster {least_conn;server 41.159.27.223:8050;server 41.159.27.221:8050;server 41.159.27.9:8050;server 41.159.117.119:8050;}server {listen 8050;location / {proxy_pass http://splash_cluster;}}
}

2. 轮询(默认策略):无状态且服务器配置相同时使用,请求按顺序均匀分配。

nginx 配置:

upstream splash_cluster {server 41.159.27.223:8050;server 41.159.27.221:8050;server 41.159.27.9:8050;server 41.159.117.119:8050;
}

3. 权重分配(`weight`):根据服务器性能分配请求比例,`weight` 越高分配越多。

nginx 配置:

upstream splash_cluster {server 41.159.27.223:8050 weight=4;server 41.159.27.221:8050 weight=2;server 41.159.27.9:8050 weight=2;server 41.159.117.119:8050 weight=1;
}

4. IP 散列(`ip_hash`):根据客户端 IP 地址哈希分配,确保同一客户端始终访问同一节点,适用于有状态服务。
nginx 配置:

upstream splash_cluster {ip_hash;server 41.159.27.223:8050;server 41.159.27.221:8050;server 41.159.27.9:8050;server 41.159.117.119:8050;
}

        配置完成后,执行 `sudo nginx -s reload` 重新加载配置。访问 Nginx 服务器的 8050 端口,请求将自动分发到后端 Splash 节点。

(三)配置访问认证(可选)

        为避免公开访问,可通过 Nginx 配置 Basic Auth 认证。在 `server` 块的 `location` 中添加认证字段:
nginx 配置:

server {listen 8050;location / {proxy_pass http://splash_cluster;auth_basic "Restricted Access";auth_basic_user_file /etc/nginx/conf.d/.htpasswd;}
}

使用 `htpasswd` 工具生成用户密码:

sudo apt-get install apache2-utils
htpasswd -c /etc/nginx/conf.d/.htpasswd admin

        按提示输入密码,生成 `.htpasswd` 文件。执行 `sudo nginx -s reload` 使认证生效,访问时需提供用户名和密码。

(四)负载均衡测试

        通过代码验证请求是否均匀分发到不同 Splash 节点。

import requests
import re
from urllib.parse import quotelua_script = """
function main(splash, args)local response = splash:http_get("http://httpbin.org/get")return response.body
end
"""nginx_ip = "192.168.1.100"
url = f"http://{nginx_ip}:8050/execute?lua_source={quote(lua_script)}"response = requests.get(url, auth=("admin", "your-password"))ip = re.search(r'"origin": "(\d+\.\d+\.\d+\.\d+)"', response.text).group(1)
print(f"当前请求节点 IP:{ip}")

        多次运行脚本,输出的 `ip` 应随机或按策略分布在不同 Splash 节点,证明负载均衡生效。

(五)总结

        负载均衡配置具有分散单节点压力、提升并发处理能力、支持动态扩展节点数量以及结合 Nginx 实现高可用性和灵活策略等优势。但需注意确保所有 Splash 节点配置一致,根据业务场景选择合适的负载均衡策略,生产环境建议搭配监控工具实时监测节点状态。

        通过以上介绍的 Splash 对象方法、HTTP API 调用以及负载均衡配置,开发者可以结合 Python 和 Splash 实现高效的动态页面抓取,满足从简单渲染到复杂交互的各类需求。同时,官方文档 [Splash Lua API 文档](https://splash.readthedocs.io/en/stable/scripting-ref.html)、[页面元素操作指南](https://splash.readthedocs.io/en/stable/scripting-element-object.html) 和 [HTTP API 详细说明](https://splash.readthedocs.io/en/stable/api.html) 提供了更详细和权威的信息,可进一步参考。

 

相关文章:

  • React-组件和props
  • 【Python爬虫实战篇】--Selenium爬取Mysteel数据
  • Cephalon端脑云:神经形态计算+边缘AI·重定义云端算力
  • 网页版 deepseek 对话问答内容导出为 PDF 文件和 Word 文件的浏览器插件下载安装和使用说明
  • spark-streaming(二)
  • NeRF:原理 + 实现 + 实践全流程配置+数据集测试【Ubuntu20.04 】【2025最新版】
  • 【1区SCI】Fusion entropy融合熵,多尺度,复合多尺度、时移多尺度、层次 + 故障识别、诊断-matlab代码
  • CE第一次作业
  • 协作开发攻略:Git全面使用指南 — 第一部分 Git基础
  • 3台CentOS虚拟机部署 StarRocks 1 FE+ 3 BE集群
  • 与终端同居日记:Shell交响曲の终极共舞指南
  • 海量聊天消息处理:ShardingJDBC分库分表、ClickHouse冷热数据分离、ES复合查询方案、Flink实时计算与SpringCloud集成
  • C++ RPC以及cmake
  • Oracle 11g RAC ASM磁盘组剔盘、加盘实施过程
  • 基于 CentOS 的 Docker Swarm 集群管理实战指南
  • CentOS 7 基于 Nginx 的 HTML 部署全流程指南
  • 智能吸顶灯/摄影补光灯专用!FP7195双通道LED驱动,高效节能省空间 !
  • 保姆级教程:用EndNote 20让参考文献自动分组排序(中文在前,英文在后)
  • 【bug修复】一次诡异的接口数据显示 bug 排查之旅
  • Java高频面试之并发编程-07
  • 为何不当教练转型高校管理岗?苏炳添曾吐露过真实的想法
  • 韩国京畿道骊州市市长率团访问菏泽:想和菏泽一起办牡丹节
  • 从篆刻书画到装帧设计,再看钱君匋的“艺兼众美”
  • 魔都眼·上海车展④|奔驰宝马保时捷……全球豪车扎堆首秀
  • 解放日报:上海一季度GDP同比增长5.1%,两大新动能助推经济“开门红”
  • 牛市早报|外汇局:4月以来外汇市场交易保持平稳,跨境资金延续净流入