isinstance (결과 types.GeneratorType)를 생성 여부를 판단
큐 기다리는 것은 빈, 블록 = 거짓 범위는 불평 할 것이다
reactor.callLater (0 self.next_request)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
에서 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 ()