golang爬虫使用splash进行JS渲染服务

这篇具有很好参考价值的文章主要介绍了golang爬虫使用splash进行JS渲染服务。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

起因

发现之前写的 shein 爬虫突然失效了。页面返回提示: Enable JavaScript and cookies to continue

us.shein.com needs to review the security of your connection before proceeding.
Ray ID: 78698c2b8b837cdd
Performance & security by Cloudflare

尝试更换代理IP, 请求头,都没用。根据提示来看,确实被反爬了。应该启用 JS渲染
考虑到Go语言常用的 chromedp 浏览器爬虫,效率较低。想起以前使用python的 scrapy 爬虫框架时,结合 Splash 可做 JS渲染 服务,挺好用的。想着 Splash 本身基于HTTP的API, 是跨语言的,应该可以代替 chromedp 来做浏览器渲染。

Splash运行环境

使用 Docker (version >= 17), 安装 Splash 服务.

# 下载 splash 镜像
sudo docker pull scrapinghub/splash
# 启动 splash 容器。因需要使用宿主机的HTTP代理服务。故添加 --net host 参数
sudo docker run -it --net host -p 8050:8050 --rm scrapinghub/splash

docker run 命令添加参数 --net host, 使容器能使用宿主机网络环境的HTTP代理服务。
如此,便开启了一个运行Splash应用的Docker容器,该容器共享宿主机网络。
访问地址: http://127.0.0.1:8050

在Golang中使用

发起一个 GET方法 的HTTP请求,使用 splashJS渲染 服务。流程如下:

  1. 爬虫程序通过 发起HTTP请求,调用 splash 服务端的 API接口(默认为本地8050端口)。
  2. splash 模拟浏览器请求,对请求结果进行 JS渲染,得到网页完整的HTML代码。
  3. 爬虫程序通过 API接口 返回的结果,得到 JS渲染 过后的HTML网页代码。

使用 Splash 的API接口 的 execute (或 run)方法,在 lua_source 参数中携带执行脚本参数。

lua_source 参数示例:

function main(splash)
    return 'hello'
end

通过curl命令调用API接口示例:

# execute 方法
curl 'http://127.0.0.1:8050/execute?lua_source=function+main%28splash%29%0D%0A++return+%27hello%27%0D%0Aend'

Golang语言中,请使用 net/url 包的 url.QueryEscape 方法对 lua_source 参数进行 urlEncode 转义。

伪代码如下所示:

import (
	"fmt"
	neturl "net/url"
	"strconv"
	"strings"
	"time"
	"github.com/gocolly/colly/v2"
)

func GetSplashUrl(url string) string {
	luaSourceFmt := `splash:on_request(function(request)
	request:set_proxy{"0.0.0.0",1079}
	end)
	splash:set_user_agent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36")
	assert(splash:go("%s"))
	return splash:html()
	`
	q := neturl.QueryEscape(fmt.Sprintf(luaSourceFmt, url))
	return "http://127.0.0.1:8050/run?lua_source=" + q
}

func main(){
    reqUrl := GetSplash("https://www.example.com")
    // TODO 通过reqUrl发起HTTP请求,返回结果已被Splash处理过,为JS渲染过的HTML页面。
}

通过HTTP请求调用Splash的API接口

  1. http://localhost:8050/render.html
  2. http://localhost:8050/render.png
  3. http://localhost:8050/execute
  4. http://localhost:8050/run

execute 方法接口的 lua_source 参数如下所示:

function main(splash, args)
    assert(splash:go(args.url))
    assert(splash:wait(1.0))
    return splash:html()
end

run 方法接口的 lua_source 参数如下所示:

assert(splash:go(args.url))
assert(splash:wait(1.0))
return splash:html()

Splash操作脚本

操作方法

  • splash:go 网页链接跳转. 目前只支持 GET 和 POST 请求。支持指定 HTTP 请求头,表单等数据.
  • splash:set_user_agent(value) 设置UA请求头
  • splash:select HTML元素CSS选择器

request 对象

request 对象 在 splash:on_request(callback) 方法的回调函数中调用

  • request:set_proxy{host, port, username=nil, password=nil, type='HTTP'} 设置请求代理
  • request:set_header(name, value) 设置请求头

splash:on_request

splash:on_request(callback) 设置一个回调函数,用于在发起HTTP请求前,操作 request 对象

# 添加代理
splash:on_request(function(request)
    request:set_proxy{
        host = "0.0.0.0",
        port = 8990,
        username = splash.args.username,
        password = splash.args.password,
    }
end)

