我有一个通过URL递归循环的scrapy函数,在每次迭代时,我得到一个包含HTML页面的JSON响应和一个用作参数的数字来调用相同的URL来获取新数据,依此类推...
问题在于,在第二次迭代中,我没有更新响应对象(下一次迭代将包含第一次迭代的旧响应),因此相同的URL被反复刮擦。
有没有办法告诉scrapy在获得新响应之前不要进行处理?类似于同步调用,因为每次迭代都将取决于旧迭代所接收的参数。
我的代码如下所示:
def parse_tweets(self, response):
while(self.keepScroll):
#convert response
data = json.loads(response.text)
selector = Selector(text=data['items_html'], type='html')
#extract next position parameter
nextPosition = data['min_position'].split('-')
nextPosition = 'TWEET-'+nextPosition[1] + '-' + nextPosition[2]
#extract data
comments_react = self.stats_extractor('reply', selector)
retweet_react = self.stats_extractor('retweet', selector)
favorite_react = self.stats_extractor('favorite', selector)
tweets = selector.xpath('.//*[contains(@class,"js-stream-item stream-item stream-item")]/div[1]/div[2]/div[2]/p/text()').extract()
tweetdates = selector.xpath('.//*[contains(@class,"js-stream-item stream-item stream-item")]/div[1]/div[2]/div[1]/small/a/span[1]/text()').extract()
yield {
'comments' : comments_react,
'retweets' : retweet_react,
'favorites' : favorite_react,
'teweets' : tweets,
'tweetDates' : tweetdates,
}
#update parameter to get next data
self.get_params['max_position'] = nextPosition
self.keepScroll = data['has_more_items']
#call the new API with the nex parameters
yield Request(self.tweetAPIGetParams[0]+'?'+urlencode(self.get_params), callback=self.parse_tweets,dont_filter=True,cookies=self.API_Cookies,headers=self.params)