Решение данной задачи будет состоять из двух этапов:
SE::Google::Modern. Чтобы искать только Гугл документы, нужно использовать поисковый оператор:
На данном этапе нужно предусмотреть фильтрацию полученных результатов от нежелательных ссылок и формирование "на лету" прямых ссылок на скачивание. В Google документах для разных форматов файлов ссылки на скачивание имеют разный вид, поэтому в данном примере будут рассмотрены только самые популярные форматы.
Все это можно сделать в Общем формате результата с помощью шаблонизатора:
Также лучше включить уникализацию по строке, чтобы удалять дубли. Количество страниц и результатов на страницу лучше указать максимум, чтобы парсить как можно больше результатов. При необходимости можно задать любые другие параметры, например, увеличить количество попыток или подключить сервис разгадывания рекаптч.
В качестве запросов нужно использовать ключевые слова, соответствующие тематике искомых документов. Либо можно воспользоваться макросами подстановок для генерации буквенных комбинаций и парсинга всех документов подряд.
В итоге получается примерно такой пресет:
Результатом его работы будет список ссылок на скачивание файлов.
В конце статьи опубликована ссылка на готовые пресеты.
Второй этап лучше реализовать JS парсером, т.к. там есть возможность сохранять данные прямо на диск, минуя память.
Также нужно дополнительно получать имена файлов и их расширения. Обычно имя файла отдается в заголовках ответа и данный случай не исключение: в заголовке content-disposition содержится имя файла вместе с расширением. Поэтому перед скачиванием нужно сделать дополнительный запрос, получить имя файла и уже используя его, скачать файл.
Т.к. имена файлов могут повторяться, то лучше предусмотреть механизм проверки существования и добавления к имени, например, каких-то цифр, чтобы не перезаписывать файлы.
В итоге получается такой код:
Результатом работы данного парсера будут загруженные файлы и лог, в который будет выводиться ссылка, имя файла и статус скачивания (1 - успех/0 - неудача).
Готовые пресеты доступны в Каталоге: https://a-parser.com/resources/345/
- поиск ссылок на документы
- скачивание
SE::Google::Modern. Чтобы искать только Гугл документы, нужно использовать поисковый оператор:
Код:
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 содержится имя файла вместе с расширением. Поэтому перед скачиванием нужно сделать дополнительный запрос, получить имя файла и уже используя его, скачать файл.
Т.к. имена файлов могут повторяться, то лучше предусмотреть механизм проверки существования и добавления к имени, например, каких-то цифр, чтобы не перезаписывать файлы.
В итоге получается такой код:
Код:
// Получение заголовков для определения имени файла
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/