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