2017-02-23 64 views
1

我试图抓取广告的网页。广告缩略图显示在分页的第一页上。点击每个缩略图会显示特定广告的详细信息,其中包含广告的发布日期。现在我只想抓取最后一天发布的广告。Scrapy获取回调数据

我的Scrapy蜘蛛具有以下结构:

#opens the homepage 
def start_requests(self): 
     url = 'url_to_page' 
     yield scrapy.Request(url=url, callback=self.parse) 

#parse the page for ad links and follow each of them 
def parse(self, response): 
    #get all links from current page; not shown here 
    for link in ad_links: 
     request = scrapy.Request(link, callback=self.parse_single_ad) 

    #follow the next page, only if today's date > posting date <--- 

def parse_single_ad(self, response): 
    #get the posting date; not shown here 
    return item 

的问题是,我只能访问到parse_single_ad()过帐日期,但我具有基于广告的发布日期停止分页中parse() 。有没有办法从parse()访问parse_single_ad()中检索到的物品?更一般地说,我可以从其父函数访问回调的数据吗?

回答

1

只要您想手动关闭Spider,就可以使用CloseSpider

如果需要,您可以在您的Spider课程中或甚至在Pipeline中执行此操作。

from scrapy import scrapy.exceptions.CloseSpider 

def parse(self, response): 
    if some thing: # write your condition here 
      raise CloseSpider('All ads scraped, now closing spider.') 
    else: 
      # Scrape next page 

编辑:

OP说,直到广告的详细信息页面刮他没有获得广告的发布日期。

但看这个,你有广告的日期张贴在列表页面。

enter image description here

+0

这只会关闭递归的当前分支吗?如果我有许多网站,首先要做什么? – Botond

+0

它会关闭Spider的执行...如果你有很多'start_urls',那么你将会有问题......因为'CloseSpider'只是QUITS蜘蛛。 – Umair

+0

什么是你在刮的网站?我有一个想法,如果你在'start_urls'中的每个URL都有一些特定的字符串,那么我们可以忽略'process_request'方法中的特定URL。请分享你正在抓取的网站,我会帮你。 – Umair