사용자 정의 로우의 Scrapy 소스 분석 프레임 워크 버전

isinstance (결과 types.GeneratorType)를 생성 여부를 판단

큐 기다리는 것은 빈, 블록 = 거짓 범위는 불평 할 것이다

reactor.callLater (0 self.next_request)

에서 twisted.internet 가져 오기 원자로    #의 이벤트 루프 (종료 조건, 소켓 모두 제거되었습니다) 
에서 twisted.web.client 가져 오기 getPage #의 소켓 객체 (다운로드가 완료되면, 시간이 자동으로 ... 순환에서 제거) 
에서 트위스트 .internet 가져 오기 연기에      #이 (하지 재전송 요청, 수동으로 제거) 특별한 소켓 객체를 defer.Deferred 

클래스 요청 (객체) : 

    DEF  __init__ (자체, URL 콜백) : 
        self.url = URL의 
        self.callback = 콜백
 클래스를 HttpResponse에 (객체) : 

    DEF  __init__ (자체 콘텐츠, 요청) :
        self.content의 =콘텐츠 
        self.request = 요청 
        self.url = request.url 
        self.text = STR (콘텐츠 인코딩 = " UTF-8 " ) 


클래스 ChoutiSpider (오브젝트) 
    이름 = ' chouti가 ' 

    데프 start_requests (자기) 
        START_URL = ' http://www.baidu.com ' , ' http://www.bing.com ' ,]
         에 대한 URL START_URL :
             수율 요구 (URL, self.parse) 

    DEF(자동 응답) 분석
         인쇄 (응답) #의 页面下载的是반응 
        수율 요청 ( ' http://www.cnblogs.com ' , 콜백 = self.parse) 

수입 
Q = queue.Queue () 

클래스 (엔진 오브젝트) 

    DEF  __init__ (자기) 
        self._close = 없음 
        self.max = 5 
        self.crawlling = [] 

    DEF get_response_callback (자기, 콘텐츠 요청)  
        self.crawlling.remove ( 의뢰) = HttpResponse에 (콘텐츠 요청) 
        결과 =request.callback (담당자)
         수입 유형의
         경우 isinstance (결과, types.GeneratorType)
             에 대한 REQ 결과 : 
                Q.put (REQ) 



    데프 _next_request (자기) :
         "" " 
        去取요청对象,发送请求并
        最大并发数限制
        : 창 : 
        "" " 
        인쇄 (self.crawlling, Q.qsize ())
         의 경우 Q.qsize () == 0  LEN (self.crawlling) == 0 
            self._close.callback (없음) 
            

        경우 렌 ( self.crawlling)> = self.max :
             리턴 
         동안 LEN (self.crawlling를) < self.max :
             은 try : 
                REQ = Q.get (블록 = 거짓) 
                self.crawlling.append (REQ) 
                D = getPage (REQ. url.encode ( ' UTF-. 8 ' ))
                 #의 페이지 다운로드, get_response_callback, 거미 호출 구문 분석 사용자 정의 방법 및 스케줄러에 새로운 요청 추가 완료 
                d.addCallback은 (self.get_response_callback는 REQ)
                 #은 최대 동시에 도달하지 않는다 번호, 일정 갈 수 요청 용기를 가져 
                d.addCallback ( 람다를 _ : reactor.callLater (0, self._next_request))
            을 제외한 E AS 예외 :
                 인쇄(E)
                 반환 

    defer.inlineCallbacks의 @ 
    DEF의 크롤 (자체, 거미) :
         #은 스케줄러 원래 요청 객체를 추가 
        start_requests = ITER (spider.start_requests ())
         그동안 : 사실
             은 try : 
                요청 = 다음 (start_requests) 
                (Q.put 요청) 
            을 제외한 E로서 대하여 StopIteration :
                 브레이크 

        # 1 스케줄러 페치 요청 및 요청 전송하도록 
        #의 self._next_request () 
        reactor.callLater (0 self._next_request) 

        self._close= defer.Deferred ()
         수득 self._close의 

거미 = ChoutiSpider ()를 


_active = ()로 설정 
엔진 = 엔진 () 
D = engine.crawl (거미) 
_active.add (d) 

DD = defer.DeferredList (_active) 
dd.addBoth ( 람다 A : reactor.stop ()) 

reactor.run ()
사용자 정의 Scrapy 프레임 워크 평

추천

출처www.cnblogs.com/jintian/p/11440028.html