Google Scholar не очень подходит для этой цели, так как не имеет формального API AFAIK. Он также не дает результатов в структурированном (например, XML) формате. Итак, мы должны прибегнуть к быстрому (и очень, очень хрупкому!) Взлому соответствия текстового шаблона:
searchGoogleScholarAuthor[author_String] :=
First[StringCases[
Import["http://scholar.google.com/scholar?start=0&num=1&q=" <>
StringDrop[
StringJoin @@ ("author:" <> # <> "+" & /@
StringSplit[author]), -1] <> "&hl=en&as_sdt=1,5"], ___ ~~
"Results" ~~ ___ ~~ "of about" ~~ Shortest[___] ~~
p : Longest[(DigitCharacter | ",") ..] ~~ ___ ~~ "." ~~ ___ ~~
"(" ~~ ___ :> p]]
In[191]:= searchGoogleScholarAuthor["A Einstein"]
Out[191]= "6,400"
In[190]:= searchGoogleScholarAuthor["Einstein"]
Out[190]= "9,400"
In[192]:= searchGoogleScholarAuthor["Wizard"]
Out[192]= "197"
In[193]:= searchGoogleScholarAuthor["Vries"]
Out[193]= "70,700"
Добавьте ToExpression
, если вам не нравится строковый результат. Если вы хотите ограничить годы публикации, вы можете добавить &as_ylo=2011&as_yhi=2011&
в строку поиска и изменить начальный и конечный годы.
соответственно.
Обратите внимание, что авторы с популярными именами будут генерировать множество ложных совпадений, поскольку невозможно однозначно идентифицировать одного автора. Кроме того, Scholar возвращает множество хитов, в том числе цитаты, книги, перепечатки и многое другое. Так что на самом деле это не очень полезно для подсчета.
Немного объяснений:
Ученый разбивает инициалы и имена авторов и соавторов по нескольким author:
полям в сочетании с +. Об этом заботится часть кода StringDrop[StringJoin @@ ("author:" <> # <> "+" & /@ StringSplit[author]), -1]
. StringDrop
удаляет последний +
.
Часть Stringcases
содержит большой текстовый шаблон, который в основном ищет текст, который ученый помещает в верхней части каждой страницы результатов, и который содержит количество совпадений. Этот номер затем изолируется и возвращается.