您想要丢弃某个日期范围之外的玩家
您需要做的就是检查date
in parsePlayer
,并仅返回相关的。
def parsePlayer(self,response):
player = new PlayerItem();
extract DATE
if DATE == some_criteria:
yield player
您想要按顺序废弃每个链接并在到达某个日期时停止
例如,如果您遇到性能问题(您废弃了太多链接,并且在一定限制后不需要这些链接)。
鉴于 Scrapy 在非对称请求中工作,没有真正好的方法来做到这一点。唯一的方法是尝试强制线性行为而不是默认的并行请求。
让我解释。当您有两个这样的回调时,默认行为 scrapy 将首先解析第一页(主页)并将对播放器页面的所有请求放入其队列中。无需等待第一页完成废弃,它将开始处理这些对播放器页面的请求(不一定按照找到它们的顺序)。
因此,当你获取到播放器页面的信息时p
已经过时了,它已经already已发送内部请求p+1
, p+2
...p+m
(m
基本上是一个随机数)并且可能已经开始处理其中一些请求。甚至有可能p+1
before p
(没有固定顺序,请记住)。
因此,如果您保持这种模式,就无法完全停在正确的页面,也无法与parse
from parsePlayer
.
你什么can要做的就是强制它按顺序跟踪链接,以便您拥有完全的控制权。缺点是这会对性能造成很大影响:如果 scrapy 一个接一个地跟踪每个链接,则意味着它无法像通常那样同时处理它们,并且会减慢速度。
代码可能是这样的:
def parse(self, response):
sel = Selector(response)
self.container = sel.css('div[MyDiv]')
return self.increment(0)
# Function that will yield the request for player n°index
def increment(index):
player = self.container[index] # select current player
extract LINK and TITLE
yield Request(LINK, meta={'Title': Title, 'index': index}, callback=self.parsePlayer)
def parsePlayer(self,response):
player = new PlayerItem();
extract DATE
yield player
if DATE == some_criteria:
index = response.meta['index'] + 1
self.increment(index)
这样,scrapy 将获取主页,然后是第一个播放器,然后是主页,然后是第二个播放器,然后是主页面,等等......直到找到不符合条件的日期。然后主函数就没有回调,蜘蛛就停止了。
如果您还必须增加主页的索引(例如,如果有 n 个主页),这会变得更加复杂,但想法保持不变。