plusplus
Ноя. 8, 2012 15:12:46
Захотел написать простой парсер видео, но столкнулся с проблемой. Первым делом то я скачиваю видео в память получается, а уже потом только пишу его на диск. А если видео 1гб, да всё это в не сколько потоков, то всё наверное вообще встанет. Подскажите как-нибудь по простому средствами grab это можно обойти?
odnochlen
Ноя. 8, 2012 15:29:24
Средствами grab, может быть, и никак. Writer function или имя файла туда вроде как не передать. Автор когда-то что-то говорил про “использовать для этого предназначенные средства”, т.е. похоже, такой функционал он не встроил, хотя pycurl сам по себе это умеет.
plusplus
Ноя. 8, 2012 18:51:13
odnochlen
хотя pycurl сам по себе это умеет.
Наши в общих словах как это делается, если не сложно. Там можно поставить опцию сразу в файл писать? Или как-то по-другому это делается?
lorien
Ноя. 8, 2012 19:44:09
lorien
Ноя. 8, 2012 19:46:13
Суть функциональности, при ключенной опции body_inmemory=False, содержимое сетевых ответов сохраняется в файл, путь к файлу доступен через опцию g.response.body_path - т.е. делайте с ним, что хотите.
Внимание: g.response.body (это теперь property) в случае сохранения ответа в файл не должен использоваться, при первом же обращении к нему, содержимое файла прочитается в память.
odnochlen
Ноя. 8, 2012 22:29:33
А как-то сделать, чтобы слишком большие файлы не грузились в память или не качались, можно?
Можно задать имя файла? Юникод поддерживается?
plusplus
Ноя. 9, 2012 09:42:22
odnochlen
А как-то сделать, чтобы слишком большие файлы не грузились в память или не качались, можно?
Я так понимаю, пока можно предварительно посылать head-запрос и в зависимости от этого выбирать уже качать или нет.
odnochlen
Ноя. 9, 2012 11:55:02
Ну хед какбы может изменить состояние, да и файл может отдаваться только черер post. Лучше были бы, скажем, настройки размера или коллбек после получения заголовков.
lorien
Ноя. 9, 2012 17:54:53
> А как-то сделать, чтобы слишком большие файлы не грузились в память или не качались, можно?
Да, есть опция body_maxsize - по достижении заданного количества полученных байт соединение прерывается.
> Я так понимаю, пока можно предварительно посылать head-запрос и в зависимости от этого выбирать уже качать или нет.
Да, можно head. А можно любой тип запроса с опцией nobody=True.
odnochlen
Ноя. 10, 2012 16:06:47
А оно прерывается по скачиванию или по заголовку?
Лучше бы была возможность получать евент полученя заголовков и разрывать соединение.
Есть возможность сохранять дату с сервера?