2017-04-06 3 views
0

Ich habe noch nie Scrapy verwendet. Bitte helfen!Python Scrapy: Wie verwende ich self.download_delay

Ich möchte für jede Anforderung in der "next_link", um eine Verzögerung machen

Beispiel:

GET https://example.com/?page=1

Verzögerung 30 Sekunden

GET https://example.com/?page=2

Verzögerung 30 Sekunden

class CVSpider(scrapy.Spider): 
    name = 'cvspider' 
    start_urls = ["login"] 
    custom_settings = { 
     'DOWNLOAD_DELAY': 0, 
     'RANDOMIZE_DOWNLOAD_DELAY': True 
    } 

    def __init__(self, search_url, name=None, **kwargs): 
     self.search_url = search_url 

    def parse(self, response): 
     xsrf = response.css('input[name="_xsrf"] ::attr(value)')\ 
         .extract_first() 
     return scrapy.FormRequest.from_response(
      response, 
      formdata={ 
       'username': USERNAME, 
       'password': PASSWORD, 
       '_xsrf': xsrf 
      }, 
      callback=self.after_login 
     ) 

    def after_login(self, response): 
     self.logger.info('Parse %s', response.url) 
     if "account/login" in response.url: 
      self.logger.error("Login failed!") 
      return 

     return scrapy.Request(self.search_url, callback=self.parse_search_page) 

    def parse_search_page(self, response): 
     cv_hashes = response\ 
      .css('table.output tr[itemscope="itemscope"]::attr(data-hash)')\ 
      .extract() 
     total = len(cv_hashes) 
     start_time = datetime.now() 
     next_link = response.css('a.Controls-Next::attr(href)')\ 
          .extract_first() 
     if total == 0: 
      next_link = None 
     if next_link is not None: 
      self.download_delay = 30 - does not work 
      yield scrapy.Request(
       "https://example.com" + next_link, 
       callback=self.parse_search_page 
      ) 

Antwort

0

Es gibt eine Einstellungsoption, um dies zu erreichen. In settings.py Datei gesetzt DOWNLOAD_DELAY, wie folgt aus:

DOWNLOAD_DELAY = 30000 # Time in milliseconds (30000 ms = 30 seconds) 

Aber denken Sie daran custom_settings aus dem Code zu entfernen.


Wenn Sie dies mit benutzerdefinierten Einstellung tun wollen für diese Spider, dann ändern Sie den Code wie folgt aus:

class CVSpider(scrapy.Spider): 
    name = 'cvspider' 
    start_urls = ["login"] 
    custom_settings = { 
     'DOWNLOAD_DELAY': 30000, 
     'RANDOMIZE_DOWNLOAD_DELAY': False 
    } 

    def __init__(self, search_url, name=None, **kwargs): 
    ... 

Sie zum documentation für mehr Verständnis auf, dass verweisen.

+0

DOWNLOAD_DELAY ist für alle Anforderungen festgelegt, aber ich brauche nur für: self.download_delay = 30 - nicht Ausbeute scrapy.Request funktioniert ( –

+0

Sie können mit 'sleep()' hier –

0

Die Idee ist, nur die Variable download_delay in Ihrem Spider einzurichten, und scrapy wird den Rest erledigen, Sie müssen es nicht wirklich "verwenden".

so setzen Sie ihn einfach auf wie:

class MySpider(Spider): 
    ... 
    download_delay = 30000 
    ... 

, die es ist.

+0

Ich möchte ein setzen? Verzögerung nur für parse_search_page func –