2013-07-24 4 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, который хранится в локальной системе, этот метод работает быстро. Есть ли способ, который мы можем получить html-файл этой веб-страницы http://www.w3schools.com/html/ из кэша после первого раза? стр. Я не хочу постоянно сохранять этот html-файл в своей локальной системе, потому что в этом случае я могу пропустить обновления/изменения в этом html-файле.

+0

Если вы не сохраняете файл на диске, то где будет кеш? Проблема в том, что вы вызываете эту функцию неоднократно, хотя ничего не изменилось большую часть времени? – Taymon

+0

Хорошо, я сожалею, что поставил вопрос неправильно. можете ли вы рассказать мне, как я могу использовать файл с обложкой вместо использования http://www.w3schools.com/html/ внутри lxml.html.parse() – user2460869

ответ

1

Похоже, что вы хотите кешировать страницу, но вы также хотите проверить, что с момента последней загрузки ничего не изменилось.

If-Modified-Since HTTP-заголовок - ваш друг в этом начинании. При создании запроса HTTP GET вы можете указать это поле заголовка с момента последней загрузки страницы. Если с этого времени страница не изменилась на сервере, сервер вернет код состояния 304 Not Modified и не отправит содержимое страницы, что избавит вас от необходимости загружать ее снова.

Вот как вы могли бы идти об этом в Python 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_time и cached_html, вероятно, хранятся на диске.

+0

Хороший ответ. Но обратите внимание, что 'last_access_time', когда оно отправляется как значение' If-modified-since', должно быть в формате RFC2616. Например, «Сб, 29 октября 1994 года 19:43:31 GMT». http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.25 –

0

Вы можете хранить htmls вместе с меткой времени и загружать только html, если html слишком стар.

Смежные вопросы