Поиск по блогу

воскресенье, 16 ноября 2014 г.

Попробовал Scrapy HTTPCACHE middleware. Понравилось

Включается FHTTPCACHE_ENABLED, два режима (политики) кэширования, три вида хранилищ, возможность управлять кэшированием для (схем) типов файлов, протоколов ответов серверов, задавать время перезагрузки кэша ...

Включить кэшированеи очень просто

  1. ДОбавим в файл settings.py строчку (по умолчанию она = False, запомнить FAlse, True - начинаются большой буквы)
In []:
FHTTPCACHE_ENABLED = True
  1. После обычного запуска паука в папке проекта появится папка .scrapy, в ней папка httpcache, а в ней инетесный файл njit.db, в котором сначала какой-то "непонятный" заголовок с кркозябами, а под ним.... одна за другой все пять HTML страничек, которые скачал паук.
In []:
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

Настройки кэширования (По умолчанию кэширование установлено, но не включено)

  1. Последняя строчка в файле установок по умолчанию DOWNLOADER_MIDDLEWARES_BASE
In []:
{
...
'scrapy.contrib.downloadermiddleware.stats.DownloaderStats': 850,
    'scrapy.contrib.downloadermiddleware.httpcache.HttpCacheMiddleware': 900,
}

При желании можно изменить эти настройки, но пока не вижу необходимости, на первых порах хватает штатных настроек кэширования

2. О настройках кэширования можно прочитать в разделе downloaderMiddleware HttpCacheMiddleware

В документации сначала упоминается о двух политиках, проверяем, какая у моего дистрибутива, ...совпадает с тем, что должно быть по умолчанию:

In []:
 settings['HTTPCACHE_POLICY']
 'scrapy.contrib.httpcache.DummyPolicy'
# Это именно то, что мне поначалу понадобится для отладки    
# Еще может быть scrapy.contrib.httpcache.RFC2616Policy

Еще может быть три варианта storage, у меня оказывается не то, что должно быть по умолчанию:

In []:
 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

In []:
HTTPCACHE_STORAGE = 'scrapy.contrib.httpcache.FilesystemCacheStorage'

Чтобы поменять тип storage для кэша я добавил в settings.py строчку выше. Потом запустил паука, он записал новый файл, а в папке кэша появился целый склад новых файлов.

In []:
C:... ... \Python-Web-Crawler-master\example>scrapy crawl njit -o 16nov.csv -t csv
In []:
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

In []:
Ђ }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.
In []:
Теперь посмотрим, чем отличается вывод из консоли при загрузке из кэша:
In []:
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)

А ниже сообщения при первой загрузке:

In []:
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)


Посты чуть ниже также могут вас заинтересовать

Комментариев нет:

Отправить комментарий