安装

splash是一个类似于selenium的自动化浏览器,不过它与selenium还是有很大区别的:比如splash是异步的,splash暴露httpAPI来自动化操作。

安装很简单,需要先安装docker,然后拉取镜像:
sudo docker pull scrapinghub/splash
启动splash:
sudo docker run -it -p 8050:8050 --rm scrapinghub/splash
如需在后台运行,只需把-it改成-d就行。

另外,还可以把容器内的目录映射到本地,这样你就可以修改本地文件夹内的文件来作用于容器,容器内有四个主要目录:

  • /etc/splash/filters:存放过滤器的文件夹
  • /etc/splash/proxy-profiles:存放代理配置的文件夹
  • /etc/splash/js-profiles:存放js脚本的文件夹
  • /etc/splash/lua_modules:存放lua脚本的文件夹

映射到本地的命令是(-v就表示映射文件夹),其他类似:
docker run -p 8050:8050 -v 本地绝对路径:/etc/splash/filters scrapinghub/splash

Splash HTTP API

我们可以通过发送某种HTTP请求来使splash执行相应的操作,举个例子:
我们在浏览器输入127.0.0.1:8050/render.html?url=https://www.baidu.com这样你就可以让splash访问百度了,浏览器显示的内容就是splash返回的内容。但这有什么用呢?注意splash返回的是已经经过js渲染的页面,也就是说它可以加载动态页面,明白有什么用了吧。

splash 的httpapi既支持get也支持post,其中的一些参数可以作为get的参数发送,也可以作为post的内容发送(注意格式为json,而且请求头建议加入Content-Type: application/json)

render.html

