Scrapy splash:截图特定元素

时间:2018-04-22 21:53:49

标签: python web-scraping scrapy splash webpage-screenshot

有没有办法在启动画面中截取特定元素?我似乎无法找到解决方案,我找到的唯一选择是使用" render.png"它获取整页的屏幕截图,我只需要一个特定的元素,例如" // table"。

我发现我目前正在使用this(硒中的解决方案),Splash似乎更快,开销更少。

非常感谢。

2 个答案:

答案 0 :(得分:0)

是的。您可以使用scrapy-splash插件来做到这一点。

https://github.com/scrapy-plugins/scrapy-splash 请阅读“更复杂的Splash Lua脚本示例-通过其CSS选择器获取HTML元素的屏幕截图(需要Splash 2.1+)。请注意参数是如何传递到脚本的:”部分。

您不使用render.png端点,而是使用execute端点并执行lua脚本来获取特定元素的屏幕截图。

我在抓痒的蜘蛛中实现了这一点。

  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
"""

答案 1 :(得分:0)

您可以使用此:

# This command fetches glfw 3.3.2 from github
# Note the shallow parameter. This means it won't grab all the history.
FetchContent_Declare(glfw
    GIT_REPOSITORY "https://github.com/glfw/glfw"
    GIT_TAG "3.3.2"
    GIT_SHALLOW ON
)

# Now make the glfw target available to link against
FetchContent_MakeAvailable(glfw)

target_link_libraries(foobar PRIVATE glfw)

有关更多详细信息,请查看document