2015-05-22 10 views
6

jedes Mal, wenn ich meinen Code ausführen meine IP wird gesperrt. Ich brauche Hilfe, um jede Anfrage für 10 Sekunden zu verzögern. Ich habe versucht, DOWNLOAD_DELAY in Code zu platzieren, aber es gibt keine Ergebnisse. Jede Hilfe wird geschätzt.Scrapy Verzögerung Anfrage

# 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

versuchen Sie dies, bevor Sie Ihre Anfrage time.sleep versuchen könnte (10) – Ajay

+0

Wo soll ich time.sleep put() genau? –

+0

kann nach dieser Zeile sein Ich denke absolute_url = self.BASE_URL + Link – Ajay

Antwort

10

Sie müssen DOWNLOAD_DELAY in settings.py Ihres Projekts festlegen. Beachten Sie, dass Sie möglicherweise auch die Nebenläufigkeit einschränken müssen. Standardmäßig beträgt die Nebenläufigkeit 8, sodass Sie die Website mit 8 gleichzeitigen Anfragen erreichen.

# settings.py 
DOWNLOAD_DELAY = 1 
CONCURRENT_REQUESTS_PER_DOMAIN = 2 

Beginnend mit Scrapy 1.0 können Sie auch benutzerdefinierte Einstellungen in Spinne platzieren, so dass Sie so etwas tun könnte:

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 und Gleichzeitigkeit sind pro Downloader Steckplatz nicht festgelegt pro Anfragen. Um tatsächlich überprüfen, was Sie herunterladen haben Sie so etwas wie dieses

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

Nur um zu bemerken, dass es möglich ist, 'download_delay' pro Spinne auch in Version 0.24 zu konfigurieren, wie in der URL angegeben, mit der Sie verlinkt haben:' Sie können diese Einstellung auch ändern, indem Sie das Attribut download_delay spider setzen – bosnjak