我试图从使用 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 ,这导致我显示数据的无限循环仅来自第二页。
答案 0 :(得分:0)
我有类似的问题。
似乎执行assert(splash:runjs("$('.next').click();"))
时,响应中要返回的html页面将更改为新页面,但response.url仍与初始请求的url相同。
可能的解决方案是将脚本中的return语句更改为:
return {
splash:url(),
splash:html(),
}