使用Splash

时间:2017-05-22 21:50:08

标签: out-of-memory screenshot scrapy-splash

我尝试使用Scrapy Splash的render.png端点截取以下网址的屏幕截图:

https://www.laithwaites.co.uk/product/Kilikanoon-Baroota-Shiraz-2014/66877

在实践中,我使用python-requests发出请求,但是,即使我在浏览器中执行此操作进行测试,也会将cpu使用率推高到100%以上(以" top"来衡量),挂了很长时间然后最终迫使Splash崩溃。我猜它的内存不足。

我尝试将maxrss从500增加到1500,但这没有用。我还尝试调整render.png端点的等待/超时参数,但没有改变结果。

如何使用Splash获取此页面的屏幕截图?

1 个答案:

答案 0 :(得分:0)

似乎JS引擎存在一些问题。如果关闭JS,你至少可以获得截图:

import requests

script = """
function main(splash)
  local url = splash.args.url
  splash.js_enabled = false
  assert(splash:go(url))
  return splash:png()
end
"""

resp = requests.post('http://localhost:8050/execute', json={
    'lua_source': script,
    'url': '<url>',
})

如果启用详细日志记录(docker run -it -p8050:8050 scrapinghub/splash -v3),您可以在从cloudfront下载一些fetch.js文件后看到Splash挂起。可能它包含一些使Splash挂起的代码。您可以尝试过滤掉这个文件(中止下载),而不是禁用JS:

function main(splash)
  local url = splash.args.url
  splash:on_request(function (req) 
    if req.url:find('fetch.js') ~= nil then
      req.abort()
    end
  end)
  assert(splash:go(url))
  return splash:png()
end

上面的脚本对我有用。