一 点睛

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

二 功能介绍

利用Splash,我们可以实现如下功能:

  • 异步方式处理多个网页渲染过程;

  • 获取渲染后的页面的源代码或截图;

  • 通过关闭图片渲染或者使用Adblock规则来加快页面渲染速度;

  • 可执行特定的JavaScript脚本;

  • 可通过Lua脚本来控制页面渲染过程;

  • 获取渲染的详细过程并通过HAR(HTTP Archive)格式呈现。

三 Splash服务的安装

1 通过Docker安装Splash的服务

[root@master ~]# docker run -p 8050:8050 scrapinghub/splash

2 测试安装是否成功

访问http://localhost:8050/

四 scrapy-splash库的安装

(venv) E:\WebSpider>pip install scrapy-splash

五 实例引入

1 通过Splash提供的Web页面来测试其渲染过程。例如,我们在本机8050端口上运行了Splash服务,打开http://localhost:8050/即可看到其Web页面。

2 右侧呈现的是一个渲染示例。可以看到,上方有一个输入框,默认是http://google.com,这里换成百度测试一下,将内容更改为https://www.baidu.com,然后点击Render me按钮开始渲染,结果如下:

3 可以看到,网页的返回结果呈现了渲染截图、HAR加载统计数据、网页的源代码。

通过HAR的结果可以看到,Splash执行了整个网页的渲染过程,包括CSS、JavaScript的加载等过程,呈现的页面和我们在浏览器中得到的结果完全一致。

4 脚本代码

function main(splash, args)assert(splash:go(args.url))assert(splash:wait(0.5))return {html = splash:html(),png = splash:png(),har = splash:har(),}

5 脚本分析

这个脚本实际上是用Lua语言写的脚本。即使不懂这个语言的语法,但从脚本的表面意思,我们也可以大致了解到它首先调用go()方法去加载页面,然后调用wait()方法等待了一定时间,最后返回了页面的源码、截图和HAR信息。

到这里,我们大体了解了Splash是通过Lua脚本来控制了页面的加载过程的,加载过程完全模拟浏览器,最后可返回各种格式的结果,如网页源码和截图等。

六 Splash Lua脚本

1 点睛

Splash可以通过Lua脚本执行一系列渲染操作,这样我们就可以用Splash来模拟类似Chrome、PhantomJS的操作了。

2 入口及返回值

2.1 代码

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

2.2 结果

2.3 说明

注意,我们在这里定义的方法名称叫作main()。这个名称必须是固定的,Splash会默认调用这个方法。

该方法的返回值既可以是字典形式,也可以是字符串形式,最后都会转化为Splash HTTP Response。

2.3.1 返回字典代码

function main(splash)return {hello="world!"}
end

2.3.2 返回字符串

function main(splash)return 'hello'
end

2.3.3 结果

3 异步处理

3.1 点睛

Splash支持异步处理,但是这里并没有显式指明回调方法,其回调的跳转是在Splash内部完成的。

3.2 代码

function main(splash, args)local example_urls = {"www.baidu.com", "www.taobao.com", "www.zhihu.com"}local urls = args.urls or example_urlslocal results = {}for index, url in ipairs(urls) dolocal ok, reason = splash:go("http://" .. url)if ok thensplash:wait(2)results[url] = splash:png()endendreturn results
end

3.3 结果

3.4 说明

在脚本内调用的wait()方法类似于Python中的sleep(),其参数为等待的秒数。当Splash执行到此方法时,它会转而去处理其他任务,然后在指定的时间过后再回来继续处理。

这里值得注意的是,Lua脚本中的字符串拼接和Python不同,它使用的是..操作符,而不是+。如果有必要,可以简单了解一下Lua脚本的语法,详见http://www.runoob.com/lua/lua-basic-syntax.html。

另外,这里做了加载时的异常检测。go()方法会返回加载页面的结果状态,如果页面出现4xx或5xx状态码,ok变量就为空,就不会返回加载后的图片。

