Scrapy多次点击

时间:2017-04-04 11:00:14

标签: python scrapy splash

我试图从使用 DataTables 插件的网站上搜索代理 例如,除了一件事之外,一切都正常:蜘蛛刮第一页和第二页,而不是在其余页面上移动。

import scrapy
from scrapy_splash import SplashRequest


class SpiderManSpider(scrapy.Spider):
    name = 'usproxy'

    script = """
        function main(splash)
            local url = splash.args.url
            assert(splash:go(url))
            assert(splash:wait(1))

            assert(splash:runjs("$('.next').click();"))
            assert(splash:wait(1))

            return splash:html()
        end
        """

    def start_requests(self):
        yield SplashRequest(url='http://us-proxy.org', endpoint='render.html', callback=self.parse, args={'wait': 1})

    def parse(self, response):
        for data in response.css("tr"):
            yield {
                'ip': data.css("td:nth-child(1)::text").extract_first()
            }

        if response.xpath("//a[@id='proxylisttable_next' and @class='ui-state-disabled']").extract_first():
            self.logger.warning("button is disabled")
        else:
            yield SplashRequest(url=response.url, endpoint='execute', args={'lua_source': self.script, 'wait': 1},
                                callback=self.parse)

调试程序显示它正在填写所有重复的请求,因此我将 don&#t; t_filter 添加到 SplashRequest ,这导致我显示数据的无限循环仅来自第二页。

1 个答案:

答案 0 :(得分:0)

我有类似的问题。

似乎执行assert(splash:runjs("$('.next').click();"))时,响应中要返回的html页面将更改为新页面,但response.url仍与初始请求的url相同。

可能的解决方案是将脚本中的return语句更改为:

return {
    splash:url(),
    splash:html(),
}