2015-05-22 14 views
6

Ogni volta che eseguo il mio codice il mio IP viene bannato. Ho bisogno di aiuto per ritardare ogni richiesta per 10 secondi. Ho provato a inserire DOWNLOAD_DELAY nel codice ma non dà risultati. Qualsiasi aiuto è apprezzato.Richiesta ritardo scrapy

# item class included here 
     class DmozItem(scrapy.Item): 
      # define the fields for your item here like: 
      link = scrapy.Field() 
      attr = scrapy.Field() 


     class DmozSpider(scrapy.Spider): 
      name = "dmoz" 
      allowed_domains = ["craigslist.org"] 
      start_urls = [ 
      "https://washingtondc.craigslist.org/search/fua" 
      ] 

      BASE_URL = 'https://washingtondc.craigslist.org/' 

      def parse(self, response): 
       links = response.xpath('//a[@class="hdrlnk"]/@href').extract() 
       for link in links: 
        absolute_url = self.BASE_URL + link 
        yield scrapy.Request(absolute_url, callback=self.parse_attr) 

      def parse_attr(self, response): 
       match = re.search(r"(\w+)\.html", response.url) 
       if match: 
        item_id = match.group(1) 
        url = self.BASE_URL + "reply/nos/vgm/" + item_id 

        item = DmozItem() 
        item["link"] = response.url 

        return scrapy.Request(url, meta={'item': item}, callback=self.parse_contact) 

      def parse_contact(self, response): 
       item = response.meta['item'] 
       item["attr"] = "".join(response.xpath("//div[@class='anonemail']//text()").extract()) 
       return item 
+0

provare questo prima della richiesta time.sleep (10) – Ajay

+0

dove dovrei mettere time.sleep() esattamente? –

+0

potrebbe essere dopo questa riga suppongo absolute_url = self.BASE_URL + link – Ajay

risposta

10

È necessario impostare DOWNLOAD_DELAY in settings.py del progetto. Si noti che potrebbe essere necessario limitare la concorrenza. Di default, la concorrenza è 8, quindi stai colpendo il sito con 8 richieste simultanee.

# settings.py 
DOWNLOAD_DELAY = 1 
CONCURRENT_REQUESTS_PER_DOMAIN = 2 

Partendo Scrapy 1.0 è anche possibile effettuare impostazioni personalizzate in ragno, così si potrebbe fare qualcosa di simile:

class DmozSpider(Spider): 
    name = "dmoz" 
    allowed_domains = ["dmoz.org"] 
    start_urls = [ 
     "http://www.dmoz.org/Computers/Programming/Languages/Python/Books/", 
     "http://www.dmoz.org/Computers/Programming/Languages/Python/Resources/", 
    ] 

    custom_settings = { 
     "DOWNLOAD_DELAY": 5, 
     "CONCURRENT_REQUESTS_PER_DOMAIN": 2 
    } 

Delay e la concorrenza sono impostati per slot downloader non secondo le richieste. Per controllare in realtà quello Download hai si potrebbe provare qualcosa di simile

def parse(self, response): 
    """ 
    """ 
    delay = self.crawler.engine.downloader.slots["www.dmoz.org"].delay 
    concurrency = self.crawler.engine.downloader.slots["www.dmoz.org"].concurrency 
    self.log("Delay {}, concurrency {} for request {}".format(delay, concurrency, response.request)) 
    return 
+0

Solo per prendere nota che è possibile configurare 'download_delay' per spider anche nella versione 0.24, come indicato nell'URL a cui si è collegati:' È inoltre possibile modificare questa impostazione per spider impostando l'attributo spider download_delay. – bosnjak