2017-09-05 139 views
1

我只是在探索scrapy与飞溅,我试图从电子商务网站 gap其中一个产品,名称和价格刮所有产品(裤子)数据,但但我没有看到所有的动态产品数据加载,当我从飞溅的web用户界面看到splash web UI(只有16个项目正在装载虽然为每一个请求 - 不知道为什么) 我有以下选项尝试,但没有运气scrapy + splash:没有呈现整页JavaScript数据

  • 增加等待时间高达20秒
  • 通过启动docker“--disable-pr ivate模式
  • 通过使用lua_script滚动
  • 随着视图报告的完整选项初始页面: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, 
 
        } 
 
       ) 
 

任何人都可以请一些线索对这种行为? ps:我正在使用scrapy框架,我能够从render.html解析产品信息(itemid,名称和价格)(但render.html只有16个项目信息)

+0

如何使用API​​直接获取数据而不是这么多的努力? “http://www.gap.com/resources/productSearch/v1/search?cid=80799” –

+0

嗨塔伦,谢谢你的答复。但我的目标是抓取网站上列出的每个产品(例如这里的每个裤子)并获得所有可用的裙子(例如,该裤子具有近23个尺寸(Skus),我可以从视图源看到[链接]( http://www.gap.com/browse/product.do?cid=80868&pcid=80799&vid=1&pid=844309052),我没有通过api找到,我是新的api方法,请给我一些资料 – Tez

+0

I尝试使用** splash:set_viewport_full()**但没有运气,并试图与scrpay也像 **产量SplashRequest(url,self.parse_product_contents,args = {'等待':10,'视口':'完整' 'render_all':1},终点= 'render.html')** 仍然没有运气 但是,当我设置视图报告尺寸大尺寸 '飞溅:我看到set_viewport_size(1980,8020)' 内容吨装载,但仍然有限制。当我尝试增加png的尺寸时出现这个错误 '视口超出范围(20000x20000,area = 16000000)' – Tez

回答

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有最后的产品

Last Image on page

Splash Rendered HTML

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

+0

多数民众赞成在伟大的!但是当我尝试在本地启动时运行相同的脚本时,出现了错误的请求错误。有什么我需要得到它的工作?请告诉我 ' { “类型”: “ScriptError”, “错误”:400, “说明”: “时发生错误而执行的Lua脚本”, “信息”:{ “LINE_NUMBER”: 9, “type”:“LUA_ERROR”, “source”:“[string \”function main(splash)\ r ... \“]”, “message”:“Lua error:[string \”function main(splash)\ r ... \“]:9:network3”, “error”:“network3” } }' – Tez

+0

我拉过最新的docker镜像,可能是您使用的是旧的?也尝试更改'功能主(飞溅)''功能主(飞溅,参数)' –

+0

我已经拉动码头图像3天前(**码头拉scrapplehub /飞溅**)我相信这是最新的一个。我尝试过使用** function main(splash,args)**我面对同样的网络问题。让我再次检查码头工人。你有没有机会拉**拉scrapinghub /飞溅:主**? – Tez