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页面
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Rhiqq9hd-1594713031593)(https://note.youdao.com/yws/api/personal/file/366AEA0862FF4B77B584F99F058FD0FE?method=download&shareKey=1becb4e3fd74346d3e247a6cf7d8406d)]

3 Splash对象属性

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

3.1 images_enabled

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

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

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

function main(splash, args)splash.images_enabled = falsesplash: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

4.17 代理Ip

function main(splash)splash:on_request(function(request)request:set_proxy{'host':'61.138.33.20','port':808,'username':'uanme','password':'passwrod'}end)-- 设置请求头splash:set_user_agent("Mozilla/5.0")splash:go("https://httpbin.org/get")return splash:html()
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 requestsurl = '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 quotelua = '''
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)

Splash的使用入门相关推荐

  1. 爬虫入门的基本原理,如果你连这些都不知道那你可以放弃爬虫了

    我们天天到处看到爬虫爬虫的,你了解爬虫是什么吗?你知道爬虫的爬取流程吗?你知道怎么处理爬取中出现的问题吗?如果你回答不出来,或许你真的要好好看看这篇文章了! 爬虫简介 网络爬虫(Web crawler ...

  2. 渐进式Web应用(PWA)入门教程(上)

    最近关于渐进式Web应用有好多讨论,有一些人还在质疑渐进式Web应用是否就是移动端未来. 但在这篇文章中我并不会将渐进式APP和原生的APP进行比较,但有一点是可以肯定的,这两种APP的目标都是使用户 ...

  3. python爬虫从入门到精通-Python网络爬虫开发从入门到精通

    本书共分 3 篇,针对 Python 爬虫初学者,从零开始,系统地讲解了如何利用 Python 进行常见的网络爬虫的程序开发. 第 1 篇快速入门篇(第 1 章 ~ 第 9 章):本篇主要介绍了 Py ...

  4. Scrapy爬虫(8)scrapy-splash的入门

    2019独角兽企业重金招聘Python工程师标准>>> Scrapy爬虫(8)scrapy-splash的入门 2018年03月17日 16:16:36 剑与星辰 阅读数:885 标 ...

  5. python从入门到爬虫_python爬虫从入门到放弃(一)之初识爬虫

    什么是爬虫? 网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本.另外一些不常使用的名字还有蚂蚁.自动索引. ...

  6. gtk学习总结:GTK从入门到放弃,三天包教包会

    今天花了一些时间复习之前学习过的gtk,感觉东西光学不用忘得好快啊,在这做个之前学过的内容的备份,希望对大家有用,也希望大家不要从入门到放弃.文中有些代码例子可能来自<GTK从入门到精通> ...

  7. linux菜鸟入门之系统启动流程

    1.启动过程 POST 加电自检 BIOS 以普通的操作系统为例.cpu 要执行指令需要从内存中取,而刚开机的时候,内存里什么都没有,所以刚开机的时候.必须将某个的特定的硬件中的指令加入内存中.刚开机 ...

  8. 手把手教你快速入门 APP 的开发

    论及每年的编程语言排行榜, Java 总是名列榜首,流行意味着好用,我们当了解之. 当今生活,最体现科技的地方便是电子产品.而电子产品中,我们接触最多.最离不开的便是手机.手机之所以成为"手 ...

  9. LINUX新手入门及安装配置FAQ(http://bbs.blueidea.com/viewthread.php?tid=635906amp;page=)

    LINUX新手入门及安装配置FAQ 剑气凌人 [楼主] 尖脐 荣誉管理团队 帖子 6386  体力 10046   威望 168   当前 北京 海淀区 发短消息 个人网站 1# 大 中 小 发表于 ...

最新文章

  1. php 语言文件操作,php中目录文件操作详谈
  2. NSLocalizedString不起作用
  3. LeetCode 2 Keys Keyboard
  4. use web IDE to commit change to git
  5. php代码里怎么写html代码_菜鸟青铜变白银!Python 项目代码写完了,然后怎么打包和发布?...
  6. mysql 查看autocommit_手把手教你分析Mysql死锁问题
  7. efi分区咋移动到c盘里_快速增加C盘容量的好方法!
  8. 安装时间大于30秒_“跑步是最没用的减肥方式,必须跑30分钟以上才有用”
  9. 基于MDC的SOA方案
  10. Visual C++中的ODBC编程
  11. 委托的Invoke与BeginInvoke
  12. cs231n_2020 作业knn笔记
  13. 规格模式(Specification)
  14. linux下nginx配置访问静态图片的解决办法
  15. 【微信小程序】 map 组件 callout 自定义气泡 (实实在在的讲解)
  16. “省份、城市、区县” 三级联动数据
  17. php导出复杂表头excel,js导出复杂表头(多级表头)的excel
  18. Android 自带工具生成图标
  19. 通过ip反查域名信息
  20. 逆天的APP,不得不提到 “一个木函”

热门文章

  1. c-二维数组赋值及二维指针使用
  2. [iOS]根据UIColor获取及改变RGB和Alpha
  3. C#中的ManagementClass类
  4. Red Hat Ansible Automation Platform 安装
  5. NOIP2011普及组第3题 瑞士轮
  6. Gameplay - 设计《神秘海域》类型的关卡
  7. “小白Hare的成长之路“关于java 使用IO流对音频文件进行复制
  8. WordPress上传图片提示:服务器无法处理图像
  9. 分布式系统开发实战:分布式计算,分布式计算常用技术
  10. Windows下 find 参数错误