Google Scholar (Академия Google) – это специализированная платформа, разработанная компанией Google для точечного поиска научной информации: из рефератов, статей, диссертаций, статей и других публикаций. В первую очередь этот поиск интересен тем, что помогает быстро находить релевантную информацию по интересующим темам (в том числе с привязкой к конкретным библиотекам и ВУЗам), обеспечивает функционал цитирования публикаций, а также анализа их влияния через индекс Хирша (оригинальный инструмент для оценки значимости научных работ).
Специально для Google Академии разработано официальное расширение Scholar PDF Reader и Кнопка Google Академии (для поиска тематических научных статей при просмотре сайтов).
Что нужно знать перед тем, как парсить Google Scholar
У Академии Гугл есть своя система экспорта цитат, но работает она только для тех работ, которые пользователь добавляет в свою библиотеку. Экспорт возможен в форматах: CSV (таблицы, разделитель – запятая), Bib TeX (на основе LaTeX), EndNote (для одноимённой коммерческой системы) и RefMan (для проприетарной программы Reference Manager).
Для этого нужно: создать профиль, настроить в нём параметры поиска (язык и количество результатов на одну страницу), а затем просматривать поисковую выдачу и помечать отдельные работы как избранные. По факту это большой объём ручного труда.
API-интерфейса сервис не имеет, поэтому, если вы хотите автоматизировать процесс поиска и отбора нужных вам научных работ и публикаций, то придётся организовывать парсинг Google Scholar на базе своих скриптов.
Так как сайт Google Scholar открыт только для посещений штатными роботами Гугла (в файле robots.txt разрешено только чтение адресов с цитатами), все посторонние парсеры c большой вероятностью будут блокироваться показом капчи.
Обратите внимание: парсинг Google Scholar может быть достаточно простым, когда вы собираете только данные из выдачи (фактически это цитаты и ссылки на полные работы) или сложным, когда скрипт будет обходить найденные ссылки и копировать тексты полных работ. В последнем случае вам нужно будет предусмотреть логику обработки для каждого внешнего источника: Books Google, ResearchGate, Science.org, Cyberleninka, eLIBRARY и т.п.
Создание парсера Google Scholar на Python по шагам
В целях наглядности мы рассмотрим только процедуру организации парсинга Google Scholar по наиболее простому сценарию – то есть со сбором названий, авторов и цитат.
Пока что выдача Google Scholar формируется без динамических элементов, написанных на JavaScript, поэтому теоретически вполне можно обойтись одними только библиотеками для анализа HTML-структуры (лучшие Python-библиотеки для парсинга).
Тем не менее, из-за того, что прямые автоматические запросы (без использования браузеров) быстро приводят к показу капчи, мы приняли решение работать с Google Scholar через Headless-браузер. То есть, даже если вдруг Google переделает свой сервис на JavaScript, вы уже будете готовы к этому.
Шаг 1. Настройка Python
В основе нашего парсера – исполняемая среда Python.
Для того, чтобы вы смогли запустить свои скрипты парсинга Google Scholar, нужно сначала скачать и установить дистрибутив Python с официального сайта. На момент написания материала стабильная ветка языка – v3.13 (со временем версия может измениться, поэтому следите за актуальностью путей до исполняемых файлов).
Если вы работаете в таком Linux-дистрибутиве как Ubuntu, Debian или Linux Mint, то Python скорее всего уже установлен в системе. Если его нет, воспользуйтесь штатным менеджером пакетов для установки. Например, sudo apt install python3.13.
При установке в операционных системах Windows нужно добавить вызов основных команд и утилит Python в переменные среды (поставьте соответствующую галочку при инсталляции или добавьте параметры вручную).
Вот так будет выглядеть вызов менеджера пакетов pip:
Мы рекомендуем также работать с виртуальным окружением. Для этого используйте команду:
python -m venv scraper-google-scholar
Вместо «scraper-google-scholar» можете использовать своё название.
После исполнения команды будет создан специальный каталог и минимальный набор файлов для работы проекта. Папка окружения в Windows по умолчанию создаётся с таким треком C:\Users\ЛОГИН_ЮЗЕРА\scraper-google-scholar.
Для активации своей виртуальной среды введите команду:
Для CMD в Windows
scraper-google-scholar\Scripts\activate.bat
Для PowerShell (тоже Windows)
scraper-google-scholar\Scripts\activate.ps1
Для Linux-систем
source scraper-google-scholar/bin/activate
Если в Windows (начиная с 10 версии и выше) консоль выдаёт ошибку о недостающих правах для запуска скриптов, то используйте команду:
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
И затем заново запустите процесс активации окружения.
Готово, теперь можно переходить к следующим шагам.
Шаг 2. Установка необходимых пакетов и библиотек
Нам как минимум потребуется HTML-анализатор (для быстрого поиска тегов и извлечения их содержимого), а также библиотека для взаимодействия с экземпляром браузера и прослойка для организации массивов данных.
pip install selenium beautifulsoup4 pandas
Все связанные зависимости менеджер пакетов PIP должен подтянуть автоматически.
Если по какой-то причине вы не смогли добавить pip в переменные среды окружения Windows, то команда установки должна выглядеть так:
python -m pip install selenium beautifulsoup4 pandas
Подробная инструкция о парсинге с помощью библиотеки Beautiful Soup.
Библиотека Selenium в нашем списке – это web-драйвер для управления «безголовым» браузером. Существуют и другие реализации такого функционала. Пример: Playwright vs Puppeteer.
Pandas – это средство для удобной работы с массивами данных. Официальная документация.
Резидентные прокси
Лучшие прокси-серверы для доступа к ценным данным со всего мира.
Шаг 3. Понимание вёрстки страницы при парсинге Google Scholar
Сайты и web-сервисы периодически меняют вёрстку своих страниц, и Google – не исключение.
Ниже мы приведём те теги и параметры, которые были актуальны на момент написания статьи. Но нужно понимать, что в будущем они могут измениться и вам нужно будет самим открыть инструменты разработчика в вашем любимом браузере и найти актуальные теги и параметры запрашиваемых элементов.
Пример того, как это делали мы. Откройте страницу для поиска научных публикаций по запросу «machine learning» (машинное обучение). URL будет выглядеть так:
https://scholar.google.com/scholar?hl=ru&q=machine+learning
Можно заметить, что к основному домену Google Scholar добавляется указатель страницы поиска (/scholar) и ряд параметров: язык (hl=ru, то есть русский) и сам поисковый запрос (q=machine+learning). Параметры передаются после символа вопроса, а союзом «и» выступает амперсант (символ «&»). Вместо пробелов в запросе используется знак плюса («+»).
Теперь наведите указателем мыши на первом результате поиска и нажмите правой кнопкой мыши. В появившемся меню выберите пункт «Посмотреть код». Откроется интерфейс инструментов разработчиков и фокус в коде будет на выбранном элементе вёрстки.
Что нашли мы:
- Класс «gs_ri» соответствует контейнерам, внутри которых размещается вся информация о заголовках, цитатах, авторах и т.п. Это как корень, от которого мы будем отталкиваться.
- Класс «gs_rt» у заголовков H3 – это название научного труда.
- Класс «gs_a» соответствует указанию автора.
- Сниппет с цитатой можно найти на основе класса «gs_rs».
Шаг 4. Написание Python-скрипта для парсинга Google Scholar
Теперь у нас есть все необходимые данные и можно переходить к предметной реализации парсинга Google Scholar.
Перейдите в каталог своего виртуального окружения (C:\Users\ЛОГИН__ВАШЕГО_ПОЛЬЗОВАТЕЛЯ\scraper-google-scholar). Создайте простой текстовый файл и назовите его, например, scraper-google-scholar.txt.
Теперь смените расширение .txt на .py. Должно получиться scraper-google-scholar.py. Откройте файл в любом текстовом редакторе (мы использовали NotePad++).
Наполните его содержимым:
# Импортируем библиотеки
from bs4 import BeautifulSoup
import pandas as pd
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.options import Options
# Тут определяет работу web-драйвера Selenium
def init_selenium_driver():
# Формируем список опций запуска браузера, если опции не нужны, можете удалить их из списка
chrome_options = Options()
chrome_options.add_argument("--headless") # В скрытом режиме
chrome_options.add_argument("--no-sandbox") # Без песочницы
chrome_options.add_argument("--disable-dev-shm-usage") # Без раделения памяти
chrome_options.add_argument("--enable-features=Vulkan,VulkanFromANGLE,DefaultANGLEVulkan") # С аппаратным ускорением
driver = webdriver.Chrome(options=chrome_options) # Тут собираем все аргументы вместе
return driver
# Тут обрабатываем правила формирования URL-адреса, который передаётся браузеру
def fetch_search_results(driver, query):
# Стартовый адрес, в нашем случае доменное имя Google Scholar
base_url = "https://scholar.google.com/scholar"
# Тут передаём свой поисковой запрос
params = f"?q={query}"
# Передаём результирующий адрес браузеру
driver.get(base_url + params)
# Ждём пока страница загрузится, заметьте - без использования библиотеки asyncio
driver.implicitly_wait(10) # Ставим фиксированный таймер на 10 секунд (можно увеличить, если соединение медленное
# Восзвражаем результирующий HTML-контент страницы
return driver.page_source
# Тут определяем правила парсинга (выборки) содержимого, работает бибиотека BeautifulSoup
def parse_results(html):
soup = BeautifulSoup(html, 'html.parser')
# Массив данных с результатами
articles = []
for item in soup.select('.gs_ri'): #Тут определяем условия поиска общего контейнера с научной работой
title = item.select_one('.gs_rt').text # Тут ищем заголовок работы
authors = item.select_one('.gs_a').text # Тут ищем автора
snippet = item.select_one('.gs_rs').text # Тут парсим текст сниппета (цитата)
articles.append({'title': title, 'authors': authors, 'snippet': snippet}) # Собираем всё в одну базу
return articles
#Тут обработка главной функции нашего парсера
if __name__ == "__main__":
# НАШ ПОИСКОВЫЙ ЗАПРОС, замените на свой!!!!
search_query = "large language model"
# Запускаем web-драйвер Selenium
driver = init_selenium_driver()
try:
#Обращаемся к браузеру, передаём ему наш поисковый запрос и забираем HTML
html_content = fetch_search_results(driver, search_query)
#Парсим контент и возвращаем массив данных
articles = parse_results(html_content)
# Причёсываем вывод нашего массива с помощью библиотеки Pandas
df = pd.DataFrame(articles)
# Выводим данные в консоль
print(df.head())
finally:
# Закрываем браузер, чтобы не занимать память
driver.quit()
Сохраните и закройте.
Осталось запустить файл. Это можно сделать так:
- Откройте консоль (CMD или PowerShell).
- Переключитесь на каталог парсера: cd C:\Users\ВАШ_ПОЛЬЗОВАТЕЛЬ\scraper-google-scholar
- Выполните команду python scraper-google-scholar.py
Начнётся парсинг Google Scholar по запросу «large language model». Вы можете изменить запрос внутри скрипта и перезапустить его снова.
Обратите внимание, парсер выводит результаты поиска прямо в консоли.
***
Чтобы не повторять одни и те же действия (с редактированием и пересохранением файла), давайте усовершенствуем свой алгоритм парсинга Google Scholar.
Создайте новый файл scraper-google-scholar-new.py и заполните его содержимым:
# Импортируем библиотеки
from bs4 import BeautifulSoup
import pandas as pd
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.options import Options
import sys
import random
# Тут определяет работу web-драйвера Selenium
def init_selenium_driver():
# Формируем список опций запуска браузера, если опции не нужны, можете удалить их из списка
chrome_options = Options()
chrome_options.add_argument("--headless") # В скрытом режиме
chrome_options.add_argument("--no-sandbox") # Без песочницы
chrome_options.add_argument("--disable-dev-shm-usage") # Без раделения памяти
chrome_options.add_argument("--enable-features=Vulkan,VulkanFromANGLE,DefaultANGLEVulkan") # С аппаратным ускорением
driver = webdriver.Chrome(options=chrome_options) # Тут собираем все аргументы вместе
return driver
# Тут обрабатываем правила формирования URL-адреса, который передаётся браузеру
def fetch_search_results(driver, query, start=0):
# Стартовый адрес, в нашем случае доменное имя Google Scholar
base_url = "https://scholar.google.com/scholar"
# Тут передаём дополниетльные параметры к исходному адресу: запрос и номер работы, с которой нужно начать
params = f"?q={query}&start={start}"
# Передаём результирующий адрес браузеру
driver.get(base_url + params)
# Ждём пока страница загрузится, заметьте - без использования библиотеки asyncio
driver.implicitly_wait(10) # ставим фиксированный таймер 10 секунд
# Возвражаем результирующий HTML-код страницы
return driver.page_source
# Тут определяем обработку нескольких страниц
def scrape_multiple_pages(driver, query, num_pages):
all_articles = []
for i in range(num_pages):
start = i * 10 # Умножаем на 10, так как каждая страница содержит по 10 научных работ
html_content = fetch_search_results(driver, query, start=start)
articles = parse_results(html_content)
all_articles.extend(articles)
return all_articles
# Тут определяем правила парсинга (выборки) содержимого, работает бибиотека BeautifulSoup
def parse_results(html):
soup = BeautifulSoup(html, 'html.parser')
# Массив данных с результатами
articles = []
for item in soup.select('.gs_ri'): #Тут определяем условия поиска общего контейнера с научной работой
title = item.select_one('.gs_rt').text # Тут ищем заголовок работы
authors = item.select_one('.gs_a').text # Тут ищем автора
snippet = item.select_one('.gs_rs').text # Тут парсим текст сниппета (цитата)
articles.append({'title': title, 'authors': authors, 'snippet': snippet}) # Собираем всё в одну базу
return articles
#Тут обработка главной функции нашего парсера
if __name__ == "__main__":
if len(sys.argv) < 2 or len(sys.argv) > 3:
print("Для правильной работы скрипта добавьте поисковой запрос и глубину парсинга, вида 'тут запрос' число")
sys.exit(1)
# Забираем из командной строки поисковой запрос
search_query = sys.argv[1]
# И количество страниц
num_pages = int(sys.argv[2]) if len(sys.argv) == 3 else 1
# Запускаем наш безголовый браузер
driver = init_selenium_driver()
# Чтобы CSV-файлы с запросами имели разные имена, добавляем случайное значение
r_number = random.randint(1000000, 9999999)
try:
#Передаём парсеру запрос и глубину парсинга
all_articles = scrape_multiple_pages(driver, search_query, num_pages)
# Задействуем библиотеку Pandas для обработки массива данных
df = pd.DataFrame(all_articles)
# Сохраняем результаты в файл
df.to_csv(f"{r_number}_results.csv", index=False)
finally:
# Закрываем браузер, чтобы не занимать память
driver.quit()
Теперь вы можете передавать запрос прямо в командной строке. Там же с помощью числа можно указать глубину парсинга (с учётом пагинации по 10 элементов на странице).
Запуск будет выглядеть так (в консоли):
python scraper-google-scholar-new.py "large language model" 3
Где 3 – это число страниц, а «large language model» – поисковой запрос.
Заключение и рекомендации
Мы привели относительно простой скрипт парсинга Google Scholar. Но его можно ещё дополнительно усложнить: разбить на несколько потоков, организовать остановку в случае показа капчи с ожиданием её решения пользователем, написать алгоритм обхода найденных ссылок со скачиванием или копированием полного текста статьи и т.п.
Если вам нужно спарсить большой объём научных работ, то без прокси уже не обойтись. С большой вероятностью Google будет блокировать автоматический трафик.
Найти качественные мобильные, резидентные и серверные прокси с ротацией можно у Froxy. Мы предлагаем более 10 миллионов белых и полностью легальных прокси. Точность таргетинга – до конкретного города и провайдера связи. Подключение к вашему коду буквально в пару строк. Порт (прокси с обратной связью) прописывается всего один раз. Дальнейшая ротация выходных IP – на нашей стороне.