파이썬 파충류 독서노트--다운로드 캐시(5)

3029 단어 파충류
캐시를 지원하기 위해서는 URL을 다운로드하기 전에 캐시 검사를 할 수 있도록 이전에 작성된download 함수를 수정해야 합니다.또한 속도 제한 기능을 함수 내부로 옮겨야 하며 다운로드가 실제로 발생할 때만 속도 제한을 터치하고 캐시를 불러올 때 터치하지 않습니다.
매번 다운로드할 때마다 여러 개의 매개 변수를 전송하는 것을 피하기 위해서, 우리는 이 기회를 빌려download 함수를 하나의 클래스로 재구성합니다. 이렇게 하면 매개 변수는 구조 방법에 한 번만 설정하면 후속 다운로드할 때 여러 번 복용할 수 있습니다.
캐시 기능을 지원하는 코드 구현:
class Downloader:
    def __init__(self,delay=5,user_agent='wswp',proxies=None,num_retries=1,cache=None):
        self.throttle=Throttle(delay)
        self.user_agent=user_agent
        self.proxies=proxies
        self.num_retries=num_retries
        self.cache=cache

    def __call__(self,url):
        result=None
        if self.cache:
            try:
                result=self.cache[url]
            except KeyError:
                #url      cache 
                pass
            else:
                if self.num_retries>0 and 500<=result['code']<600:
                    #server error so ignore result from cache and re-download
                    result=None
        if result is None:
            #   cache     ,        
            self.throttle.wait(url)
            proxy=random.choice(self.proxies) if self.proxies
                else None
            headers={'User-agent':self.user_agent}
            result=self.download(url,headers,proxy,self.num_retries)
            if self.cache:
                # cache     
                self.cache[url]=result
            return result['html']
    def download(self,url,headers,proxy,num_retries,data=None):
        ...
    return{'html':html,'code':code}

앞의 코드에서 Download 클래스는 비교적 재미있는 부분이 있는데 그것이 바로 이다call__ 특수한 방법으로, 이 방법에서 우리는 다운로드 전에 캐시를 검사하는 기능을 실현하였다.이 방법은 우선 캐시가 정의되었는지 확인합니다.정의된 경우 이전에 이 URL이 캐시되었는지 확인합니다.이 URL이 이미 캐시되어 있으면, 이전 다운로드에서 서버 오류가 발생했는지 확인하십시오.마지막으로 서버 오류가 발생하지 않았다면 캐시 결과가 사용할 수 있음을 나타냅니다.위의 모든 검사에서 장애가 발생하면 정상적으로 URL을 다운로드한 다음 결과를 캐시에 추가해야 합니다.
여기의download 방법은 이전의download 함수와 기본적으로 같습니다. 다운로드한 HTML을 되돌릴 때 캐시에 오류 코드를 저장하기 위해 HTTP 상태 코드를 추가로 되돌려줍니다.물론, 만약 당신이 간단한 다운로드 기능만 필요하고, 제한 속도나 캐시가 필요하지 않다면, 이 방법을 직접 호출할 수 있다. 그러면 를 통과하지 못할 것이다call__ 방법이 호출되었다.
캐치 클래스에 대해 우리는result=cache[url]을 호출하여cache에서 데이터를 불러오고cache[url]=result를 통해cache에 결과를 저장할 수 있다.Python 내장 사전 데이터 형식의 사용 방식이기 때문에 여러분은 이런 편리한 인터페이스 쓰기에 익숙해야 합니다.이 인터페이스를 지원하기 위해서, 우리 캐치 클래스는 정의가 필요합니다.getitem__() 및setitem__() 이 두 가지 특수한 방법.
또한 캐시 기능을 지원하기 위해 파충류를 연결하는 코드도cache 파라미터를 추가하고 제한 속도를 제거하며download 함수를 새로운 클래스로 바꾸는 등 미세한 조정이 필요합니다. 아래 코드와 같습니다.
def link_crawler(...,cache=None):
    crawl_queue=[seed_url]
    seen={seed_url:0}
    num_urls=0
    rp=get_robots(seed_url)
    D=Downloader(delay=delay,user_agent=user_agent,proxies=proxies,num_retires=num_retries,cache=cache)
    while crawl_queue:
        url=crawl_queue.pop()
        depth=seen[url]
        #  url  robot.txt  
        if rp.can_fetch(user_agent,url):
            html=D(url)
            links=[]

지금까지 이 인터넷 파충류의 기본 구조는 이미 준비가 되었으니 다음은 실제 캐시를 구축하기 시작할 것이다.

좋은 웹페이지 즐겨찾기