【问题标题】:scrapy + splash : not rendering full page javascript datascrapy + splash:不呈现整页 javascript 数据
【发布时间】:2018-02-13 23:05:05
【问题描述】:

我只是在用 splash 探索 scrapy,我正试图从一个电子商务网站上用 productid、name 和 price 抓取所有产品(裤子)数据 gap 但是当我从splash web UI splash web UI 看到时,我没有看到加载的所有动态产品数据(虽然每个请求只加载了16 个项目 - 不知道为什么) 我尝试了以下选项,但没有运气

  • 将等待时间增加到 20 秒
  • 通过使用“--disable-private-mode”启动 docker
  • 通过使用lua_script进行页面滚动
  • 带有查看报告完整选项splash:set_viewport_full()

lua_script2 = """ function main(splash)
    local num_scrolls = 10
    local scroll_delay = 2.0

    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 splash:html()
end"""                 
                              
            yield SplashRequest(
                url,
                self.parse_product_contents,
                endpoint='execute', 
                args={
                        'lua_source': lua_script2,
                        'wait': 5,
                    }
                )
 

谁能解释一下这种行为? p.s:我使用的是scrapy框架,我能够从render.html解析产品信息(商品名称、名称和价格)(但render.html只有16个商品信息)

【问题讨论】:

  • 用api直接获取数据怎么样,不用那么费劲? "gap.com/resources/productSearch/v1/search?cid=80799"
  • 嗨塔伦,感谢您的回复。但我的目标是爬入网站上列出的每个产品(例如这里的每条裤子)并获取所有可用的 skus(例如,这条裤子有近 23 种尺寸(skus),我可以从 view-source link 看到我没有通过api找到。我是新的这个api方法。你能提供一些信息
  • 我曾尝试使用 splash:set_viewport_full() 但没有运气并尝试使用 scrpay 也喜欢 yield SplashRequest(url, self.parse_product_contents, args={' wait': 10, 'viewport':'full' , 'render_all': 1},endpoint='render.html' ) 仍然没有运气但是当我将视图报告大小设置为大尺寸splash:set_viewport_size(1980, 8020)我看到内容已加载,但仍有限制。当我尝试增加 png Viewport is out of range (20000x20000, area=16000000) 的维度时出现此错误
  • @TarunLalwani 你有什么想法吗,请分享

标签: python-3.x scrapy scrapy-splash


【解决方案1】:

我将脚本更新到下面

function main(splash)
    local num_scrolls = 10
    local scroll_delay = 2.0
    splash:set_viewport_size(1980, 8020)
    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:set_viewport_full()
    splash:wait(10)
    splash:runjs("jQuery('span.icon-x').click();")
    splash:wait(1)
    for _ = 1, num_scrolls do
        scroll_to(0, get_body_height())
        splash:wait(scroll_delay)
    end      

      splash:wait(30)

    return { 
        png = splash:png(),
        html = splash:html(),
        har = splash:har()
       }
end

并在我的本地启动中运行它,png 不能正常工作,但 HTML 有最后一个产品

唯一的问题是当电子邮件订阅弹出窗口在那里时它不会滚动,所以我添加了代码来关闭它

【讨论】:

  • 太好了!但是当我尝试在本地启动中运行相同的脚本时,我收到了错误的请求错误。有什么我需要让它工作吗?请告诉我`{“type”:“ScriptError”,“error”:400,“description”:“执行Lua脚本时发生错误”,“info”:{“line_number”:9,“type”:“LUA_ERROR” , "source": "[string \"function main(splash)\r...\"]", "message": "Lua 错误: [string \"function main(splash)\r...\"] :9: network3", "error": "network3" } }`
  • 我拉取了最新的 docker 镜像,可能你用的是旧的东西?也尝试将function main(splash) 更改为function main(splash, args)
  • 我在 3 天前提取了 docker 镜像(docker pull scrapinghub/splash)我相信它是最新的。我尝试了 function main(splash, args) 我遇到的相同网络问题。让我再检查一次码头工人。你有没有被 pull scrapinghub/splash:master 拉?
  • 不,只是pull scrapinghub/splash,我在浏览器渲染器中运行
  • 我认为在我提出多个请求后,飞溅正在给出响应。并间歇性地给出错误的请求错误。有线!
猜你喜欢
  • 2018-12-28
  • 1970-01-01
  • 2019-01-24
  • 1970-01-01
  • 1970-01-01
  • 2021-08-16
  • 2020-05-04
  • 1970-01-01
  • 2021-03-23
相关资源
最近更新 更多