返回渲染后页面的HTML
参数如下:

  • url:字符串,要访问的URL

  • baseurl:如果页面中某些资源包含相对URL,需要使用这个参数来填充前面那部分。

  • timeout:浮点数,超时时间

  • resource_timeout :单个请求的超时时间,注意既然是会渲染页面,说明splash访问URL肯定不是一次请求,其中还包含很多ajax、js和图片的加载。

  • wait:页面加载后的等待时间,一般情况下都会指定一个较小的值(0.5)来防止一些不必要的异常

  • proxy:代理,格式为[protocol://][user:password@]proxyhost[:port],protocol可以是http,也可以是socks5

  • js:需要执行js配置文件名称,也就是/etc/splash/js-profiles目录下的文件名称

  • js_source :需要执行的js代码

  • filters:/etc/splash/filters存放的过滤器的文件名称,支持多个以逗号分隔。

  • allowed_domains:允许访问的域名列表(以逗号分隔)

  • allowed_content_types: 允许加载的内容类型列表,支持* 、?、[]、[!]四种通配符语法,具体参考fnmatch

  • forbidden_content_types:禁止加载的内容类型,我试了一下这两个参数没效果,难道是姿势不对。

  • viewport :网页大小,格式为1024x768(默认)

  • images:是否下载图片。因为有缓存,所以返回的截图可能也是加载了图片的,只是加载的本地缓存而不是请求互联网。

  • headers:为第一个传出的请求设置的请求头,仅post方法支持该参数

  • body:如果目标请求是POST,该参数是POST请求正文

  • http_method:请求方法,默认GET

  • save_args:要放入缓存的参数名称列表,会在响应头中返回X-Splash-Saved-Arguments: name1=9a6747fc6259aa374ab4e1bb03074b6ec672cf99;name2=ba001160ef96fe2a3f938fea9e6762e204a562b3类似这样的内容,下次请求可以通过load_args传递相同的请求头来加载。一般用不上,js_source或lua_source 更方便。

  • load_args:加载save_args保存的参数名称列表,格式可以是save_args返回的响应头,并以请求头的格式发送,也可以是name1和值组成的json对象

  • html5_media:是否播放视频,默认0关闭

  • http2:是否启用http2,默认0

  • engine :要使用的浏览器引擎,默认webkit,也可以是chromium。不建议修改。

render.png

返回js渲染后的页面png截图
参数除了render.html一样,还有:

  • width:宽度
  • height : 宽度
  • render_all : 是否全屏,默认0
  • scale_method : raster(逐像素缩放,默认)和vector(按元素缩放)。vector性能更高,字体更清晰,元素边界更明显。但是可能出现未知的问题,请谨慎使用。

render.jpeg

参数同render.png,还有:

  • quality : JPEG图片的质量,取值范围0-100,默认75。不建议大于95。

render.har

以HAR格式返回(什么是har格式可以自行百度)
参数与render.html相同
额外参数:

  • request_body:是否包含请求内容,默认0
  • response_body:是否包含响应内容,默认0

render.json

返回带有javascript渲染网页信息的json编码字典。
参数同render.jpeg,还有

  • html : 是否包含HTML,默认0
  • png : 是否包含PNG,默认0
  • jpeg :是否包含JPEG,默认0
  • iframes :是否包含子iframe的信息,默认0
  • script : 是否包含执行的js结果,默认0
  • console : 是否包含js控制台消息,默认0
  • history : 是否包含历史响应,默认0
  • har :是否包含HAR数据,默认0
  • request_body :如果值为1,返回结果将包含har记录,而且包含请求内容
  • response_body :如果值为1,返回结果将包含har记录,而且包含响应内容

execute

执行自定义脚本并返回结果

  • lua_source : lua脚本字符串
  • timeout : 同上
  • allowed_domains :同上
  • proxy :同上
  • filters :同上
  • save_args : 同上
  • load_args :同上

run

参数和作用同execute,区别在于脚本的格式。execute脚本必须包含在main函数中,而run脚本则可以是单独的语句,示例脚本如下:

execute脚本

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

run脚本

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

允许跨域

docker run -it -p 8050:8050 scrapinghub/splash --js-cross-domain-access

在网页中执行js代码

有两种方法:
1、使用render.html中的js_source参数或者js参数加载指定js文件,示例(建议使用POST请求):

curl -X POST -H 'content-type: application/json' \-d '{"js_source": "document.title=\"My Title\";", "url": "http://example.com"}' \'http://localhost:8050/render.html'

2、带有指定请求头

curl -X POST -H 'content-type: application/javascript' \-d 'document.title="My Title";' \'http://localhost:8050/render.html?url=http://domain.com'

如果要获取js执行的结果,需使用render.json将script参数设置为1

请求过滤器(Request Filters)

Splash支持根据Adblock Plus规则过滤请求。你可以使用其easylist.txt
来删除广告,或者手动编写来阻止某些请求。例如阻止自定义字体文件的加载可以这些写:

.ttf|
.woff|

然后将这个文件命名为nofonts.txt,并在使用docker开启splash的时候将过滤器目录映射到本地(上面有说怎么映射),接着将nofonts.txt放在这个目录。发起请求只需携带参数filters=nofonts就可以执行过滤器规则,例如:

curl 'http://localhost:8050/render.png?url=http://domain.com/page-with-fonts.html&filters=nofonts'

另外如果过滤器目录存在default.txt文件,则会自动启用。当然如果你不想启用,可以设置filters=none。关于自定义过滤器的语法请参考:https://help.eyeo.com/en/adblockplus/how-to-write-filters

代理配置文件(Proxy Profiles)

同过滤器规则,需先将代理配置目录映射到本地,接着讲代理配置文件放入目录。示例配置文件:

[proxy]; 代理IP和端口,分号为注释
host=proxy.crawlera.com
port=8010; 代理验证,默认为空
username=username
password=password; 代理类型,默认HTTP,还支持socks5
type=HTTP[rules]
;使用代理的白名单,默认.*
whitelist=.*mywebsite\.com.*; 使用代理的黑名单, 默认为空
blacklist=.*\.js.*.*\.css.*.*\.png

接着将文件保存在代理目录为myproxy.ini(名称任意),然后只需在请求加入proxy=myproxy参数即可。另外,只有在白名单中并且不再黑名单中的才会使用代理,也就是说如果黑名单和白名单同时匹配,黑名单优先级更高。

可以看出代理文件的规则很简单,也就是正则编写的表达式以换行分隔就行了。另外,如果存在default.ini,则默认启用。使用proxy=none禁止。

_gc

回收内存清理缓存,只支持POST请求,示例:
curl -X POST http://localhost:8050/_gc

_debug

获取有关Splash实例的调试信息(使用的RSS数量上限,使用的文件描述符数量,活动请求,请求队列长度,活动对象的数量),以GET方式请求。
curl http://localhost:8050/_debug

_ping

要ping Splash实例,向/_ping端点发送GET请求,示例:
curl http://localhost:8050/_ping

lua脚本

如果以execute接口来执行lua脚本的话,格式需要遵循:

function main(splash, args)splash:go("http://example.com")splash:wait(0.5)local title = splash:evaljs("document.title")return {title=title}
end

另外关于一些lua的API可以直接参考:官方文档,写的很详细,很容易看懂。

scrapy-splash

如果你想将scrapy和splash整合在一起会怎么写?很简单,就像整合selenium一样添加一个splash中间件。

实际访问URL,splash其实就是在访问http://splashURL/render.html?url=URL,其他都没有变化所以我们只需在中间件中替换URL就可以了,不过splash还有一些参数怎么传递给中间件呢?使用request.meta即可。

至于scrapy-splash就不详细介绍了,只需要在settings.py中配置一些参数,然后在spider中将splash的参数添加到meta里即可。当然也可以使用SplashRequest,SplashRequest其实就是将参数保存在meta,做了一个封装。

SPLASH_URL = 'http://192.168.59.103: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'

请求示例:

yield scrapy.Request(url, self.parse_result, meta={'splash': {'args': {# set rendering arguments here'html': 1,'png': 1,# 'url' is prefilled from request url# 'http_method' is set to 'POST' for POST requests# 'body' is set to request body for POST requests},# optional parameters'endpoint': 'render.json',  # optional; default is render.json'splash_url': '<url>',      # optional; overrides SPLASH_URL'slot_policy': scrapy_splash.SlotPolicy.PER_DOMAIN,'splash_headers': {},       # optional; a dict with headers sent to Splash'dont_process_response': True, # optional, default is False'dont_send_headers': True,  # optional, default is False'magic_response': False,    # optional, default is True}
})

更多参考:https://github.com/scrapy-plugins/scrapy-splash

splash官方文档解读(翻译)相关推荐

  1. 蓝牙MESH 官方文档解读 翻译(1)

    已从事两年的物联网无线通信相关应用开发,但在接触蓝牙MESH相关技术时,一般都需要查询官方机构的文档,规范等,但发现网络上相应的中文资料较少,故对相关官方文档结合自身开发经验进行了翻译. 此部分摘自官 ...

  2. Pytorch官方文档英语翻译

    深度学习Pytorch-Pytorch官方文档英语翻译 1. a-e 1.1 span 跨度 1.2 blended 混合的 1.3 criterion 标准 1.4 deprecated 弃用的 1 ...

  3. Spring官方文档中文翻译

    准备做个Spring官方文档全翻译专栏以下是大目录, 本翻译是基于Spring5 Core Technologies

  4. python pymssql - pymssql模块官方文档的翻译

    译者注:译者博客(http://blog.csdn.net/lin_strong),转载请保留这条.此为pymssql模块version2.1.4官方文档的翻译,仅供学习交流使用,请勿用于商业用途. ...

  5. ElasticSearch Java High level Rest Client 官方文档中文翻译(一)

    ElasticSearch Java High level Rest Client 官方文档中文翻译 一 纯粹记录自己在看官网的es rest high level api 时的翻译笔记,可以对照着官 ...

  6. 【开源项目推荐】Android Jetpack 官方文档 中文翻译

    Jetpack 是 Android 软件组件的集合,使您可以更轻松地开发出色的 Android 应用.这些组件可帮助您遵循最佳做法.让您摆脱编写样板代码的工作并简化复杂任务,以便您将精力集中放在所需的 ...

  7. python的pymssql模块的报错_python pymssql - pymssql模块官方文档的翻译

    译者注:译者博客(http://blog.csdn.net/lin_strong),转载请保留这条.此为pymssql模块version2.1.4官方文档的翻译,仅供学习交流使用,请勿用于商业用途. ...

  8. CUDA10.0官方文档的翻译与学习之编程接口

    目录 背景 用nvcc编译 编译工作流 二进制适配性 ptx适配性 应用适配性 C/C++适配性 64位适配性 cuda c运行时 初始化 设备内存 共享内存 页锁主机内存 可移植内存 写合并内存 映 ...

  9. 对STIX2.0标准12个构件的解读(续)——对STIX2.0官方文档的翻译

    官方文档地址:点击即可 1.  攻击模式(Attack Pattern) 类别名称: attack-pattern 攻击模式是TTP的一种,描述了攻击者试图破坏目标的方式.攻击模式用于帮助对攻击进行分 ...

最新文章

  1. IDEA 程序包org.springframework.web.bind.annotation不存在
  2. 每个Java开发者都应该知道的5个JDK工具
  3. android 弹出框带标题栏,Android开发靠标题栏的弹框
  4. java 泛型 继承_java基础之泛型的继承
  5. 数据结构之图的应用:有向无环图
  6. java 多线程基础, 我觉得还是有必要看看的
  7. Windows Media Services (1) 搭建 电影服务器教程
  8. 使用Sophix热修复注意事项
  9. jQuery推箱子小游戏
  10. 豆瓣最新国产电影Top10
  11. 图解HTTP十一:Web 的攻击技术
  12. Codeforces Round #509 (Div. 2) F. Ray in the tube(思维)
  13. 2021年中国综艺赞助情况回顾及未来发展趋势:品牌更乐于与成熟的综N代合作,未来合作方式更多元化[图]
  14. Compound原理
  15. 图片多样化切换_您想让您的工作室更多样化吗?
  16. 饭卡管理程序c语言代码,C++ 简单饭卡管理系统
  17. 数字标牌创建内容的一些基本技巧
  18. 金融系统监控联网报警系统!
  19. python脚本自动qq签到_Python爬虫实现自动登录、签到功能 附代码
  20. 使用Java写一个旅游项目(一)

热门文章

  1. Living Green 宜居国家(城市)
  2. linux shell xcopy file by date,Xcopy命令参数使用介绍
  3. Kafka学习-----Kafka消费者Consumer:消费方式,分区分配策略,RangeRoundRobin
  4. VS2019怎么查找源文件(头文件)位置
  5. 无缝衔接的人会遭报应吗_因果报应:一个人将走背运时,往往会出现这三个征兆,别不信!...
  6. ubuntu12.04安装PPS
  7. 二叉搜索树及其操作详解
  8. 数据结构之二叉树基本介绍
  9. 618!python京东 PC 版抢券程序
  10. Solidwork三维模型填充原子建立MD模型