ISTEX a pour ambition de « construire le socle de la bibliothèque scientifique numérique nationale. » Il s’agit d’une initiative dans le cadre des « Investissements d’Avenir » soutenus par l’Etat français.
ISTEX acquiert et structure de grandes quantités de documents scientifiques pour les rendre accessibles.
Nous nous intéressons ici à l’accès aux ressources d’ISTEX via une API.
API ISTEX
Les informations concernant l’API ISTEX se trouvent à l’adresse https://api.istex.fr/documentation/. Certaines ressources sont en accès libre, d’autres nécessitent une authentification.
L’API propose plusieurs modes d’authentification. Nous allons utiliser l’authentification par clé (token d’identification). La méthode décrite (https://api.istex.fr/documentation/access/) est en deux étapes: création du token, accès à l’API à l’aide du token.
La création du token nécessite de s’identifier à l’adresse https://api.istex.fr/token/ soit par son établissement d’enseignement/recherche en le sélectionnant dans une liste, soit en utilisant un CRU -Compte Réseau Universel- que l’on peut créer en ligne. Une fois cette authentification réalisée, un accès à la même adresse renvoie une structure JSON telle que:
{ "_comment": "Votre token d'identification a bien été généré. Vous pouvez dès à présent vous indentifier en utilisant le header "Authorization: Bearer _accessToken" (remplacer _accessToken par votre token)..." "_accessToken": "eXJXbXciOeyJpZCI6Im1vaXNzaW5hI..." }
Le champ « _accessToken » de la structure JSON obtenue est le token qui pourra être utilisé lors des accès suivants à l’API. J’ai sauvé la structure JSON dans un fichier tokenIstex.json.
Exemple de requête à ISTEX
Un code minimal pour interroger ISTEX est alors par exemple
import json import urllib istexpApiAccess = "https://api.istex.fr/" token = "<ici mettre votre token>" urlquery = istexpApiAccess+'document/?q=author.name:Moissinac' headers = {'Authorization': 'Bearer ' + token} req = urllib.request.Request(urlquery, None, headers) with urllib.request.urlopen(req) as rep: results = json.loads(str(rep.read().decode('utf-8'))) print(results)
Vous devez renseigner votre token.
La requête proprement dite est la valeur du paramètre q. Ici, j’indique que je veux chercher suivant le critère author.name qui doit avoir la valeur Moissinac.
La réponse est une structure JSON sur le modèle fictif suivant:
{ "total": 129, "nextPageURI": "https://api.istex.fr/document/?q=author.name:Moissinac&size=10&defaultOperator=OR&from=10", "firstPageURI": "https://api.istex.fr/document/?q=author.name:Moissinac&size=10&defaultOperator=OR&from=0", "lastPageURI": "https://api.istex.fr/document/?q=author.name:Moissinac&size=10&defaultOperator=OR&from=119", "hits": [ { "title": "SVG: open format for graphic", "id": "F8F283D5CBD747547F48F8057F2190FB11772A76", "score": 7.9658365 }, { "title": "Oil Impacts on Marine Invertebrate Populations and Communities", "id": "A1465DF05E586E93F745415C7AB4EB45FC9CFF10", "score": 6.441195 }, ... ] }
On y trouve le nombre total de réponse, par défaut les 10 premières réponses dans le champ hits, les urls de la page suivante, de la première et de la dernière page de réponses. Pour chaque réponse, on a le titre, un identifiant de ressource ISTEX -que nous utiliserons dans d’autres requêtes- et un score -qui évalue une pertinence de la réponse?.
La composition des requêtes est décrite ici:
https://api.istex.fr/documentation/search/
La requête suivante
urlquery = istexpApiAccess+'document/?q=semantic'
donnera les documents contenant le mot semantic dans un des champs indexés.
et la requête
urlquery = istexpApiAccess+"document/982F365ECC48B450E090EC595C09C8472DE784CF/fulltext/pdf"
donnera le document dont l’identifiant ISTEX est 982F365ECC48B450E090EC595C09C8472DE784CF.
Pour avoir plus d’informations sur ce document, il suffit d’utiliser cet identfiant pour la requête
urlquery = istexpApiAccess+"document/982F365ECC48B450E090EC595C09C8472DE784CF
qui renvoie une structure JSON avec notamment le titre, les auteurs et leur affiliation….
Précautions
De façon classique lorsqu’on utilise une API, il faut éviter de surcharger le serveur en envoyant des salves de requêtes générées par un logiciel.
Vous devez utiliser une des méthodes permettant d’appeler une fonction chaque N secondes. La méthode appelée consomme à chaque fois une requête placée dans une liste de requêtes. J’ai ainsi sollicité ISTEX par une requête toutes les 5 secondes.
Résultats
Sur cette base, j’ai cherché les publications de Telecom ParisTech.
La requête
urlquery = istexpApiAccess+"document/?q=Telecom%20AND%20ParisTech"
donne 479 références. Tandis que la requête
urlquery = istexpApiAccess+"document/?q=Télécom%20AND%20ParisTech"
donne 225 références.