Preface
之前同学读研选导师,帮忙参考了一下。我发现有些老师很年轻,但是 Google Scholar 各项数据都高得离谱(主要是 citation 和 h-index ),甚至轻松碾压一些在人口耳的小牛导。直觉上来说这种应该是数据虚高了,我猜测是因为老师之间合作比较多,一篇文章挂好几个老师的名字,而这种成果共享在 gs 上的体现就是,每个人都多了一篇文章。编程学习资料点击免费领取
虽然参与论文即需署名是基本的学术规范,老师们合作并共享成果肯定是没问题的,但是这会导致老师的 gs 数据虚高,进而对学生产生一定误导。因此,我们可以利用 gs 上的公开数据,分析一下老师们的合著情况,比如看看所有论文中,平均每篇文章由多少位老师参与……这些信息可以在我们选导师的时候帮助我们降低噪声,提供一定参考。
原理
要想分析一位老师的合著情况,首先我们需要获取这位老师的所有出版物,可以从 Google Scholar 上爬取该老师的论文列表。得到论文列表之后,我们需要提取出每篇文章的作者,然后对这些作者的出现频次进行排序。最后,就要依靠自己的先验知识来判断了,如果比较熟悉学院里各位老师的话,可以直接认出来哪些人是老师。对于代码实现而言,需要做的就是爬取论文列表、统计作者出现频率了。
实现
爬取论文列表
首先,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)
复制代码
这样,我们就已经得到了原始的论文列表数据,接下来需要从这些数据中提取有效信息。
提取信息
这一步主要通过正则表达式来实现。通过简单观察即可得到论文标题、作者和出版物等信息的正则表达式 pattern ,如下:
title_pattern = re.compile(r'gsc_a_at">.*?<')
author_pattern = re.compile(r'<div class="gs_gray">.*?</div><')
publisher_pattern = re.compile(r'</div><div class="gs_gray">.*?<span')
复制代码
然后我们利用这些 pattern 来提取相应的信息存入列表,同时进行裁切,进一步去除多余的字符;而一篇文章中有多位作者,也需要根据逗号将其拆分进列表。
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 老师最常合作的学者是 HT Shen 、Y Yang 等老师。当然,有了前面得到的那些作者列表之后,还可以从各种不同的维度去分析,上面这个截图只是其中一种很简单的应用场景。
这里我用了 F Shen 老师的论文数据,需要提一下,我这里只是随便举个例子,不代表我对这位老师有任何偏见。实际上 F Shen 老师是我一直非常敬仰的老师,也是我曾经的意向导师之一,口碑很好,这里也向大家推荐一下 ~
结语
以上就是利用 Google Scholar 数据进行合著分析的大致过程,技术实现上毫无难度,写在这里一方面是分享一些经验,比如在 Google Scholar 论文数据中正则表达式 pattern 应该怎么设计;另一方面也是给大家提供一种进一步了解老师的思路,毕竟 Google Scholar 的各项指数并不代表一切。希望能有所帮助。
①3000多本Python电子书有
②Python开发环境安装教程有
③Python400集自学视频有
④软件开发常用词汇有
⑤Python学习路线图有
⑥项目源码案例分享有如果你用得到的话可以直接拿走,在我的QQ技术交流群里(技术交流和资源共享,广告勿入)可以自助拿走,群号是895937462。