표준 파충류에서 파이썬의 부모에서 저녁 식사!

  우선 그는 헤드 라인 파티 만든 것을 인정해야한다, 본 논문의 본질은 주소 500lines 이하 크롤링 프로젝트를 분석하는 것이다,이 프로젝트가 https://github.com/aosabook/500lines이며, 관심있는 학생들은 매우 높은 볼 수 있습니다 오픈 소스 프로젝트의 품질 컬렉션, 책을 쓰고 있다고하지만, 코드에 제출 한 기록을 찾고,이 책은 곧 시간이 안된다. 이 문서는 매우 찌꺼기가 기록 된 오류가 아 언급해야합니다. . .

 

  의 하나 또는 여러 개의 초기 페이지의 웹 크롤러 URL은 웹 페이지를 크롤링하는 과정에서, 초기 페이지의 URL로 취득하고, 시스템이 정지 조건을 충족해야합니다 때까지 대기열에 현재 페이지에서 새 URL을 추출하기 위해 계속됩니다. 단순 웹 크롤러 조건이 트리거되지 종료 조건 while 루프로 이해 될 수 있으며, 항상 각 페이지에서 데이터를 획득하기 위해 러 및 취득한 전송 요청 URL은, 현재 페이지의 URL을 파싱 계속 아래로 반복. 파이썬하여 현재 요청이 다시 예약 후, 다음, 현재 작업을 일시 중단 실패했을 때 엔지니어링 사이 크롤링,이 과정이 완료 크롤러 클래스, 그는하는 수, 폭 우선 또는 깊이 우선 파충류를 사용하지 않은 겨우 기반 네트워크 접속을 다음과 같이 동작 모드 인 * 검색을 이해 :

  

  바쁜 수집, 다른 파충류 데이터 URL을 수집 보존 대기; 다 된 수집, 보존 완료 페이지 크롤링 URL이 URL을, 할 일 수집, 저장입니다, 아직 URL을 크롤러 작업을 계속하는 초기화 후 크롤러 개체에 모음. 핵심 파충류 먼저 모든 파충류, 객체가 페이지에 URL을 가져 얻기 위해 사용되는 초기화 한 후, 할 일의 세트 중에서 URL을 얻을 최종 작업 스케줄링 요청 URL 작업을 수행, 죽음의주기이다. 다음 코드와 같이이 과정.

1  asyncio.coroutine @
 2  데프 크롤링 (자기) :
 3          "" " 모두 완료 될 때까지 실행 러. " "" 
