【发布时间】:2019-01-23 12:26:18
【问题描述】:
我是 Scrapy-splash 的新手,我正在尝试抓取一个懒惰的 datatable,它是一个带有 AJAX 分页的表格。
所以我需要加载网站,等到JS被执行,获取表格的html然后点击分页上的“下一步”按钮。
我的方法有效,但恐怕我要两次请求该网站。
当我第一次产生SplashRequest 然后当lua_script 被执行时。
这是真的吗?如果是,如何让它只执行一次请求?
class JSSpider(scrapy.Spider):
name = 'js_spider'
script = """
function main(splash, args)
splash:go(args.url)
splash:wait(0.5)
local page_one = splash:evaljs("$('#example').html()")
splash:evaljs("$('#example_next').click()")
splash:wait(2)
local page_two = splash:evaljs("$('#example').html()")
return {page_one=page_one,page_two=page_two}
end"""
def start_requests(self):
url = f"""https://datatables.net/examples/server_side/defer_loading.html"""
yield SplashRequest(url, endpoint='execute',callback=self.parse, args={'wait': 0.5,'lua_source':self.script,'url':url})
def parse(self, response):
# assert isinstance(response, SplashTextResponse)
page_one = response.data.get('page_one',None)
page_one_root = etree.fromstring(page_one, HTMLParser())
page_two = response.data.get('page_two',None)
page_two_root = etree.fromstring(page_one, HTMLParser())
编辑
我还想等到AJAX 比splash:wait(2) 执行得更好。是否有可能以某种方式等到桌子改变?理想情况下有一些超时。
【问题讨论】:
标签: javascript python scrapy splash-screen scrapy-splash