Блог Froxy | Новости, полезные статьи о использовании прокси

Пошаговое руководство по скрапингу Google Scholar с Python

Written by Команда Froxy | 20.02.2025 9:00:00

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 – это средство для удобной работы с массивами данных. Официальная документация.

Резидентные прокси

Лучшие прокси-серверы для доступа к ценным данным со всего мира.

Начать с триала $1.99, 100Mb

Шаг 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 BeautifulSoupimport pandas as pdfrom selenium import webdriverfrom selenium.webdriver.common.by import Byfrom selenium.webdriver.chrome.options import Options# Тут определяет работу web-драйвера Seleniumdef 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 Scholarbase_url = "https://scholar.google.com/scholar"# Тут передаём свой поисковой запросparams = f"?q={query}"# Передаём результирующий адрес браузеруdriver.get(base_url + params)# Ждём пока страница загрузится, заметьте - без использования библиотеки asynciodriver.implicitly_wait(10) # Ставим фиксированный таймер на 10 секунд (можно увеличить, если соединение медленное# Восзвражаем результирующий HTML-контент страницыreturn driver.page_source# Тут определяем правила парсинга (выборки) содержимого, работает бибиотека BeautifulSoupdef 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-драйвер Seleniumdriver = init_selenium_driver()try:#Обращаемся к браузеру, передаём ему наш поисковый запрос и забираем HTMLhtml_content = fetch_search_results(driver, search_query)#Парсим контент и возвращаем массив данныхarticles = parse_results(html_content)# Причёсываем вывод нашего массива с помощью библиотеки Pandasdf = pd.DataFrame(articles)# Выводим данные в консольprint(df.head())finally:# Закрываем браузер, чтобы не занимать памятьdriver.quit()

Сохраните и закройте.

Осталось запустить файл. Это можно сделать так:

  1. Откройте консоль (CMD или PowerShell).
  2. Переключитесь на каталог парсера: cd C:\Users\ВАШ_ПОЛЬЗОВАТЕЛЬ\scraper-google-scholar
  3. Выполните команду python scraper-google-scholar.py

Начнётся парсинг Google Scholar по запросу «large language model». Вы можете изменить запрос внутри скрипта и перезапустить его снова.

Обратите внимание, парсер выводит результаты поиска прямо в консоли.

***

Чтобы не повторять одни и те же действия (с редактированием и пересохранением файла), давайте усовершенствуем свой алгоритм парсинга Google Scholar.

Создайте новый файл scraper-google-scholar-new.py и заполните его содержимым:

# Импортируем библиотекиfrom bs4 import BeautifulSoupimport pandas as pdfrom selenium import webdriverfrom selenium.webdriver.common.by import Byfrom selenium.webdriver.chrome.options import Optionsimport sysimport random# Тут определяет работу web-драйвера Seleniumdef 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# Тут определяем правила парсинга (выборки) содержимого, работает бибиотека BeautifulSoupdef 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 – на нашей стороне.