Получить год первой публикации 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.