1. Вступайте в наш Telegram чат: https://t.me/a_parser Нас уже 800+ и мы растем!
    Скрыть объявление

Поиск и скачивание Google документов

Описание способа поиска и массового скачивания Google документов

  1. Support
    Решение данной задачи будет состоять из двух этапов:
    • поиск ссылок на документы
    • скачивание
    Для первого этапа нужно составить простой пресет на основе SE::Google::Modern SE::Google::Modern. Чтобы искать только Гугл документы, нужно использовать поисковый оператор:
    Код:
    site:"docs.google.com"
    На данном этапе нужно предусмотреть фильтрацию полученных результатов от нежелательных ссылок и формирование "на лету" прямых ссылок на скачивание. В Google документах для разных форматов файлов ссылки на скачивание имеют разный вид, поэтому в данном примере будут рассмотрены только самые популярные форматы.
    Все это можно сделать в Общем формате результата с помощью шаблонизатора:
    Код:
    [% 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 %]
    Также лучше включить уникализацию по строке, чтобы удалять дубли. Количество страниц и результатов на страницу лучше указать максимум, чтобы парсить как можно больше результатов. При необходимости можно задать любые другие параметры, например, увеличить количество попыток или подключить сервис разгадывания рекаптч.
    В качестве запросов нужно использовать ключевые слова, соответствующие тематике искомых документов. Либо можно воспользоваться макросами подстановок для генерации буквенных комбинаций и парсинга всех документов подряд.
    В итоге получается примерно такой пресет:
    [​IMG]
    Результатом его работы будет список ссылок на скачивание файлов.
    В конце статьи опубликована ссылка на готовые пресеты.

    Второй этап лучше реализовать JS парсером, т.к. там есть возможность сохранять данные прямо на диск, минуя память.
    Также нужно дополнительно получать имена файлов и их расширения. Обычно имя файла отдается в заголовках ответа и данный случай не исключение: в заголовке content-disposition содержится имя файла вместе с расширением. Поэтому перед скачиванием нужно сделать дополнительный запрос, получить имя файла и уже используя его, скачать файл.
    Т.к. имена файлов могут повторяться, то лучше предусмотреть механизм проверки существования и добавления к имени, например, каких-то цифр, чтобы не перезаписывать файлы.
    В итоге получается такой код:
    Код:
            // Получение заголовков для определения имени файла
            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;
    Результатом работы данного парсера будут загруженные файлы и лог, в который будет выводиться ссылка, имя файла и статус скачивания (1 - успех/0 - неудача).
    [​IMG]

    Готовые пресеты доступны в Каталоге: https://a-parser.com/resources/345/