2016-06-08 3 views
1

Я хочу получить данные только со страниц, где «имя» содержит некоторый узор другие страницы, которые я хочу пропустить.scrapy middleware для пропустить некоторую страницу

Теперь это так

def parse_item(self, response): 
    item=Item() 
    item['name']=response.xpath('//title//text()').extract().first() 
    if "pattern" not in item['name']: 
    return [] 
    else: 
    return item 

, как это сделать, как промежуточный слой?

ответ

0

грустно ответил на мой собственный вопрос, но то, что может i do ...

def process_response(self,request, response, spider): 
     if not spider._rules: 
      return response 
     rule_index=request._meta.get('rule',None) 

     response_callback=None 
     if rule_index != None: 
      rule = spider._rules[rule_index] 
      response_callback=rule.callback 


     if response_callback and response_callback == getattr(spider,self.settings['PARSE_FUNCTION']): 
      ## do something 
     return response 
2

Вы должны использовать Downloader Middleware специально из-за process_response предлагает

из scrapy.exceptions импорта IgnoreRequest

class SkipMiddleware(object): 
    def process_response(self, request, response, spider): 
     if spider.name == 'myspider' and request.callback == spider.parse_item: 
      if 'pattern' not in response.xpath('//title//text()').extract_first(): 
      raise IgnoreRequest 
     return response 

забудьте activate it

+0

thx, работает отлично –

+0

, но он для всех страниц –

+0

может сделать это только для parse_item()? –

Смежные вопросы