python爬虫Scrapy框架笔记分享12-Splash 的使用

2023-11-03

1. Splash介绍

Splash是一个JavaScript渲染服务,是一个带有HTTP API的轻量级浏览器,同时它对接了Python中的Twisted和QT库。利用它,我们同样可以实现动态渲染页面的抓取

2. 安装

2.1 安装docker
2.2 拉取镜像
docker pull scrapinghub/splash
2.3 用docker运行scrapinghub/splash
docker run -p 8050:8050 scrapinghub/splash
2.4 查看效果

我们在8050端口上运行了Splash服务,打开http://192.168.99.100:8050/即可看到其Web页面
image

3 Splash对象属性

上图中main()方法的第一个参数是splash,这个对象非常重要,它类似于Selenium中的WebDriver对象

3.1 images_enabled

设置图片是否加载,默认情况下是加载的。禁用该属性后,可以节省网络流量并提高网页加载速度

注意的是,禁用图片加载可能会影响JavaScript渲染。因为禁用图片之后,它的外层DOM节点的高度会受影响,进而影响DOM节点的位置

因此,如果JavaScript对图片节点有操作的话,其执行就会受到影响

function main(splash, args)
  splash.images_enabled = false
  splash:go('https://www.baidu.com')
  return {html=splash:html()}
end
3.2 plugins_enabled

可以控制浏览器插件(如Flash插件)是否开启

默认情况下,此属性是false,表示不开启

splash.plugins_enabled = true/false
3.3 scroll_position

控制页面上下或左右滚动

splash.scroll_position = {x=100, y=200}

4. Splash对象的方法

4.1 go()

该方法用来请求某个链接,而且它可以模拟GET和POST请求,同时支持传入请求头、表单等数据

ok, reason = splash:go{url, baseurl=nil, headers=nil, http_method="GET", body=nil, formdata=nil}

返回结果是结果ok和原因reason

如果ok为空,代表网页加载出现了错误,此时reason变量中包含了错误的原因

参数 含义
url 请求的URL
baseurl 可选参数,默认为空,表示资源加载相对路径
headers 可选参数,默认为空,表示请求头
http_method 可选参数,默认为GET,同时支持POST
body 可选参数,默认为空,发POST请求时的表单数据,使用的Content-type为application/json
formdata 可选参数,默认为空,POST的时候的表单数据,使用的Content-type为application/x-www-form-urlencoded
splash:go{"http://www.sxt.cn", http_method="POST", body="name=17703181473"}
4.2 wait()

控制页面的等待时间

splash:wait{time, cancel_on_redirect=false, cancel_on_error=true}
参数 含义
time 等待的秒数
cancel_on_redirect 可选参数,默认为false,表示如果发生了重定向就停止等待,并返回重定向结果
cancel_on_error 可选参数,默认为false,表示如果发生了加载错误,就停止等待
function main(splash)
    splash:go("https://www.taobao.com")
    splash:wait(2)
    return {html=splash:html()}
end
4.3 jsfunc()

直接调用JavaScript定义的方法,但是所调用的方法需要用双中括号包围,这相当于实现了JavaScript方法到Lua脚本的转换

function main(splash, args)
  splash:go("http://www.sxt.cn")
  local scroll_to = splash:jsfunc("window.scrollTo")
  scroll_to(0, 300)
  return {png=splash:png()}
end
4.4 evaljs()与 runjs()
  • evaljs() 以执行JavaScript代码并返回最后一条JavaScript语句的返回结果
  • runjs() 以执行JavaScript代码,它与evaljs()的功能类似,但是更偏向于执行某些动作或声明某些方法
function main(splash, args)
  splash:go("https://www.baidu.com")
  splash:runjs("foo = function() { return 'sxt' }")
  local result = splash:evaljs("foo()")
  return result
end
4.5 html()

获取网页的源代码

function main(splash, args)
  splash:go("https://www.bjsxt.com")
  return splash:html()
end
4.6 png()

获取PNG格式的网页截图

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

获取页面加载过程描述

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

获取当前正在访问的URL

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

获取当前页面的Cookies

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

当前页面添加Cookie

cookies = splash:add_cookie{name, value, path=nil, domain=nil, expires=nil, httpOnly=nil, secure=nil}
function main(splash)
    splash:add_cookie{"sessionid", "123456abcdef", "/", domain="http://bjsxt.com"}
    splash:go("http://bjsxt.com/")
    return splash:html()
end
4.11 clear_cookies()

可以清除所有的Cookies

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

设置浏览器的User-Agent

