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