4          (과 수율  에서 self.termination) :
 5              동안 self.todo 또는 self.busy :
 6                  의 경우 자체. TODO :
 7                      URL, max_redirect = self.todo.popitem ()
 8                      페처 = 가져 오기 (URL,
 9                                        크롤러 = 자기,
 10                                        max_redirect = max_redirect,
11                                        에 max_tries = 용의 self.max_tries은,
 12                                        )
 13                      self.busy [경로] = 페처
 14                      fetcher.task = asyncio.Task (self.fetch (가져 오기))
 15                  다른 :
 16                      항복  에서 self.termination.wait ()
 17          자기. T1 =로 time.time ()

   

  분명히 크롤러 단독 무한 루프로 구성되지 않으며, 외부 층은 다음과 같은 네트워크 연결 URL 취득 태스크 스케줄링 작업 프로젝트 스케줄링 워크 전체를 크롤링 포함 그 크롤링 동작의 다른 모듈들을 지원할 필요가있다 :

 

  에 초기화 시간 ConnectionPool 만들기 먼저 크롤링을 만들 :

 

  self.pool = ConnectionPool (max_pool, max_tasks)

  그리고 유지성 각각 연결 큐, 후속 스케줄링 수집 대기열 연결 지주 것을 특징으로 연결 및 호스트 포트 번호를 저장 (asyncio.open_connection 통해 얻은 SSL 등)를 지원한다.

  self.connections = {#} {(호스트 포트, SSL) [연결 ...], ...}
  self.queue = [] # [연결 ...]

  작업을 수행하는 방법은, 제 1로드 loop.run_until_complete 통해 기어 (crawler.crawl는 ())하는 이벤트 루프는 다음에 풀 ConnectionPool 내장 상기 문장이 링크 접속 대상물 저장된 상기 접속 대상물은 다음에 의해 획득되는 방법 크롤링 오브젝트 페처 페치 데이터 걸릴. 사용한 작업 URL 요청 페처 처리, 스케줄링 사용 asyncio.Task의 스케줄링 방법. 어떤 asyncio.Task 실행에 발전기의 요령을 얻을 수있는 방법을 가져.

  그리고 asynico.coroutine 문에서 수율이 방법은 시간, 처리는 스케줄러에 의해 수행되는 경우 보류 fetcher.fetch () 메소드를 실행, 실행시에 발전기가된다.

  fetcher.fetch () 메소드는 시도가 상한 정지 동작에 도달 할 때 페이지 데이터를 가져 오기 위해 시도하는 네트워크에서 할 일 중 모음에로드 된 URL과 페이지 데이터를 가져 오는 책임이 웹 크롤러의 핵심 방법, 성공하는 HTML 외부 데이터 링크 및 리디렉션 링크가 저장됩니다. URL 링크 수가 상한에 도달 한 경우에,이 URL 링크 동작 출력 에러 로그를 중지한다. 페이지의 다른 상태 후, 다른 접근 방식을.

  다음 코드는 대응하는 영역에있어서의 스타트 라인 (crawling.py)의 단부로부터 333 crawling.py 파일이고, 페이지 상태의 선택은 다른 방법에 의해 결정된다. 정규 표현식, 페이지 URL에 대한 정보에 액세스가 여기에 선택된 문자열 HREF의 시작이고, 핵심 URL을 아래의 코드를 추출 : 

1  #이 함께 HREF 교체 (? HREF | SRC) 이미지 링크를 따르십시오. 
2 self.urls = 세트 (re.findall (R ' ? (I) HREF = "\'([^ \ S?"\ "<>] +) ' , 본체))
 (3)  의 경우 self.urls :
 4      logger.warn ( ' % R %의 연구 구별 URL에있어 ' , 렌 (self.urls) self.url)
 5      self.new_urls = 세트 ()
 (6)      에 대한 URL self.urls :
 7          URL = 언 이스케이프 (URL)
 8          URL = urllib.parse.urljoin (self.url, URL)
 9          URL, 파편 =urllib.parse.urldefrag (URL)
 (10)          의 경우 self.crawler.add_url (URL) :
 11              self.new_urls.add (URL)            

  코드를 통해, 현재 크롤러 중 페처 객체에 추가하면 결과 일정한 세트는 for 루프에 의해 처리 매칭 TODO URL을 순차적 간의 설정에 저장된다 볼 수 명백하다.

 

  추가 분석을 위해 crawl.py 마스터 파일의 사전 분석을 바탕으로, 우리는 파충류의 전체 구조를 얻을 수 있습니다 :

  이것은 제 argparse.ArgumentParser 분석을 통해 어느 마스터 파일에서 수행되고, IOCP 이벤트 루프 타겟 윈도우 환경으로 선택된 상기 데이터 판독 및 제어 콘솔이 제공된다. 주요 방법은, 첫째, 루트 특성이없는, 프롬프트를 사전 명령 경우 parse_args에 의해 저장된 데이터를 반환했습니다. 이어서 출력하지 최소 레벨 이하, 로그 레벨 로그 출력 레벨 표시를 구성.

  명령의 첫번째 라인 파라미터에 따라, 주 엔트리 포인트 법에 의해 프로그램을 입력하면 대형이 될 초기화 얻을 사용 asyncio 루프 이벤트 객체 실행 run_until_complete에 있어서,이 프로그램 실행이 종료 될 때까지 실행된다.

  또한 현재 인쇄 작업의 구현을 위해 reporting.py. 인쇄 작업 상태의 URL (가져 오기, 통계, 파일 = 없음) fetcher_report없는, url은 URL 가져 오기 속성입니다, 전체 프로젝트의 보고서 (크롤러, 파일 = 없음) URL 인쇄 작업 상태를 모두 완료했다.

  至此,crawl的基本框架就展现在眼前了。至于在这个程序中出现的一些不容易理解的python语言特性,某些应用到的核心模块,将在下一篇博客《标准爬虫分析,精简不简单!》中进行阐述。

 

转载于:https://www.cnblogs.com/wangbiaoneu/p/crawl-python-500lines.html

추천

출처blog.csdn.net/weixin_34413103/article/details/93550861