2013-07-24 3 views
0

다음 작업을 수행하는 Python 코드를 작성했습니다. 1) 인터넷에서 HTML 파일을 가져옵니다. 2) URL을 추출합니다. 3) 이러한 URL을 검색 키와 비교하고 사용자가 열려고하는 올바른 웹 페이지를 엽니 다. 나는 다음과 같은 코드를 사용하고 :캐시 메모리에서 html 파일에 액세스

def open_page(name): 

    try: 
     links = lxml.html.parse('http://www.w3schools.com/html/').xpath("//a/@href") 
     for url in links: 
      if re.search(name, url): 
       self.get_webpage.open('http://www.w3schools.com/html/'+url) 
       break 
    except IndexError as e: 
     pass` 

을 나는이 방법을 아주 느린 웹 페이지를 여는 과정을하고 내 모듈에서 여러 번 호출해야합니다. 이 메서드의 각 행의 실행 시간을 확인하려고 시도하고 lxml.html.parse()가 대부분 시간을 소비하고 있음을 알게되었습니다. 또한 로컬 시스템에 저장된 html 파일을 사용하려고하면이 방법이 빠르게 작동합니다. 우리가 처음으로 캐시에서이 웹 페이지 http://www.w3schools.com/html/의 html 파일을 가져올 수있는 방법이 있습니까? p.s. 이 로컬 시스템에이 html 파일을 영구히 저장하고 싶지 않습니다.이 경우 html 파일의 업데이트/변경 사항을 놓칠 수 있기 때문입니다.

+0

디스크에 파일을 저장하지 않을 경우 캐시는 어디에 있습니까? 대부분의 시간을 변경하지 않아도이 함수를 반복적으로 호출하는 문제는 무엇입니까? – Taymon

+0

오케이 죄송합니다. 질문을 잘못 입력했습니다. 당신은 lxml.html.parse() 내에서 http://www.w3schools.com/html/을 사용하는 대신 현금화 된 파일을 어떻게 사용할 수 있는지 말해 줄 수 있습니까? – user2460869

답변

1

페이지를 캐시하려는 것처럼 들리지만 마지막으로 다운로드 한 이후로 변경된 내용이 없는지 확인하고 싶습니다.

If-Modified-Since HTTP 헤더는이 작업에서 여러분의 친구입니다. HTTP GET 요청을 할 때 헤더 필드에 마지막으로 페이지를 다운로드 한 시간을 제공 할 수 있습니다. 이 시간 이후에 서버에서 페이지가 변경되지 않은 경우 서버는 304 Not Modified 상태 코드를 반환하고 페이지 내용을 보내지 않으므로 다시 다운로드하는 번거 로움을 덜어줍니다. 여기

는 파이썬 2에서이 일에 대해 갈 수있는 방법은 다음과 같습니다

import contextlib 
import datetime 
import urllib2 

with contextlib.closing(urllib2.urlopen(urllib2.Request(
     "http://www.w3schools.com/html/", 
     headers={"If-Modified-Since": last_access_time}))) as u: 
    if u.getcode() != 304: 
     cached_html = lxml.html.parse(u) 
     last_access_time = datetime.datetime.now() 
html = cached_html 

last_access_timecached_html이 가능성이 디스크에 저장됩니다.

+0

좋은 대답입니다. 그러나'last_access_time'은'If-modified-since'의 값으로 전송 될 때 RFC2616 형식이어야합니다. 예 : '토요일, 1994 년 10 월 29 일 19시 43 분 31 초 GMT' http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.25 –

0

html을 타임 스탬프와 함께 저장할 수 있으며 html이 너무 오래된 경우에만 html을 다운로드 할 수 있습니다.

관련 문제