爬取Google Scholar论文列表,如何利用公开数据进行合著作者分析?

Preface

之前同学读研选导师,帮忙参考了一下。我发现有些老师很年轻,但是 Google Scholar 各项数据都高得离谱(主要是 citation 和 h-index ),甚至轻松碾压一些在人口耳的小牛导。直觉上来说这种应该是数据虚高了,我猜测是因为老师之间合作比较多,一篇文章挂好几个老师的名字,而这种成果共享在 gs 上的体现就是,每个人都多了一篇文章。

虽然参与论文即需署名是基本的学术规范,老师们合作并共享成果肯定是没问题的,但是这会导致老师的 gs 数据虚高,进而对学生产生一定误导。因此,我们可以利用 gs 上的公开数据,分析一下老师们的合著情况,比如看看所有论文中,平均每篇文章由多少位老师参与……这些信息可以在我们选导师的时候帮助我们降低噪声,提供一定参考。

原理

实现

爬取论文列表

首先,gs 用户主页的论文列表不是一次性全部展示的,需要手动点击下方的展开,而展开后的这些新信息并不是一开始就加载好的,而是点击之后通过一个新的 url 请求的,所以需要分批次爬取(第一次接触爬虫,只会这种笨办法)。不过好在新的 url 的格式是有规律可循的,因此,只需要根据用户论文总数,就能确定需要多少条 url 、每条 url 应该是什么。

url 的格式为:

    前20条论文数据(即首页展示的20篇)对应的url就是用户主页的链接; 第20-100条,在主页链接后加&cstart=20&pagesize=80; 第100-200条,在主页链接后加&cstart=100&pagesize=100; 第200-300条,在主页链接后加&cstart=200&pagesize=100; 以此类推。

因此,只需要定义一个urls列表,根据老师的论文数量,把所有 url 都写好放进去即可。

接着,定义一个data字符串,把爬取到的信息都拼接到字符串里面,后面用正则表达式提取有效信息。

然后,定义函数获取信息:

def getData(url):
    header_dict={Host: scholar.google.com,
                 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.81 Safari/537.36,
                 Accept: */*,
                 Accept-Language: zh-CN,zh;q=0.9,
                 Referer: https://scholar.google.co.id/citations?hl=zh-CN&user=oqYL6fQAAAAJ,
                 Connection: keep-alive}
    req = urllib.request.Request(url=url,headers=header_dict)
    response = urllib.request.urlopen(req,timeout=120)

    tempdata = response.read()
    tempdata = tempdata.decode()
    return tempdata
复制代码

在刚才定义的urls中,用一个 for 循环依次爬取每个 url 的数据,拼接到data字符串上。

urls = [https://scholar.google.co.id/citations?hl=zh-CN&user=oqYL6fQAAAAJ,
        https://scholar.google.co.id/citations?hl=zh-CN&user=oqYL6fQAAAAJ&cstart=20&pagesize=80,
        https://scholar.google.co.id/citations?hl=zh-CN&user=oqYL6fQAAAAJ&cstart=100&pagesize=100,
        https://scholar.google.co.id/citations?hl=zh-CN&user=oqYL6fQAAAAJ&cstart=200&pagesize=100]

for each in urls:
    data += getData(each)
复制代码

这样,我们就已经得到了原始的论文列表数据,接下来需要从这些数据中提取有效信息。

提取信息

title_pattern = re.compile(rgsc_a_at">.*?<)
author_pattern = re.compile(r<div class="gs_gray">.*?</div><)
publisher_pattern = re.compile(r</div><div class="gs_gray">.*?<span)
复制代码
title = re.findall(title_pattern, data)
author = re.findall(author_pattern, data)
publisher = re.findall(publisher_pattern, data)

for i in range(len(title)):
    title[i] = title[i][10:-1]
for i in range(len(author)):
    author[i] = author[i][21:-7]
    author_list.append(author[i].split(, ))
复制代码

合著分析

这里我用了 F Shen 老师的论文数据,需要提一下,我这里只是随便举个例子,不代表我对这位老师有任何偏见。实际上 F Shen 老师是我一直非常敬仰的老师,也是我曾经的意向导师之一,口碑很好,这里也向大家推荐一下 ~

结语

以上就是利用 Google Scholar 数据进行合著分析的大致过程,技术实现上毫无难度,写在这里一方面是分享一些经验,比如在 Google Scholar 论文数据中正则表达式 pattern 应该怎么设计;另一方面也是给大家提供一种进一步了解老师的思路,毕竟 Google Scholar 的各项指数并不代表一切。希望能有所帮助。

①3000多本Python电子书有 ②Python开发环境安装教程有 ③Python400集自学视频有 ④软件开发常用词汇有 ⑤Python学习路线图有 ⑥项目源码案例分享有
经验分享 程序员 微信小程序 职场和发展