https://splash.readthedocs.io/en/stable/scripting-tutorial.html
https://splash.readthedocs.io/en/stable/scripting-ref.html#splash-on-request
request 请求对象 https://splash.readthedocs.io/en/stable/scripting-request-object.html
Splash安装和使用 https://blog.csdn.net/qq_53582111/article/details/121649717
深入使用 Splash 服务 https://www.5axxw.com/wiki/content/hf16nn文章来源地址https://www.toymoban.com/news/detail-803650.html

到了这里,关于golang爬虫使用splash进行JS渲染服务的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • js拿到接口数据 处理成三级或者四级结构再进行渲染

    背景:接口的数据结构一层套一层 类似于这样 后端返回真实的数据如下: 这是个四级结构 需要渲染的也是四级 只需要拿到每个层级的name和第一个层级的ID 用最笨的方式来一层层解析 再进行渲染

    2024年02月13日
    浏览(28)
  • Vue.js 中的服务端渲染和客户端渲染的区别

    Vue.js 是一个流行的前端框架,它提供了一种简单而强大的方式来构建交互式用户界面。Vue.js 可以在客户端和服务端执行渲染,这两种方式有不同的优势和劣势。本文将介绍 Vue.js 中的服务端渲染和客户端渲染的区别,并附上代码示例。 在传统的客户端渲染模式下,Vue.js 代码

    2024年02月08日
    浏览(63)
  • [golang gin框架] 26.Gin 商城项目-前台自定义商品列表模板, 商品详情数据渲染,Markdown语法使用

    当在首页分类点击进入分类商品列表页面时,可以根据后台分类中的分类模板跳转到对应的模板商品列表页面 (1).商品控制器方法Category()完善 修改controllers/frontend/productController.go中的方法Category(), 判断分类模板,如果后台没有设置,则使用默认模板 (2).模板页面案例 先来回顾一

    2024年02月01日
    浏览(43)
  • 如何使用Vue CLI进行预渲染

    在Vue CLI中使用预渲染,你可以借助插件vue-cli-plugin-prerender-spa来实现。以下是使用Vue CLI进行预渲染的步骤: 1:安装Vue CLI:首先安装Vue CLI。如果没有安装,可以通过以下命令进行全局安装: 2:创建Vue项目:使用Vue CLI创建一个新的Vue项目,进入项目目录: 3:添加预渲染插件

    2024年02月08日
    浏览(35)
  • golang 使用 gomobile进行 Android 开发

    build gomobile成功后会在$GOPATH/bin目录生成gomobile可执行程序 初始化环境,自动下载安装依赖 若提示未找到ndk,根据提示的路径把ndk包复制过去即可 执行bind命令,后面跟上go代码所在的目录 目录结构如下图(包名分别为test和tree) 执行完命令后会在当前目录下生成一个arr包和

    2024年02月07日
    浏览(34)
  • 示例代码:使用golang进行flink开发

    以下是一个使用 Golang 进行 Flink 开发的简单示例代码: 以上示例代码使用 Flink 的 REST API 连接到 Flink 作业集群,并定义了一个输入数据流和一个输出数据流。然后,使用 Map 操作对输入数据进行处理,并将处理后的数据写入输出数据流。最后,执行作业并等待作业结束。 请注

    2024年02月12日
    浏览(36)
  • 【node.js从入门到精通】使用express创建web服务器,路由,进行中间件的创建链接路由及其他中间件

    目录 前言 初识express 使用express创建基本的web服务器 初识express路由 路由匹配概念 路由模块化 中间件 中间件和路由的区别 定义中间件函数 中间件作用   局部生效中间价 中间件分类  1.应用级别中间件  2.路由级别的中间件  3.错误级别中间件  4.内置中间件  5.自定义中间

    2024年02月02日
    浏览(42)
  • Qt使用OpenGL进行多线程离屏渲染

    基于Qt Widgets的Qt程序,控件的刷新默认状况下都是在UI线程中依次进行的,换言之,各个控件的QWidget::paintEvent方法会在UI线程中串行地被调用。若是某个控件的paintEvent很是耗时(等待数据时间+CPU处理时间+GPU渲染时间),会致使刷新帧率降低,界面的响应速度变慢。 假如这个

    2024年02月02日
    浏览(33)
  • Golang使用CopyIn进行批量创建,提高插入效率

    本文介绍两点: 如何在golang中使用copyin 如何对特殊字符jsonb进行插入(需要显式强制转化为string类型)

    2024年02月16日
    浏览(33)
  • 跟随chatgpt学习如何使用GLSL进行简单的图形渲染

    运行成功页面 一个简单的glsl小实验成功了,不过我想要这个三角形动起来。 修改后的script代码如下 运行成功截图 他现在就是一个游来游去的红色三角形了。太神奇了!~

    2024年01月18日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包