2016-11-14 5 views
1

Я интегрировал Scrapy-всплеск в моем CrawlerSpider process_request в правилах, как это:SCRAPY разбрызгивания не ползать рекурсивно с CrawlerSpider

def process_request(self,request): 
    request.meta['splash']={ 
     'args': { 
      # set rendering arguments here 
      'html': 1, 
     } 
    } 
    return request 

Проблема заключается в том, что ползать оказывает только URLS в первой глубине, I интересно также, как я могу получить ответ даже с плохим http-кодом или перенаправленным ответом;

Спасибо заранее,

ответ

0

Ваша проблема может быть связана с этим: https://github.com/scrapy-plugins/scrapy-splash/issues/92

Короче, попробуйте добавить к вашему разбору функции обратного вызова:

def parse_item(self, response): 
    """Parse response into item also create new requests.""" 

    page = RescrapItem() 
    ... 
    yield page 

    if isinstance(response, (HtmlResponse, SplashTextResponse)): 
     seen = set() 
     for n, rule in enumerate(self._rules): 
      links = [lnk for lnk in rule.link_extractor.extract_links(response) 
        if lnk not in seen] 
      if links and rule.process_links: 
       links = rule.process_links(links) 
      for link in links: 
       seen.add(link) 
       r = SplashRequest(url=link.url, callback=self._response_downloaded, 
               args=SPLASH_RENDER_ARGS) 
       r.meta.update(rule=rule, link_text=link.text) 
       yield rule.process_request(r) 

В случае, если вам интересно почему это может вернуть оба элемента и новые запросы. Вот от Doc: https://doc.scrapy.org/en/latest/topics/spiders.html

В функции обратного вызова, вы разбор ответа (веб-странице) и вернуть либо dicts с извлеченными данными, объектами Пункта, Запроса объектами, или Iterable из них объекты. Эти Запросы также будут содержать обратный вызов (возможно, тот же самый), и затем будут загружены Scrapy, а затем их ответ , обработанный указанным обратным вызовом.

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