Получить год первой публикации Google Scholar

Я работаю над очисткой данных от Google Scholar, используя bs4 и urllib. Я пытаюсь получить первый год, когда статья публикуется. Например, с этой страницы я пытаюсь получить 1996 год. Это можно прочитать с гистограммы, но только после нажатия на гистограмму. Я написал следующий код, но он печатает год, видимый до нажатия на гистограмму.

from bs4 import BeautifulSoup
import urllib.request

url = 'https://scholar.google.com/citations?user=VGoSakQAAAAJ'
page = urllib.request.urlopen(url)
soup = BeautifulSoup(page, 'lxml')
year = soup.find('span', {"class": "gsc_g_t"})
print (year)

2 ответа

Решение

Информация о графике находится на другом запросе, этот. Там вы можете получить необходимую информацию с помощью следующего xpath:

'//span[@class="gsc_g_t"][1]/text()'

или в супе:

soup.find('span', {"class": "gsc_g_t"}).text

Убедитесь, что вы используете последнюю версию . Старый user-agentsявляется сигналом для сайта, что это может быть бот, который отправляет запрос. Но новый не означает, что каждый веб-сайт будет думать, что это «настоящий» визит пользователя. Проверьте, что у вас user-agent.

Фрагмент кода использует parselбиблиотека, похожая на bs4но он поддерживает полный XPath и переводит каждый запрос селектора CSS в XPath, используяcssselectупаковка.

Пример кода для интеграции:

      from collections import namedtuple

import requests
from parsel import Selector

# https://docs.python-requests.org/en/master/user/quickstart/#passing-parameters-in-urls
params = {
    "user": "VGoSakQAAAAJ",
    "hl": "en",
    "view_op": "citations_histogram"
}

# https://docs.python-requests.org/en/master/user/quickstart/#custom-headers
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.87 Safari/537.36",
}

html = requests.get("https://scholar.google.com/citations", params=params, headers=headers, timeout=30)
selector = Selector(html.text)

Publications = namedtuple("Years", "first_publication")
publications = Publications(sorted([publication.get() for publication in selector.css(".gsc_g_t::text")])[0])

print(selector.css(".gsc_g_t::text").get())
print(sorted([publication.get() for publication in selector.css(".gsc_g_t::text")])[0])
print(publications.first_publication)


# output:
'''
1996
1996
1996
'''

В качестве альтернативы вы можете добиться того же, используя API Google Scholar Author API от SerpApi. Это платный API с бесплатным планом.

Разница в том, что вам не нужно выяснять, как анализировать данные и поддерживать синтаксический анализатор с течением времени, выяснять, как его масштабировать, и обходить блокировки со стороны поисковой системы, такой как поисковая система Google Scholar.

Пример кода для интеграции:

      
from serpapi import GoogleScholarSearch


params = {
  "api_key": "Your SerpApi API key",
  "engine": "google_scholar_author",
  "hl": "en",
  "author_id": "VGoSakQAAAAJ"
}

search = GoogleScholarSearch(params)
results = search.get_dict()

# already sorted data
first_publication = [year.get("year") for year in results.get("cited_by", {}).get("graph", [])][0]
print(first_publication)

# 1996

Если вы хотите очистить все результаты профиля на основе заданного запроса или у вас есть список идентификаторов авторов, есть специальный раздел, посвященный очистке всех результатов Google Scholar Profile, Author Results to CSV в моем блоге об этом.

Отказ от ответственности, я работаю в SerpApi.

Другие вопросы по тегам