【问题标题】:Scrapy splash: screenshot specific elementScrapy splash:截图特定元素
【发布时间】:2018-04-22 21:53:48
【问题描述】:

有没有办法在启动画面中截取特定元素?我似乎找不到解决方案,我发现的唯一选项是使用“render.png”截取整个页面,我只需要一个特定元素,例如“//table”。

我找到了我目前正在使用的this(硒解决方案),Splash 似乎更快且开销更少。

非常感谢。

【问题讨论】:

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


    【解决方案1】:

    你可以用这个:

    return splash:select('#my-element'):png()
    

    更多详情请看document

    【讨论】:

      【解决方案2】:

      是的。您可以使用 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
      """
      

      【讨论】:

        猜你喜欢
        • 2017-12-23
        • 1970-01-01
        • 2017-05-28
        • 1970-01-01
        • 2021-12-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-06-27
        相关资源
        最近更新 更多