【问题标题】:Scrapy-splash - does splash:go(url) in lua_script perform GET request again?Scrapy-splash - lua_script 中的 splash:go(url) 是否再次执行 GET 请求?
【发布时间】: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())

编辑

我还想等到AJAXsplash:wait(2) 执行得更好。是否有可能以某种方式等到桌子改变?理想情况下有一些超时。

【问题讨论】:

    标签: javascript python scrapy splash-screen scrapy-splash


    【解决方案1】:

    Lua 脚本非常字面化 - 如果您有 1 个 splash:go,那么 1 个启动程序会发出一个请求。
    您的爬虫在这里很好。

    尽管毫无意义地挑剔:您的蜘蛛通过 http 连接到工作人员,因此理论上发出了两个请求:第一个是启动服务,第二个是由启动工作人员定位的目标。

    【讨论】:

      猜你喜欢
      • 2018-11-14
      • 1970-01-01
      • 1970-01-01
      • 2013-03-08
      • 1970-01-01
      • 1970-01-01
      • 2020-04-20
      • 1970-01-01
      • 2018-11-15
      相关资源
      最近更新 更多