function main(splash)
  splash:set_user_agent('Splash')
  splash:go("http://httpbin.org/get")
  return splash:html()
end
4.13 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
4.14 select()

选中符合条件的第一个节点

如果有多个节点符合条件,则只会返回一个

其参数是CSS选择器

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

填写文本

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

模拟鼠标点击操作

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

5 Splash与Python结合

5.1 render.html

此接口用于获取JavaScript渲染的页面的HTML代码,接口地址就是Splash的运行地址加此接口名称,例如http://192.168.99.100:8050/render.html

import requests
url = 'http://192.168.99.100:8050/render.html?url=https://www.bjsxt.com&wait=3'
response = requests.get(url)
print(response.text)
5.2 render.png

此接口可以获取网页截图

import requests
 
url = 'http://192.168.99.100:8050/render.png?url=https://www.jd.com&wait=5&width=1000&height=700'
response = requests.get(url)
with open('taobao.png', 'wb') as f:
    f.write(response.content)
5.3 execute

最为强大的接口。前面说了很多Splash Lua脚本的操作,用此接口便可实现与Lua脚本的对接

import requests
from urllib.parse import quote
 
lua = '''
function main(splash)
    return 'hello'
end
'''
 
url = 'http://192.168.99.100:8050/execute?lua_source=' + quote(lua)
response = requests.get(url)
print(response.text)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python爬虫Scrapy框架笔记分享12-Splash 的使用 的相关文章

  • 动态向类添加类方法

    我有以下片段 FEED TYPES fan mail Fan Mail review Review tip Tip fan user Fan User fan song Fan Song fan album Fan Album played
  • 在 Python 2.7 中出现“ImportError:无法导入名称 HTTPSConnection”错误

    我正在尝试在 AWS ElasticBeanstalk 中部署 django 当我按照所示步骤操作时here http docs aws amazon com elasticbeanstalk latest dg create deploy
  • 为什么需要在 Python 方法中显式使用“self”参数? [复制]

    这个问题在这里已经有答案了 当在 Python 中的类上定义方法时 它看起来像这样 class MyClass object def init self x y self x x self y y 但在其他一些语言中 例如 C 您可以使用
  • scipy.optimize on pandas dataframe

    我试图搜索它 但结果很差 有人可以向我解释一下如何在 Pandas DataFrame 上执行 optimize minimize 以便最小化 DataFrame 中的类别和结果列之间的错误 考虑这个例子 import pandas as
  • 通过 python 中的另外两个修改数组[重复]

    这个问题在这里已经有答案了 假设我们有三个一维数组 A 长度为 5 B 长度相同 示例中为5 C 更长 比如长度为 100 C最初用零填充 A给出索引C应更改的元素 它们可能会重复 以及B给出应添加到初始零的值C 例如 如果A 1 3 3
  • Keras model.predict 函数给出输入形状错误

    我已经在 Tensorflow 中实现了通用句子编码器 现在我正在尝试预测句子的类概率 我也将字符串转换为数组 Code if model model type universal classifier basic class probs
  • 类型错误:“datetime.datetime”和“str”的实例之间不支持“>”

    我是 python 日期和时间类型的新手 我有一个日期值 date 2018 11 10 10 55 31 00 00 我需要检查该日期值是否超过 90 天 我试过 from datetime import datetime from da
  • 查找正在导入哪些 python 模块

    从应用程序中使用的特定包中查找所有 python 模块的简单方法是什么 sys modules是将模块名称映射到模块的字典 您可以检查其键以查看导入的模块 See http docs python org library sys html
  • App Engine NDB:如何访问属性的 verbose_name

    假设我有这个代码 class A ndb Model prop ndb StringProperty verbose name Something m A m prop a string value 当然 现在如果我打印 m prop 它会
  • 高级描述熊猫

    有没有像 pandas 那样更高级的功能 通常我会继续这样 r pd DataFrame np random randn 1000 columns A r describe 我会得到一份很好的总结 就像这样 A count 1000 000
  • Python:在字典中查找具有唯一值的键?

    我收到一个字典作为输入 并且想要返回一个键列表 其中字典值在该字典的范围内是唯一的 我将用一个例子来澄清 假设我的输入是字典 a 构造如下 a dict a cat 1 a fish 1 a dog 2 lt unique a bat 3
  • 如何获取分类数据的分组条形图

    I have a big dataset with information about students And I have to build a graph of dependencies between different value
  • 如何按 pandas 中的值对系列进行分组?

    我现在有一只熊猫Series与数据类型Timestamp 我想按日期对其进行分组 并且每组中有许多行具有不同的时间 看似显而易见的方法类似于 grouped s groupby lambda x x date 然而 熊猫的groupby按索
  • 如何在matplotlib中调整x轴

    I have a graph like this x轴上的数据表示小时 所以我希望x轴设置为0 24 48 72 而不是现在的值 很难看到 0 100 之间的数据 fig1 plt figure ax fig1 add subplot 11
  • 从 wxPython 事件处理程序中调用函数

    我正在努力寻找一种在 wxPython 事件处理函数中使用函数的方法 假设我有一个按钮 单击该按钮时 它会使用事件处理程序运行一个名为 OnRun 的函数 但是 用户忘记单击 OnRun 按钮之前的 RadionButton 我想弹出一个
  • 从迭代器外部将 StopIteration 发送到 for 循环

    有几种方法可以打破一些嵌套循环 他们是 1 使用中断 继续 for x in xrange 10 for y in xrange 10 print x y if x y gt 50 break else continue only exec
  • 如何创建用于霍夫曼编码和解码的树?

    对于我的作业 我将对霍夫曼树进行编码和解码 我在创建树时遇到问题 并且陷入困境 不要介意打印语句 它们只是让我测试并查看函数运行时的输出是什么 对于第一个 for 循环 我从主块中用于测试的文本文件中获取了所有值和索引 在第二个 for 循
  • 无需访问 Internet 即可部署 Django 的简单方法?

    我拥有的是使用 Django 开发的 Intranet 站点的开发版本以及放置在 virtualenv 中的一些外部库 它运行良好 我可以在任何具有互联网连接的计算机上使用相同的参数 使用 pip 轻松设置 virtualenv 但是 不幸
  • Python:如何在不先创建整个列表的情况下计算列表的总和?

    通常我们必须 1 声明一个列表 2 使用以下方法计算该列表的总和sum 但现在我希望指定一个以 1 开头 间隔为 4 100 个元素的列表 如下所示 1 5 9 13 17 21 25 29 33 37 我不想涉及数学公式 所以 1 如何在
  • 两种 ODE 求解器之间的差异

    我想知道 两者之间有什么区别ODEINT and solve ivp用于求解微分方程 它们之间有什么优点和缺点 f1 solve ivp f 0 1 y0 y0 is the initial point f2 odeint f y0 0 1

