如何在没有任何产量请求的情况下从splash + scrapyjs + scrapy点击事件后获取html源代码?

时间:2016-03-28 13:17:11

标签: scrapy splash scrapyjs

我正在尝试使用selenium phantomjs来改变对scrapyjs的动态网站的抓取。但问题是如果我们在splash中编写click事件,它将需要yield请求才能工作。如果我们给出一个yield请求,它将呈现第一页。因此,我们在源代码中看不到click事件的变化。即,无需重新呈现网页。它可能在硒中。启动时是否有相同的功能?

1 个答案:

答案 0 :(得分:0)

有一个使用lua变量的解决方案。我们可以通过splash meta args传递变量。 示例:

    v = 1
    yield scrapy.Request(url, meta={'splash': {'endpoint':   'execute','args': {'lua_source': script,'indx':v}},'v':v } , callback=self.parseVariationDetailPage , dont_filter=True)

我们可以通过" splash.args.indx"来获取我们通过args传递的indx的值。

以下功能显示元素单击。

script = """
function main(splash)
     splash:autoload("https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js")
     z = splash.args.indx
     assert(splash:go(splash.args.url))
     assert(splash:wait(1))
     assert(splash:runjs("$('#listChipColor li[z]').click()"))
     assert(splash:wait(1))
     return splash:html()
end """

=====================下面的旧答案=======================

我无法在不使用scrapyjs点击事件呈现页面的情况下看到解决方案。

以下是示例代码及其工作原理。我无法获得在js中编写lua变量的解决方案。所以这里使用一个简单的逻辑来获取click元素。

scrapyjs点击

script = """
    function main(splash)
         splash:autoload("https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js")
         assert(splash:go(splash.args.url))
         assert(splash:runjs("k = window.location.href"))
         assert(splash:runjs("l = k.length"))
         assert(splash:wait(1))
         assert(splash:runjs("k =  k.charAt(l - 1)"))
         assert(splash:runjs('document.querySelectorAll("ul.colour-swatches-list > li")[k].click();'))
         assert(splash:wait(1))
         return splash:html()
end """

请求

url = url+"vl="+'%s'%v
yield scrapy.Request(url, self.parseVariationPage,meta={
  'splash': {
        'args': {'lua_source': script},'endpoint': 'execute'},
        'url':url,'type':             response.meta['type'],'category':response.meta['category'],'fit':response. meta['fit'],'v':v
})