Решение данной задачи будет состоять из двух этапов:
Для первого этапа нужно составить простой пресет на основе SE::Google::Modern. Чтобы искать только Гугл документы, нужно использовать поисковый оператор:
- поиск ссылок на документы
- скачивание
На данном этапе нужно предусмотреть фильтрацию полученных результатов от нежелательных ссылок и формирование "на лету" прямых ссылок на скачивание. В Google документах для разных форматов файлов ссылки на скачивание имеют разный вид, поэтому в данном примере будут рассмотрены только самые популярные форматы.Код:site:"docs.google.com"
Все это можно сделать в Общем формате результата с помощью шаблонизатора:
Также лучше включить уникализацию по строке, чтобы удалять дубли. Количество страниц и результатов на страницу лучше указать максимум, чтобы парсить как можно больше результатов. При необходимости можно задать любые другие параметры, например, увеличить количество попыток или подключить сервис разгадывания рекаптч.Код:[% FOREACH p1.serp; IF link.match('/spreadsheets/d/'); url = link.match('(.+?/spreadsheets/d/[^/?]+)').0; IF url; url _ "/export?format=xlsx\n"; END; END; IF link.match('/presentation/d/'); url = link.match('(.+?/presentation/d/[^/?]+)').0; IF url; url _ "/export/pptx\n"; END; END; IF link.match('/document/d/'); url = link.match('/document/d/([^/?]+)').0; IF url; 'https://docs.google.com/document/export?format=docx&id=' _ url _ "&includes_info_params=true\n"; END; END; IF link.match('/drawings/d/'); url = link.match('(.+?/drawings/d/[^/?]+)').0; IF url; url _ "/export/pdf\n"; END; END; END %]
В качестве запросов нужно использовать ключевые слова, соответствующие тематике искомых документов. Либо можно воспользоваться макросами подстановок для генерации буквенных комбинаций и парсинга всех документов подряд.
В итоге получается примерно такой пресет:
Результатом его работы будет список ссылок на скачивание файлов.
В конце статьи опубликована ссылка на готовые пресеты.
Второй этап лучше реализовать JS парсером, т.к. там есть возможность сохранять данные прямо на диск, минуя память.
Также нужно дополнительно получать имена файлов и их расширения. Обычно имя файла отдается в заголовках ответа и данный случай не исключение: в заголовке content-disposition содержится имя файла вместе с расширением. Поэтому перед скачиванием нужно сделать дополнительный запрос, получить имя файла и уже используя его, скачать файл.
Т.к. имена файлов могут повторяться, то лучше предусмотреть механизм проверки существования и добавления к имени, например, каких-то цифр, чтобы не перезаписывать файлы.
В итоге получается такой код:
Результатом работы данного парсера будут загруженные файлы и лог, в который будет выводиться ссылка, имя файла и статус скачивания (1 - успех/0 - неудача).Код:// Получение заголовков для определения имени файла let resp = yield this.request('GET', set.query, {}, { onlyheaders: 1 }); if(resp.success) { // Извлечение имени файла регулярным выражением и замена запрещенных символов try { results.name = decodeURIComponent(resp.headers['content-disposition'].match(/filename\s*=\s*"([^"]+)/)[1]).replace(/[^\da-zа-яєіїъ_.\- ()\[\]]/gi, '_'); } catch(e) { this.logger.put('Error, filename not found'); results.success = 0; return results; } // Проверка существования файла и генерация нового имени let n = 1; while(fs.existsSync(`results/GoogleDocs/${results.name}`)) { results.name = results.name.match(/^(.+?)(?:\(\d+\))?\.[^.]+$/)[1] + '(' + n++ +')' + results.name.match(/(\.[^.]+)$/)[1]; } //Непосредственно скачивание файла resp = yield this.request('GET', set.query, {}, { save_to_file: `results/GoogleDocs/${results.name}` }); } results.success = resp.success; return results;
Готовые пресеты доступны в Каталоге: https://a-parser.com/resources/345/
-
Вступайте в наш Telegram чат: https://t.me/a_parser Нас уже 2600+ и мы растем!Скрыть объявление
Поиск и скачивание Google документов
Описание способа поиска и массового скачивания Google документов
Метки: