爬取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学习路线图有 ⑥项目源码案例分享有