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

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

 

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(', '))
复制代码

完成上述操作之后,就得到了每篇论文的标题、作者列表,接下来就是寻找作者姓名的共现情况。

合著分析

这一步就是简单的计数和排序了,我的做法是定义一个作者类,属性包含姓名、论文数,然后遍历上面得到作者列表,统计某位作者参与的论文数,最后对这些作者进行排序即可。最后输出结果:

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

从这个结果中可以看出,F Shen 老师最常合作的学者是 HT Shen 、Y Yang 等老师。当然,有了前面得到的那些作者列表之后,还可以从各种不同的维度去分析,上面这个截图只是其中一种很简单的应用场景。

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

结语

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

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

如果你用得到的话可以直接拿走,在我的QQ技术交流群里(技术交流和资源共享,广告勿入)可以自助拿走,群号是895937462。

上一篇:RabbitMQ消费者不消费, 生产者被阻塞


下一篇:后端返回 图片或者文件路径 前端怎么转成base64