1

我正在尝试使用 selenium phantomjs 将动态网站的抓取更改为 scrapyjs。但问题是如果我们在 splash 中编写一个点击事件,它需要一个 yield 请求才能工作。如果我们发出一个 yield 请求,它将呈现第一页。所以我们在源代码中看不到点击事件的变化。即,无需重新渲染网页。在硒中是可能的。飞溅中是否有任何相同的功能?

4

1 回答 1

0

得到了使用 lua 变量的解决方案。我们可以通过启动元参数传递变量。例子:

    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 变量的解决方案。所以这里使用一个简单的逻辑来获取点击元素。

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
})
于 2016-04-04T13:02:21.710 回答