随机推荐

  • QLabel中设置背景图片的4种方法

    1 图片不重复 可设置缩放比例 不可动态缩放 find package Qt QT VERSION MAJOR COMPONENTS Svg REQUIRED Qt QT VERSION MAJOR Svg include
  • 18、计算机图形学——BRDF与渲染方程

    一 BRDF Bidirectional Reflectance Distribution Function 双向反射分布函数 基于https blog csdn net Master Cui article details 1197877
  • 文件上传漏洞攻击与防范方法

    01 文件上传漏洞简介 文件上传漏洞是web安全中经常用到的一种漏洞形式 是对数据与代码分离原则的一种攻击 上传漏洞顾名思义 就是攻击者上传了一个可执行文件如木马 病毒 恶意脚本 WebShell等到服务器执行 并最终获得网站控制权限的高危
  • python接口自动化测试 ( 第一章 )

    python接口自动化测试 第一章 接口自动化测试实战 这是一个从0到1的过程 一步一步搭建的测试接口框架 本教程从开始写框架的思路 和实现过程深入解析 并且深入到了每个相关的的各个细节 不论你是刚入门的菜鸟 还是一个懂编码经验的工程师 相
  • OpenVX嵌入式图像处理(一)硬件平台及软件介绍

    图像处理这几年可谓是大红大紫了一番 尤其是OpenCV的出现让很多之前只有研究者才能使用的算法变成了小白装个库调用个函数就可以解决的问题 但是实时性一直以来都是一个非常头疼的问题 尤其是在嵌入式平台上进行图像处理的门槛一直以来都没有降低 今
  • 关于安装PotPlayer64出现PotPlayer 64 bit need right Try agin的问题

    首先官网下载 官网地址 http www potplayer org 根据自己的操作系统位数随便下载一个 进行安装 出现问题 没用admin权限 这时候你需要进行的操作是把当前窗口关闭 然后选中软件 右键选择以管理员身份运行 切记是以管理员
  • STM32学习笔记(4) 高级定时器-两路互补的PWM输出(带死区和刹车控制)

    目录 1 实验目的 2 实验效果 3 理论部分 3 1时钟源 3 2时基单元 3 3输入捕获 4 程序流程 4 1GPIO初始化结构体 4 2时基初始化结构体 4 3输出比较结构体 4 4刹车和死区结构体的初始化 5 程序源码 1 实验目的
  • roblox虚拟世界怎么做服务器,roblox虚拟世界

    游戏简介 roblox虚拟世界是一款像素风格模拟经营游戏 游戏采用简约的画面风格设定 超大的世界地图可以自由的探索 还可以收集丰富的物品资源进行创造 定制一个专属的秩序 游戏特色 1 游戏采用高清品质的画面 大家开自由的畅玩 2 随时随地一
  • 单片机蓝桥杯--数码管显示

    我们先来看一下蓝桥杯板中数码管部分的电路图 对于动态数码管的控制 是需要有段选和位选的 位选是控制数码管哪一位显示 段选是控制该位显示什么数字 由上图可知 当Y6C有效时 P0控制的是数码管的位 当Y7C有效时 可以给P0写入显示数字的断码
  • RedHat Enterprise下如何配置KVM虚拟机的网络网桥

    RedHat Enterprise下如何配置KVM虚拟机的网络网桥 一 网桥的相关创建命令 1 创建网桥设备 brctl addbr
  • 【Github】目标检测组会内容分享

    组会的内容展示为PPT PDF的形式 讲解目标检测领域比较重要的论文 比如R CNN SPP Net等经典论文 资料已经打包好上传到我的github仓库 仓库地址为 https github com biluko Object detect
  • Java后端内部面试题(前一部分)

    面试题 基础篇 1 Java 语言有哪些特点 1 简单易学 有丰富的类库 2 面向对象 Java 最重要的特性 让程序耦合度更低 内聚性更高 2 面向对象和面向过程的区别 面向过程 是分析解决问题的步骤 然后用函数把这些步骤一步一步地实现
  • python 遇到表情代码出错, 用正则表达式去掉表情代码

    gt gt gt aa U0001f60a adwkdkdkkdk 这里 U0001f60a 这是表情的代码 带这个 gt gt gt import re gt gt gt cc re compile r U0001f60a cc 就是需要
  • 小程序授权登录最新解决方案

    小程序授权登录最新解决方案 一 在WXML中设置单击事件 也可以直接放在第一个页面的ONLOAND函数中 用户进入小程序后自动弹出 二 在JS中设置Button的触发代码 三 演示 一 在WXML中设置单击事件 也可以直接放在第一个页面的O
  • SmartForms取消Word编辑器 恢复文本编辑器

    导语 在目前最新版本的 S 4 HANA 1909和2021版本中 SmartForms的文本编辑器改成了嵌套Word 而不是直接修改文本框的形式 这给很多电脑配置不是很高 或者Word兼容性有问题的开发带来了困难 下面说一下如何恢复到文本
  • Ruoyi用户菜单权限

    若依用户菜单权限 后端实现 首先如果想先要实现菜单权限 那么得现在后端添加一个与之对应的权限字段 这样就有权限字段了 前端实现 前端得需要调用这个权限字段的按钮 调用该权限字段的按钮 点击事件 接口请求 若依前端功能 这里得需要在ruoyi
  • page table 改进之 反置页表

    页表是把所有的逻辑页面放到一起 但随着进程的增加 逻辑页面会迅速增长 有多少页面页表就会有多少项 那么不变的是物理内存 为什么不给物理内存编号记录每一块存放了哪个进程呢
  • 【图像处理】图像检索的三种python实现(直方图/OpenCV/哈希法)

    简介 本文介绍了图像检索的三种实现方式 均用python完成 其中前两种基于直方图比较 哈希法基于像素分布 检索方式是 提前导入图片库作为检索范围 给出待检索的图片 将其与图片库中的图片进行比较 得出所有相似度后进行排序 从而检索结果为相似
  • 《互联网程序设计(Java)》——课程笔记10:Http程序设计

    1 概论 HTTP系统包括客户端软件 浏览器 和服务器软件 HTTP服务器 早期的客户端软件 其主要工作可理解为文件下载和文件显示 实际上现代的HTTP客户端比文件下载要复杂得多 它包括网页文件的下载 跨平台的本地显示 参数的传递 动态网页
  • python爬虫Scrapy框架笔记分享12-Splash 的使用

    1 Splash介绍 Splash是一个JavaScript渲染服务 是一个带有HTTP API的轻量级浏览器 同时它对接了Python中的Twisted和QT库 利用它 我们同样可以实现动态渲染页面的抓取 2 安装 2 1 安装docke