爬虫:Splash使用

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

目录

1、安装

1.1 安装服务和Python库

1.2 使用Splash

2 Splash Lua 脚本 API用法

2.1 入口及返回值

 2.2 异步处理

3、Splash 对象属性

3.1 args:获取请求参数

3.2  js_enabled JavaScript执行开关

 3.3 resource_timeout 加载时间

 3.4 images_enabled 设置图片是否加载

 3.5 plugins_enabled 控制浏览器插件开启和关闭

3.6 scroll_position 控制页面的滚动

 4、Splash 对象的方法

4.1 go() 用于请求某个链接

 4.2 wait() 控制页面的等待时间

 4.3 jsfunc() 调用JavaScript定义的方法

4.4 evaljs() 执行并返回最后一条JavaScipt语句的返回结果【静态】

4.5 runjs() 此方法可以执行JavaScript动作或声明的方法【动态】

4.6 autoload() 自动加载对象

4.7 call_later() 设置定时任务或延迟时间

4.8 http_get() 模拟发送HTTP的GET请求

4.9 http_post() 模拟Post请求

5.0 set_content() 设置页面内容

 5.1 html() 获取网页的源代码

5.2 png() 获取页面图片

5.3 jpeg()  获取JPEG格式的网页截图

5.4 har() 获取页面加载过程描述

 5.5 url() 获取 当前正在访问的URL

5.6 get_cookies() 获取当前页面的Cookies

5.7 add_cookie() 

5.8 clear_cookies() 清除Cookies

5.9 get_viewport_size() 获取浏览器页面的大小

 6.0 set_viewport_size() 设置当前浏览器

6.1 set_viewport_full() 此方法设置浏览器全屏

6.3 set_user_agent() 设置浏览器的User-Agent

 6.4 set_custom_headers() 设置请求头

 6.5 select() 

6.6 select_all() 选中所有符合条件的节点

 6.7 mouse_click()  鼠标操作

 3 Splash API调用

3.1 render.html 获取JavaScript渲染的页面的HTML代码

3.2 render.png 获取网页截图

3.3 render.jepg 获取JPEG格式的图片

3.4 render.har

3.5 render.json 此接口包含了前面所有的功能

3.6 execute 与Lua脚本对接


1、安装

Scrapy-Splash 是一个Scrapy中支持JavaScript渲染的工具,安装分为两部分,一个是Splash服务的安装,具体是通过docker,安装之后,会启动一个服务,通过它的接口来实现JavaScript 页面的加载,另外一个是Scrapy-Splash的Python库的安装,安装之后可在Scrapy中使用Splash服务

利用Splash,可以实现以下功能

  • 异步方式处理多个网页渲染过程
  • 获取渲染后的页面的源代码或截图
  • 通过关闭图片渲染或者使用Adblock规则来加快页面渲染速度
  • 可执行特定的JavaScript脚本
  • 可通过Lua脚本控制页面渲染过程
  • 获取渲染的详细过程并通过HAR(HTTP Archive)格式呈现

1.1 安装服务和Python库

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

 访问:http://ip:8050

接下来在安装其Python库   

pip install scrapy-splash 

1.2 使用Splash

输入框输入https://www.baidu.com

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

通过首页可以看到它其实是通过一段代码来展示的:这脚本其实是用Lua语言写的脚本

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

2 Splash Lua 脚本 API用法

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

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

结果:

 通过evaljs()  方法传入JavaScript脚本,而document.title的执行结果就是返回网页标题,执行王弼后将期赋值给一个title变量,随后将其返回

需要注意的是这里定义的方法叫做:main()。这个名称必须是固定的,Splash会默认调用这个方该方法返回值既可以是自定形式,也可以是字符内容形式,最后都会转化为 Splash HTTP Response
字典形式

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

结果:

返回一个字符串
 

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

结果:

 2.2 异步处理

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

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

结果运行后3个站点截图

 wait() 方法会等待,当Splash执行到次方法时,它会转而去处理其他任务,然后在指定的时间过后再回来继续处理;这里做了加载时异常检测。go()  返回加载页面的结果状态,如果页面出现4xx或5xx状态码。ok变量就会为空,就不会加载后的图片

3、Splash 对象属性

例子中 main(0 方法的第一个参数是 splash ,这个对象非常重要,它类似于Selenium中的 WebDriver 对象,我们可以调用它的 一些属性和方法来控制加载过程

3.1 args:获取请求参数

该属性可以获取加载时配置的参数,比如URL ,如果为GET 请求,它还可以获取GET 请求参数; 如果为 POST 请求,它可以获取表单提交的数据 Splash支持使用第二个参数直接作为args

function main(splash, args)
	local url = args.url
end

第二个参数args就相当于splash.args 属性,等价于

function main(splash, args)
	local url = splash.args.url
end

3.2  js_enabled JavaScript执行开关

这个属性是 Splas 的JavaScript 执行开关,可以将其配置为 true或 false 来控制是否执行 JavaScript 代码,默认为 true。

function main(splash, args)
  splash:go('https://www.taobao.com')
  splash.js_enabled = false
  local title = splash:evaljs('document.title')
  return {title=title}
end

evaljs()  方法执行JavaScript代码就会抛出异常;不过一般来说,都是默认打开的

 3.3 resource_timeout 加载时间

此属性可以设置加载的超时时间,单位是秒。如果设置为 0或nil (类似 Python中的None ),代 表不检测超时

function main(splash, args)
  splash.resource_timeout = 0.1
  assert(splash:go("https://www.taobao.com"))
  return splash:png()
end

结果:超出了时间,无响应就报错

 3.4 images_enabled 设置图片是否加载

此属性可以设置图片是否加载,默认情况下是加载的。 禁用该属性后,可以节省网络流量并提高 网页加载速度 但是需要注意的是,禁用图片加载可能会影响 JavaScript 渲染, 因为禁用图片之后, 它的外层 DOM 节点的高度会受影响,进而影响 DOM 节点的位置 因此,如果 JavaScript 对图片节点 有操作的话,其执行就会受到影响。

另外值得注意的是, Splash 使用了缓存, 如果一开始加载出来了网页图片,然后禁用了图片加载, 再重新加载页面,之前加载好的图片可能还会显示出来,这时直接重启 Splash 即可

function main(splash, args)
  splash.images_enabled = false
  assert(splash:go('https://www.baodu.com'))
  return {png = splash:png()}
end

结果:

 3.5 plugins_enabled 控制浏览器插件开启和关闭

此属性可以控制浏览器插件(如 Flash 插件)是否开启。 默认情况下,此属性是 false ,表示不开 可以使用如下代码控制其开启和关闭:

splash.plugins_enabled = true/false

3.6 scroll_position 控制页面的滚动

通过设置此属性,我们可以控制页面上下或左右滚动 这是一个比较常用的属性

function main(splash, args)
  assert(splash:go("https://www.taobao.com"))
  splash.scroll_position = {x=100,y=400}
  return {png=splash:png()}
end

结果:

  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值