为方便集群和部署用Splash技术做动态页面爬取,效果很好,splash还可以做一些交互,网上有公司在用splash逐步替换掉selenium。当然在使用过程中也遇到一些挑战, 譬如:wait element问题、滚动翻页问题等。
下面分享下滚动翻页问题并提供初步方案代码, 优化方案思路分享下,大家有兴趣可以写下。
头条搜索
https://www.toutiao.com/search/?keyword=%E5%B9%B3%E5%AE%89+%E4%BF%A1%E7%94%A8%E5%8D%A1+%E9%99%8D%E9%A2%9D
翻页脚本:
function main(splash)
local num_scrolls = 10 -- 翻页数
local scroll_delay = 0.5 -- 翻页等待时间
local scroll_to = splash:jsfunc("window.scrollTo")
local get_body_height = splash:jsfunc(
"function() {return document.body.scrollHeight;}"
)
assert(splash:go(splash.args.url))
splash:wait(splash.args.wait)
for _ = 1, num_scrolls do
scroll_to(0, get_body_height())
splash:wait(scroll_delay)
end
return {
html = splash:html(),
png = splash:png(),
har = splash:har(),
}
end
这个脚本设定了翻页次数, 其实还可以设定一直循环scroll,退出条件是:若scroll 并wait(dely time)后,检查滚动条是否仍然处于最底部, 若一直最底部可以认定已经翻到最后一页。