使用Scopus API从Sopus获取作者的文章(AUTHENTICATION_ERROR)

时间:2015-08-12 13:43:09

标签: python web-crawler scopus

我已在http://www.developers.elsevier.com/action/devprojects注册。我创建了一个项目并得到了我的scopus密钥:

enter image description here

现在,使用此生成的密钥,我想找到firstnamelastnamesubjectarea的作者。我向我的大学网络提出请求,允许访问Scopus(我可以完全手动访问Scopus搜索,从Firefox中使用它没有问题)。但是,我想通过编写一个简单的脚本来自动化我的Scopus挖掘。我想通过提供他/她firstnamelastnamesubjectarea找到作者的出版物。

这是我的代码:

# !/usr/bin/env python
# -*- coding: utf-8 -*-

import requests
import json
from scopus import SCOPUS_API_KEY


scopus_author_search_url = 'http://api.elsevier.com/content/search/author?'
headers = {'Accept':'application/json', 'X-ELS-APIKey': SCOPUS_API_KEY}
search_query = 'query=AUTHFIRST(%) AND AUTHLASTNAME(%s) AND SUBJAREA(%s)' % ('John', 'Kitchin', 'COMP')

# api_resource = "http://api.elsevier.com/content/search/author?apiKey=%s&" % (SCOPUS_API_KEY)

# request with first searching page
page_request = requests.get(scopus_author_search_url + search_query, headers=headers)
print page_request.url

# response to json
page = json.loads(page_request.content.decode("utf-8"))
print page

SCOPUS_API_KEY看起来像这样:SCOPUS_API_KEY="xxxxxxxx"

虽然我可以从我的大学网络中完全访问scopus ,但我得到了这样的答复:

  

{u' service-error':{u' status':{u' statusText':u' Requestor   配置设置不足以访问此资源。',   你的状态代码':你' AUTHENTICATION_ERROR'}}}

生成的链接如下所示:http://api.elsevier.com/content/search/author?query=AUTHFIRST(John)%20AND%20AUTHLASTNAME(Kitchin)%20AND%20SUBJAREA(COMP)当我点击它时,它会显示一个XML文件:

<service-error><status>
  <statusCode>AUTHORIZATION_ERROR</statusCode>
  <statusText>No APIKey provided for request</statusText>
</status></service-error>

或者,当我将scopus_author_search_url更改为"http://api.elsevier.com/content/search/author?apiKey=%s&" % (SCOPUS_API_KEY)时,我得到了:

{u'service-error': {u'status': {u'statusText': u'Requestor configuration settings insufficient for access to this resource.', u'statusCode': u'AUTHENTICATION_ERROR'}}}和XML文件:

<service-error>
<status>
<statusCode>AUTHENTICATION_ERROR</statusCode>
<statusText>Requestor configuration settings insufficient for access to this resource.</statusText>
</status>
</service-error>

这个问题的原因是什么?我该如何解决?

2 个答案:

答案 0 :(得分:2)

我刚刚注册了一个API密钥,并首先使用以下网址对其进行了测试:

http://api.elsevier.com/content/search/author?apikey=4xxxxxxxxxxxxxxxxxxxxxxxxxxxxx43&query=AUTHFIRST%28John%29+AND+AUTHLASTNAME%28Kitchin%29+AND+SUBJAREA%28COMP%29

我的大学网络工作正常。我还测试了第二个API密钥,因此在我的大学域名上验证了一个注册网站,其中一个注册网站http://apitest.example.com,排除了用于注册问题的域名。

我测试了这个

  1. 在浏览器中,
  2. 使用你的python代码和头文件中的api密钥。我对您的代码所做的唯一更改是删除

    from scopus import SCOPUS_API_KEY
    

    并添加

    SCOPUS_API_KEY ='4xxxxxxxxxxxxxxxxxxxxxxxxxxxxx43'
    
  3. 使用适合将apikey放入URL而不是标题的python代码。
  4. 在所有情况下,查询都会返回两位作者,一位在卡内基梅隆,另一位在帕洛阿尔托。

    我无法复制您的错误消息。如果我尝试使用未注册elsevier(例如我的家用电脑)的IP地址的API密钥,我会看到另一个错误:

    <service-error>
      <status>
        <statusCode>AUTHENTICATION_ERROR</statusCode>
        <statusText>Client IP Address: xxx.yyy.aaa.bbb does not resolve to an account</statusText>
       </status>
    </service-error>
    

    如果我使用大学网络中的随机(错误)API密钥,我会看到

    <service-error>
        <status>
            <statusCode>AUTHORIZATION_ERROR</statusCode>
            <statusText>APIKey <mad3upa1phanum3r1ck3y> with IP address <my.uni.IP.add> is unrecognized or has insufficient privileges for access to this resource</statusText>
        </status>
    </service-error>
    

    调试步骤

    由于我无法复制您的问题 - 以下是您可以用来解决的一些诊断步骤:

    1. 在uni上使用您的浏览器实际使用URL中的密钥提交api查询(即复制上面的URL,将其粘贴到地址栏中,替换您的密钥并查看是否获得XML)< / p>

    2. 如果1返回您期望的XML,请继续通过Python提交请求 - 首先,将确切的URL直接复制到Python中(不通过%s进行变量替换,标题中没有apikey)在它上面做.get()

    3. 如果2正确返回,请确保您的SCOPUS_API_KEY保留确切的键值,不多也不少。即print 'SCOPUS_API_KEY'应该返回您的apikey:4xxxxxxxxxxxxxxxxxxxxxxxxxxxxx43

    4. 如果1返回错误,看起来你的uni(无论出于何种原因)无法访问作者查询API。鉴于您可以执行手动搜索,这没有多大意义,但这就是我能得出的结论

    5. 文档

      参考身份验证算法文档is here,但要遵循它并不是很简单。您正在关注身份验证选项1,您的方法应该正常工作。

      N.B。 API仅限于5000 author retrievals per week。如果你在循环中运行了很多查询,即使它们失败了,你可能已经超过了...

答案 1 :(得分:1)

以供将来参考。 OP使用的软件包from pybliometrics.scopus import AuthorSearch q = "AUTHFIRST(John) AND AUTHLASTNAME(Kitchin) AND SUBJAREA(COMP)" s = AuthorSearch(q) # handles access, retrieval, parsing and even caches results print(s) results = s.authors # Holds all the information as a list of namedtuples print(results) # You can put this into a pandas DataFrame as well 早已重命名为pybliometrics

现在可以做

.html