2015-05-22 21 views
6

mỗi khi tôi chạy mã của tôi, ip của tôi bị cấm. Tôi cần trợ giúp để trì hoãn từng yêu cầu trong 10 giây. Tôi đã cố gắng đặt DOWNLOAD_DELAY trong mã nhưng nó không cho kết quả. Bất kỳ trợ giúp được đánh giá cao.Yêu cầu trì hoãn lậu

# 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

thử loại này trước khi yêu cầu time.sleep của bạn (10) – Ajay

+0

đâu tôi nên đặt time.sleep() chính xác? –

+0

có thể nằm sau dòng này tôi đoán là absolute_url = self.BASE_URL + liên kết – Ajay

Trả lời

10

Bạn cần đặt DOWNLOAD_DELAY in settings.py dự án của mình. Lưu ý rằng bạn cũng có thể cần phải hạn chế đồng thời. Theo mặc định concurrency là 8 vì vậy bạn đang nhấn trang web với 8 yêu cầu đồng thời.

# settings.py 
DOWNLOAD_DELAY = 1 
CONCURRENT_REQUESTS_PER_DOMAIN = 2 

Bắt đầu với Scrapy 1.0 bạn cũng có thể đặt các thiết lập tùy chỉnh trong nhện, vì vậy bạn có thể làm một cái gì đó như thế này:

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 và đồng thời được thiết lập cho mỗi khe downloader không theo yêu cầu. Để thực sự kiểm tra những gì tải về bạn có bạn có thể thử một cái gì đó như thế này

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

Chỉ cần lưu ý rằng có thể định cấu hình 'download_delay' trên mỗi con nhện ngay cả trong phiên bản 0.24, như đã nêu trong URL bạn đã liên kết với:' Bạn cũng có thể thay đổi cài đặt này cho mỗi spider bằng cách thiết lập thuộc tính spider download.el.' – bosnjak