爬虫之Splash对象方法(二)
一 autoload()
1 点睛
此方法可以设置每个页面访问时自动加载的对象,使用方法如下:
ok, reason = splash:autoload{source_or_url, source=nil, url=nil}
参数说明如下。
- source_or_url:JavaScript代码或者JavaScript库链接。
- source:JavaScript代码。
- url:JavaScript库链接
但是此方法只负责加载JavaScript代码或库,不执行任何操作。如果要执行操作,可以调用evaljs()或runjs()方法。
2 实例1
2.1 代码
function main(splash, args)
splash:autoload([[
function get_document_title(){
return document.title;
}
]])
splash:go("https://www.baidu.com")
return splash:evaljs("get_document_title()")
end
2.2 效果
Splash Response: "百度一下,你就知道"
2.3 说明
这里我们调用autoload()方法声明了一个JavaScript方法,然后通过evaljs()方法来执行此JavaScript方法。
3 实例2
3.1 代码
function main(splash, args)
assert(splash:autoload("https://code.jquery.com/jquery-2.1.3.min.js"))
assert(splash:go("https://www.taobao.com"))
local version = splash:evaljs("$.fn.jquery")
return 'JQuery version: ' .. version
end
3.2 效果
Splash Response: "JQuery version: 2.1.3"
二 call_later()
1 点睛
此方法可以通过设置定时任务和延迟时间来实现任务延时执行,并且可以在执行前通过cancel()方法重新执行定时任务。
2 代码
function main(splash, args)
local snapshots = {}
local timer = splash:call_later(function()
snapshots["a"] = splash:png()
splash:wait(1.0)
snapshots["b"] = splash:png()
end, 0.2)
splash:go("https://www.taobao.com")
splash:wait(3.0)
return snapshots
end
3 效果
4 说明
这里我们设置了一个定时任务,0.2秒的时候获取网页截图,然后等待1秒,1.2秒时再次获取网页截图,访问的页面是淘宝,最后将截图结果返回。
三 http_get()
1 点睛
此方法可以模拟发送HTTP的GET请求,使用方法如下:
response = splash:http_get{url, headers=nil, follow_redirects=true}
参数说明如下。
-
url:请求URL。
-
headers:可选参数,默认为空,请求头。
-
follow_redirects:可选参数,表示是否启动自动重定向,默认为true。
2 代码
function main(splash, args)
local treat = require("treat")
local response = splash:http_get("http://httpbin.org/get")
return {
html=treat.as_string(response.body),
url=response.url,
status=response.status
}
end
3 结果
四 http_post()
1 点睛
和http_get()方法类似,此方法用来模拟发送POST请求,不过多了一个参数body,使用方法如下:
response = splash:http_post{url, headers=nil, follow_redirects=true, body=nil}
参数说明如下。
- url:请求URL。
- headers:可选参数,默认为空,请求头。
- follow_redirects:可选参数,表示是否启动自动重定向,默认为true。
- body:可选参数,即表单数据,默认为空。
2 代码
function main(splash, args)
local treat = require("treat")
local json = require("json")
local response = splash:http_post{"http://httpbin.org/post",
body=json.encode({name="Germey"}),
headers={["content-type"]="application/json"}
}
return {
html=treat.as_string(response.body),
url=response.url,
status=response.status
}
end
3 效果