爬虫之Splash基础篇相关推荐

  1. php 爬虫_Scrapy 爬虫完整案例-基础篇

    1 Scrapy 爬虫完整案例-基础篇 1.1 Scrapy 爬虫案例一 Scrapy 爬虫案例:爬取腾讯网招聘信息 案例步骤: 第一步:创建项目. 在 dos下切换到目录 D:爬虫_scriptsc ...

  2. 网络爬虫之java基础篇QueryRunner(Ⅲ)

    目录 1Java操作数据库 java操作数据库第一种方法 java操作数据库的QueryRunner方法 1.Java操作数据库 如何将爬虫爬取的数据存储下来也是我们关注的问题之前,常用的存储方式有. ...

  3. 网络爬虫之Java基础篇(Ⅱ)

    目录 1集合操作 集合创建 集合数据的添加 集合的遍历 1.集合操作 集合创建 Set集合不可以放重复数据,List可以,Map主要存放的是键值对,其中key(主键)不可以重复. List<T& ...

  4. python爬虫百度地图_零基础掌握百度地图兴趣点获取POI爬虫(python语言爬取)(基础篇)...

    实现目的:爬取昆明市范围内的全部中学数据,包括名称.坐标. 先进入基础篇,本篇主要讲原理方面,并实现步骤分解,为python代码编写打基础. 因为是0基础开始,所以讲得会比较详细. 如实现目的所讲,爬 ...

  5. 循序渐进自学爬虫(一): 基础篇2

    在开始本文的阅读之前,我希望你已经看过了 循序渐进自学爬虫(一): 基础篇1, 并且对相关的知识点进行了了解. 一个简单的不能再简单的爬虫 基本思路:利用程序来 获取网页,提取信息,保存数据. 获取网 ...

  6. Python3 Requests+BS4网络爬虫:最详细零基础的获取百度快照链接爬虫教程(思路篇)

    Hello,大家好呀,五一劳动节快乐呀!最近在后台接到一个粉丝的私信说怎么爬取百度快照.正好五一有一段时间休息,咱们就来水一篇文章,顺便来巩固巩固基础的知识. 注意注意!这是思路篇,没有代码!只有思路 ...

  7. 零基础掌握百度地图兴趣点获取POI爬虫(python语言爬取)(基础篇)

    实现目的:爬取昆明市范围内的全部中学数据,包括名称.坐标. 先进入基础篇,本篇主要讲原理方面,并实现步骤分解,为python代码编写打基础. 因为是0基础开始,所以讲得会比较详细. 如实现目的所讲,爬 ...

  8. Java网络爬虫学习记录(请求基础篇)

    目录 个人实验遇见错误集: 一.javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX ...

  9. Python3爬虫中Splash的知识总结

    更多编程教程请到:菜鸟教程 https://www.piaodoo.com/ 友情链接: 高州阳光论坛https://www.hnthzk.com/ 人人影视http://www.op-kg.com/ ...

最新文章

  1. Android之ActivityManagerService详解(APP启动过程)
  2. 【thymeleaf 】在 thymeleaf 中使用 shiro 标签
  3. Androd安全——反编译技术完全解析
  4. php左连接,如何在php中对左联接查询返回的数组数据进...
  5. TMM|车辆重识别的一些实践
  6. 统计csv词频_Python|国家统计局CPI数据动态图表可视化
  7. 列表视图案例3——显示联系人
  8. 结构体,文件操作,指针,简单练习
  9. 标记分布学习LDL与多标记学习MLL以及单标记学习
  10. opengl交叉编译
  11. Oracle between and
  12. 读懂trace file (tkprof格式化) 6
  13. 访问者模式的java语言_Java 设计模式系列(二三)访问者模式(Vistor)
  14. 我的HTML学习------表格的基本使用
  15. python web py入门(4)-从数据库读取数据显示到网页
  16. 谈谈CornerStone这个工具的使用
  17. 用易语言制作一款图文展示软件,点击按钮切换图片和文字说明,易语言按钮、图片框、编辑框的应用
  18. windows 10桌面快捷方式小箭头
  19. 活法 - 第四章 以利他心,度人生
  20. 第一节 使用ISM Web组态软件采集Modbus设备数据

热门文章

  1. 女生适合学ui设计吗?女生学ui设计难不难?
  2. 数据科学、管理科学系课程教学课件——FineReport实验指导书节选====双十二仓库出单
  3. fork与execl配合使用
  4. 京东AI发起人周伯文离职,周伯文与京东的几年 | 旧文重读
  5. pdf转图片,图片转pdf,word转图片,word转pdf
  6. 2018最值得期待:全能型PaaS厂商灵雀云
  7. 使用kali搭建钓鱼WIFI——KARMA
  8. 【附源码】计算机毕业设计java迎新系统设计与实现
  9. 零基础入门必备:搞懂压力测试和负载测试
  10. random的基本使用