Варианты кеширования в Python или ускорение урлопена - PullRequest
3 голосов
/ 12 августа 2010

Привет всем, у меня есть сайт, который ищет информацию для конечного пользователя, написан на Python и требует нескольких команд urlopen. В результате загрузка страницы занимает немного времени. Мне было интересно, есть ли способ сделать это быстрее? Есть ли простой способ Python для кеширования или способ сделать скрипты urlopen интересными?

Урлопы получают доступ к API Amazon для получения цен, поэтому сайт должен быть немного в курсе. Единственный вариант, о котором я могу подумать, - это создать скрипт для создания базы данных MySQL и запускать его время от времени, но это было бы неприятно.

Спасибо!

Ответы [ 5 ]

3 голосов
/ 12 августа 2010

httplib2 понимает кэширование http-запросов, несколько отвлекает беспорядок в urllib / urllib2 и имеет другие плюсы, например поддержку gzip.

http://code.google.com/p/httplib2/

Но помимо использования этого для получения данных, если набор данных не очень большой, я бы также реализовал некоторую функцию кэширования / запоминания. Пример: http://wiki.python.org/moin/PythonDecoratorLibrary#Memoize

Не было бы слишком сложно изменить этот декоратор, чтобы учесть истечение времени, например кэшировать результат только на 15 минут.

Если результаты больше, вам нужно начать поиск в memcached / redis.

1 голос
/ 12 августа 2010

Есть несколько вещей, которые вы можете сделать.

  • Механизм кэширования urllib временно отключен , но вы можете легко свернуть свой собственный, сохранив данные, полученные из Amazon, в памяти или где-нибудь в файле.

  • Как и выше, у вас может быть отдельный скрипт, который обновляет цены очень часто, и cron он будет запускаться каждые полчаса (скажем). Они могут храниться где угодно.

  • Вы можете запустить выборку URL в новом потоке / процессе, так как он все равно в основном ожидает.

0 голосов
/ 12 августа 2010

Если вам нужно захватить несколько сайтов одновременно, вы можете попробовать whit asyncore http://docs.python.org/library/asyncore.html

Таким образом, вы можете легко загрузить несколько страниц одновременно.

0 голосов
/ 12 августа 2010

Вы можете использовать memcached. Он предназначен для этого, и таким образом вы можете легко разделить кеш с различными программами / скриптами. И это действительно легко использовать из Python, проверьте:

Хорошие примеры использования python-memcache (memcached) в Python?

Затем вы обновляете memcached, когда ключа нет, а также из некоторого скрипта cron, и вы готовы к работе.

Другой, более простой вариант - приготовить собственный кеш, возможно, для хранения данных в словаре и / или с помощью cPickle для сериализации их на диск (если вы хотите, чтобы данные распределялись между разными прогонами).

0 голосов
/ 12 августа 2010

Как часто меняются цены? Если они довольно постоянны (скажем, раз в день или каждый час или около того), просто напишите сценарий cron (или эквивалентный), который извлекает значения и сохраняет его в базе данных или текстовом файле, или что вам нужно. .

Я не знаю, можете ли вы проверить данные меток времени из API Amazon - если они сообщают о подобных вещах.

...