Включается FHTTPCACHE_ENABLED, два режима (политики) кэширования, три вида хранилищ, возможность управлять кэшированием для (схем) типов файлов, протоколов ответов серверов, задавать время перезагрузки кэша ...
Включить кэшированеи очень просто¶
- ДОбавим в файл settings.py строчку (по умолчанию она = False, запомнить FAlse, True - начинаются большой буквы)
FHTTPCACHE_ENABLED = True
- После обычного запуска паука в папке проекта появится папка .scrapy, в ней папка httpcache, а в ней инетесный файл njit.db, в котором сначала какой-то "непонятный" заголовок с кркозябами, а под ним.... одна за другой все пять HTML страничек, которые скачал паук.
C:\Users\kiss\Documents\GitHub_2\Python-Web-Crawler-master\Python-Web-Crawler-master\example>tree /F
Структура папок
Серийный номер тома: 00000079 6017:2A0B
C:.
│ ''.csv
│ 13nov.csv
│ 14nov.csv
│ courses.csv
│ scrapy.cfg
│
├───.scrapy
│ └───httpcache
│ njit.db
│
└───example
│ feedexport.py
│ feedexport.pyc
│ items.py
│ items.pyc
│ items.py~
│ pipelines.py
│ settings.py
│ settings.pyc
│ settings.py~
│ __init__.py
│ __init__.pyc
│
└───spiders
test.py
test.pyc
test.py~
__init__.py
__init__.pyc
Настройки кэширования (По умолчанию кэширование установлено, но не включено)¶
- Последняя строчка в файле установок по умолчанию DOWNLOADER_MIDDLEWARES_BASE
{
...
'scrapy.contrib.downloadermiddleware.stats.DownloaderStats': 850,
'scrapy.contrib.downloadermiddleware.httpcache.HttpCacheMiddleware': 900,
}
При желании можно изменить эти настройки, но пока не вижу необходимости, на первых порах хватает штатных настроек кэширования
2. О настройках кэширования можно прочитать в разделе downloaderMiddleware HttpCacheMiddleware¶
В документации сначала упоминается о двух политиках, проверяем, какая у моего дистрибутива, ...совпадает с тем, что должно быть по умолчанию:
settings['HTTPCACHE_POLICY']
'scrapy.contrib.httpcache.DummyPolicy'
# Это именно то, что мне поначалу понадобится для отладки
# Еще может быть scrapy.contrib.httpcache.RFC2616Policy
Еще может быть три варианта storage, у меня оказывается не то, что должно быть по умолчанию:
settings['HTTPCACHE_STORAGE']
'scrapy.contrib.httpcache.DbmCacheStorage'
# scrapy.contrib.httpcache.FilesystemCacheStorage
# scrapy.contrib.httpcache.DbmCacheStorage
# scrapy.contrib.httpcache.LeveldbCacheStorage
Отметим здесь, что можно кэшировать не только тело ответа (что мне сейчас нужно) но и заголовки и не только ответов , но и запросов. На первый взгляд, в документации все понятно, так что пока запомним только, что эти возможности есть...
Отметим, что де факто при кэшировании создаются какие-то (новые для меня) базы данных. Эта тема интересна, но времени нет, потому здесь только ссылки, которые я нашел на странице документации (не забыть прочитать), вот например:
dbm From Wikipedia, the free encyclopedia
The dbm library was a simple database engine, originally written by Ken Thompson and released by AT&T in 1979. The name is a three letter acronym for DataBase Manager, and can also refer to the family of database engines with APIs and features derived from the original dbm
LevelDB is a fast key-value storage library written at Google that provides an ordered mapping from string keys to string values
В документации есть еще... с десяток настроек¶
Можно не кэшировать определенные ответы (HTTPCACHE_IGNORE_HTTP_CODES)по кодам ответов и по типам файлов(HTTPCACHE_IGNORE_SCHEMES). По умолчанию не кэшируются текстовые файлы!!!
Не понял пока смысл HTTPCACHE_IGNORE_MISSING (If enabled, requests not found in the cache will be ignored instead of downloade)
Параметр слега HTTPCACHE_DIR устарел, в старых постах на stackoverflow я не обратил на это внимание и потерял немного времени на поиски... паки по умолчанию для хранения кэша...
Параметр HTTPCACHE_EXPIRATION_SECS задает продолжительность жизни кэша, все почти, как в браузере...
Есть и специфичные настройки для конкретнго модуля HTTPCACHE_DBM_MODULE ='anydbm'
Проверяем другой вариант кэширования с FilesystemCacheStorage¶
HTTPCACHE_STORAGE = 'scrapy.contrib.httpcache.FilesystemCacheStorage'
Чтобы поменять тип storage для кэша я добавил в settings.py строчку выше. Потом запустил паука, он записал новый файл, а в папке кэша появился целый склад новых файлов.
C:... ... \Python-Web-Crawler-master\example>scrapy crawl njit -o 16nov.csv -t csv
C:... ... \Python-Web-Crawler-master\example>tree .scrapy /F
Структура папок
Серийный номер тома: 00000078 6017:2A0B
C:\USERS\KISS\DOCUMENTS\GITHUB_2\PYTHON-WEB-CRAWLER-MASTER\PYTHON-WEB-CRAWLER-MASTER\EXAMPLE\.SCRAPY
└───httpcache
│ njit.db # это то, что было, а ниже то, что добавилось
│
└───njit
├───29
│ └───298501a0fb940bb9fcaa101614383e3b63113b09
│ meta
│ pickled_meta
│ request_body
│ request_headers
│ response_body
│ response_headers
│
├───3d
│ └───3d87297235cd5896835fcbbe7c8ffb525bf24d48
│ meta
│ pickled_meta
│ request_body
│ request_headers
│ response_body
│ response_headers
│
├───47
│ └───47a1240eef7068db98258e5d5c0b74a9645e0e6a
│ meta
│ pickled_meta
│ request_body
│ request_headers
│ response_body
│ response_headers
│
├───76
│ └───76bdd6370f55f218c54089c77609b88fe86ee4bd
│ meta
│ pickled_meta
│ request_body
│ request_headers
│ response_body
│ response_headers
│
├───8a
│ └───8a75706a45f20ae96df1fb61727d056e6c0118df
│ meta
│ pickled_meta
│ request_body
│ request_headers
│ response_body
│ response_headers
│
├───b4
│ └───b484dcaf49aa2f58fa3987873b4821f6cdcecb04
│ meta
│ pickled_meta
│ request_body
│ request_headers
│ response_body
│ response_headers
│
├───de
│ └───deeba67215df3d021fe26bd2508051525f41d275
│ meta
│ pickled_meta
│ request_body
│ request_headers
│ response_body
│ response_headers
│
└───ec
└───ec2f1beba707a9fb8f48b95558760062d437bbd0
meta
pickled_meta
request_body
request_headers
response_body
response_headers
C:\Users\kiss\Documents\GitHub_2\Python-Web-Crawler-master\Python-Web-Crawler-master\example>
Вот, например, содержание pickled_meta из каталога 3d
Ђ }q (U urlq U4http://catalog.njit.edu/courses/biol.php#gradcoursesq U statusq KИU methodq U GETq U timestampq GAХ -Д%гTU
response_urlq U(http://catalog.njit.edu/courses/biol.phpq u.
Теперь посмотрим, чем отличается вывод из консоли при загрузке из кэша:
2014-11-16 18:56:42+0300 [njit] INFO: Dumping Scrapy stats:
{'downloader/request_bytes': 1715,
'downloader/request_count': 8,
'downloader/request_method_count/GET': 8,
'downloader/response_bytes': 426500,
'downloader/response_count': 8,
'downloader/response_status_count/200': 8,
'finish_reason': 'finished',
'finish_time': datetime.datetime(2014, 11, 16, 15, 56, 42, 586000),
'httpcache/hit': 8, # Похоже, что вот здесь сообщается о загрузке из кэша
'item_scraped_count': 222,
'log_count/DEBUG': 236,
'log_count/ERROR': 7,
'log_count/INFO': 4,
'response_received_count': 8,
'scheduler/dequeued': 8,
'scheduler/dequeued/memory': 8,
'scheduler/enqueued': 8,
'scheduler/enqueued/memory': 8,
'spider_exceptions/IndexError': 7,
'start_time': datetime.datetime(2014, 11, 16, 15, 56, 31, 723000)}
2014-11-16 18:56:42+0300 [njit] INFO: Spider closed (finished)
А ниже сообщения при первой загрузке:
2014-11-16 17:39:22+0300 [njit] INFO: Dumping Scrapy stats:
{'downloader/request_bytes': 1715,
'downloader/request_count': 8,
'downloader/request_method_count/GET': 8,
'downloader/response_bytes': 426500,
'downloader/response_count': 8,
'downloader/response_status_count/200': 8,
'finish_reason': 'finished',
'finish_time': datetime.datetime(2014, 11, 16, 14, 39, 22, 157000),
'httpcache/firsthand': 8, # А здесь целых три сообщения !!!
'httpcache/miss': 8,
'httpcache/store': 8,
'item_scraped_count': 222,
'log_count/DEBUG': 236,
'log_count/ERROR': 7,
'log_count/INFO': 4,
'response_received_count': 8,
'scheduler/dequeued': 8,
'scheduler/dequeued/memory': 8,
'scheduler/enqueued': 8,
'scheduler/enqueued/memory': 8,
'spider_exceptions/IndexError': 7,
'start_time': datetime.datetime(2014, 11, 16, 14, 39, 9, 326000)}
2014-11-16 17:39:22+0300 [njit] INFO: Spider closed (finished)
Посты чуть ниже также могут вас заинтересовать
Комментариев нет:
Отправить комментарий