使用Scrapy-splash导航动态页面

时间:2017-07-17 21:35:34

标签: javascript selenium dynamic web-crawler scrapy-splash

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

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

问题:有没有办法将我提取的html / javascript源传递到Splash(在docker容器内运行),而不是传入url?我已经尝试在我的本地计算机上保存html并传递文件路径,但这会导致502 Bad Gateway,因为Splash会自动将'http://'添加到路径中。

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

1 个答案:

答案 0 :(得分:1)

您可以编写一个Splash Lua脚本,该脚本调用splash:set_content而不是接受URL,如下所示:

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

您也可以点击Splash本身的按钮 - 请参阅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一样与页面进行交互;并非所有的Selenium助手都可以使用,但基础知识都在那里。