【发布时间】:2018-04-22 21:53:48
【问题描述】:
有没有办法在启动画面中截取特定元素?我似乎找不到解决方案,我发现的唯一选项是使用“render.png”截取整个页面,我只需要一个特定元素,例如“//table”。
我找到了我目前正在使用的this(硒解决方案),Splash 似乎更快且开销更少。
非常感谢。
【问题讨论】:
标签: python web-scraping scrapy splash-screen webpage-screenshot
有没有办法在启动画面中截取特定元素?我似乎找不到解决方案,我发现的唯一选项是使用“render.png”截取整个页面,我只需要一个特定元素,例如“//table”。
我找到了我目前正在使用的this(硒解决方案),Splash 似乎更快且开销更少。
非常感谢。
【问题讨论】:
标签: python web-scraping scrapy splash-screen webpage-screenshot
【讨论】:
是的。您可以使用 scrapy-splash 插件来做到这一点。
https://github.com/scrapy-plugins/scrapy-splash 请阅读“更复杂的 Splash Lua 脚本示例 - 通过其 CSS 选择器获取 HTML 元素的屏幕截图(它需要 Splash 2.1+)。注意参数是如何传递给脚本的:”部分。
您不使用 render.png 端点,您使用执行端点并执行 lua 脚本来获取特定元素的屏幕截图。
我在scrapy spider中是这样实现的。
def start_requests(self):
print('parse_start_url')
yield SplashRequest(url, self.parse_result,
endpoint='execute',
args={
'lua_source': script,
'pad': 32,
'css': 'body'
}
)
script = """
-- Arguments:
-- * url - URL to render;
-- * css - CSS selector to render;
-- * pad - screenshot padding size.
-- this function adds padding around region
function pad(r, pad)
return {r[1]-pad, r[2]-pad, r[3]+pad, r[4]+pad}
end
-- main script
function main(splash)
-- this function returns element bounding box
local get_bbox = splash:jsfunc([[
function(css) {
var el = document.querySelector(css);
var r = el.getBoundingClientRect();
return [r.left, r.top, r.right, r.bottom];
}
]])
assert(splash:go(splash.args.url))
assert(splash:wait(0.5))
-- don't crop image by a viewport
splash:set_viewport_full()
local region = pad(get_bbox(splash.args.css), splash.args.pad)
return splash:png{region=region}
end
"""
【讨论】: