2017-07-17 131 views
0

背景:我正在使用Scrapy从http://shop.nordstrom.com/c/mens-tshirts中抓取和刮取产品数据。该页面是动态生成的,所以我使用Scrapy-Splash来处理JavaScript。问题是,单击页面底部的“下一步”按钮是进入后续产品页面的唯一方法。如果您复制第2页的该网址并将其粘贴到新标签中,则该网页上没有任何产品。使用Scrapy-splash导航动态页面

为了解决这个问题,我尝试使用Selenium中的.click()函数导航到下一页,并使用driver.page_source来提取页面的html。

问题:有没有一种方法可以将我解压缩到的Splash(在docker容器中运行)的html/javascript源代码传入,而不是传递一个url?我已经尝试在我的本地机器上保存html并传递文件路径,但是这会导致502 Bad Gateway,因为Splash会自动将“http://”预先添加到路径中。

也许有一个更好的方法来实现我的目标,如果是这样的话我愿意接受任何选择。请记住,该解决方案必须适合可扩展性和云部署。谢谢!

回答

0

你可以写一个飞溅的Lua脚本调用splash:set_content,而不是接受一个URL,这样的事情:

function main(splash, args) 
    assert(splash:set_content(args.html_source)) 
    -- page is loaded, process it as needed 
end 

您也可以点击飞溅本身的按钮 - 看element:mouse_click,是这样的:

function main(splash, args) 
    assert(splash:go(args.url)) 
    splash:select('.next'):mouse_click() 
    splash:wait(5.0) 
    return splash:html() 
end 

查看tutorialLua API overview了解更多。您可以像在Selenium中一样与页面交互;并非所有的硒助手都可用,但基本知识在那里。

+0

我正在使用Scrapy做实际的抓取,有没有办法将该html传递给Scrapy(代替url)。通常我只是在'RENDER_HTML_URL'上调用Scrapy,其中Splash呈现JS(在本地Docker容器中),但如果我可以避免在本地运行容器,那将是非常优选的。 另外,第二个Lua脚本是否实际渲染了JS?这是我首先使用Splash的全部原因。 – somedude

+0

您可以将Splash中的HTML传递给Scrapy,并在Scrapy端处理它 - 调用“return splash:html”(检查链接教程)。但我不确定为什么你需要这个在第一个例子中,因为Selenum也处理JS。是的,第二个Lua脚本呈现JS,Splash默认是这样做的。 –