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

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

Решение данной задачи будет состоять из двух этапов:
  • поиск ссылок на документы
  • скачивание
Для первого этапа нужно составить простой пресет на основе 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 %]
Также лучше включить уникализацию по строке, чтобы удалять дубли. Количество страниц и результатов на страницу лучше указать максимум, чтобы парсить как можно больше результатов. При необходимости можно задать любые другие параметры, например, увеличить количество попыток или подключить сервис разгадывания рекаптч.
В качестве запросов нужно использовать ключевые слова, соответствующие тематике искомых документов. Либо можно воспользоваться макросами подстановок для генерации буквенных комбинаций и парсинга всех документов подряд.
В итоге получается примерно такой пресет:
j8v5t_190720165716.png

Результатом его работы будет список ссылок на скачивание файлов.
В конце статьи опубликована ссылка на готовые пресеты.

Второй этап лучше реализовать 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 - неудача).

https://docs.google.com/document/export?format=docx&id=1n3OoR6syeFosLWAkdnOs8pUyrvCwvlIrhJachkZKwWQ&includes_info_params=true -> President lincoln cb user manual(1).docx: 1
https://docs.google.com/document/export?format=docx&id=11MsD3gYsa2cG3l_LDXZjROIMK5dXboQ4S-cvbslaVbU&includes_info_params=true -> Nddn w56 manual(1).docx: 1
https://docs.google.com/document/export?format=docx&id=10hMn5UNpv_ln_A9l4aOmy7d_U3wntvKSXKJFxLpxnxw&includes_info_params=true -> ORTOGRAFIA_ QU-CU-CQ-QQ(1).docx: 1
https://docs.google.com/document/export?format=docx&id=1wncqDPEO_gXzkWgntu3bUlQcU7CCdUBoraRHOCwWRW4&includes_info_params=true -> Xin jin ping mei download(1).docx: 1
https://docs.google.com/document/export?format=docx&id=1mjXcbLHXQmpBAIHiDH1vSWIgynhDmsBd5luBhmdVWR4&includes_info_params=true -> conflict-war-and-peace-an-introduction-to-scientific-research.doc(1).docx: 1
https://docs.google.com/document/export?format=docx&id=1AG4COPmPrjR6fZ35LZUO-jTdLrln-uoECQOKumc9ODU&includes_info_params=true -> Jbl 86120 manual(1).docx: 1
https://docs.google.com/document/export?format=docx&id=1AyeS2du6wp_Pw8Grg8WovbE_A_HV4EUMqdiqeq1KUZ8&includes_info_params=true -> Buildbucket Postmortem_ 6_ builds lost on 2015-04-22(1).docx: 1
https://docs.google.com/document/export?format=docx&id=11TVE_Ok-Ei-mPxd9vijN9xDnikSJmjj7AvRJ6yTjMQ8&includes_info_params=true -> Panasonic cq-rx400u user manual(2).docx: 1
https://docs.google.com/document/export?format=docx&id=1HXrVnDH-KAdP4PtX7-j8AJfuZ0JJcaGd213k1GVQ2eA&includes_info_params=true -> dump-bake-dinners.doc(2).docx: 1
https://docs.google.com/document/export?format=docx&id=1wBneFnJk5gU80oyLovbino-QG3QI-0k3SvwC7pYajTA&includes_info_params=true -> Panasonic cq-vd6503u manual download(1).docx: 1
https://docs.google.com/document/export?format=docx&id=1hcqNvScRfrX87WGRVN-rlBTG-WyJLtYtYdr2tOuvL70&includes_info_params=true -> expand-your-borders-discover-ten-cultural-clusters-cq-insight-series-volume-1.doc(1).docx: 1
https://docs.google.com/document/export?format=docx&id=1lBmIbh5wJagw6GAAClx1tzRRLa9riYbcI_nDxajNCZQ&includes_info_params=true -> Panasonic cq-vd7001u manual(1).docx: 1
https://docs.google.com/spreadsheets/d/1pSncZiUP88-pWNrT9eprAjkbdKWY5QRbf4VLiadN33M/export?format=xlsx -> CQ Town Speech Bubble(1).xlsx: 1
https://docs.google.com/document/export?format=docx&id=1h8q-7SQMEQsQp8wwQeG1AXnPutUB9nK10euTkMzUR88&includes_info_params=true -> the-five-disciplines-of-intelligence-collection.doc(3).docx: 1
https://docs.google.com/document/export?format=docx&id=1B9JHF2MK1xevSFmAJqeXQdzWBWNstV038TlmnqqPl0A&includes_info_params=true -> Crystal 4280 pci sound driver windows 7(1).docx: 1
https://docs.google.com/document/export?format=docx&id=1EtT0pjPujVvhOVGbiavvoYbOor5Jfpxb4p2mYDKb3K8&includes_info_params=true -> Manipulating the Adobe WEM_CQ JCR(1).docx: 1
https://docs.google.com/document/export?format=docx&id=1FbLt18V2IOWJyZ9sAMw48rh4OTHIDL0SQpVhUnAZQ5Y&includes_info_params=true -> Panasonic cq c7103u manual(1).docx: 1
https://docs.google.com/document/export?format=docx&id=1Y90BNCJ9co_w7BECxzbEYjXLJD36roifiQeTHQtfIZA&includes_info_params=true -> Panasonic car navigation system manuals(1).docx: 1

a4tw6_190720171508.png


Готовые пресеты доступны в Каталоге: https://a-parser.com/resources/345/
Автор
Support
Просмотры
26
Первый выпуск
Обновление

Рейтинги

0,00 звёзд Оценок: 0

Ещё ресурсы от Support

Назад
Верх