Skip to content
Snippets Groups Projects
datacite.py 2.71 KiB
Newer Older
# récupérer les DOIs de l'UGA depuis Datacite
## 2023-12-01, Elias Chetouane

"""
## todo
Maxence Larrieu's avatar
Maxence Larrieu committed
- v2 : périmètre UGA : ajouter les ROR des unités, des établissements/laboratoires associés (eg Grenoble INP, sciencepo grenoble)

## Documentation
* Doc générale API Datacite : https://support.datacite.org/docs/api
* Recherche d'un DOI : https://support.datacite.org/docs/api-sampling
* Pagination : https://support.datacite.org/docs/pagination
Maxence Larrieu's avatar
Maxence Larrieu committed

## memo sur les requêtes
Maxence Larrieu's avatar
Maxence Larrieu committed
client_id=inist.OSUG datasets de l'OSUG https://doi.osug.fr/ 
client_id=JBRU.AAU le laboratoire AAU (architecture)
Maxence Larrieu's avatar
Maxence Larrieu committed
client_id=inist.persyval données issues du Labex Persyval-lab (PIA)
urls = [
    'https://api.datacite.org/dois?affiliation=true&query=creators.affiliation.affiliationIdentifier:"https://ror.org/02rx3b187"&page[size]=100',
Maxence Larrieu's avatar
Maxence Larrieu committed
    'https://api.datacite.org/dois?affiliation=true&query=contributors.affiliation.affiliationIdentifier:"https://ror.org/02rx3b187"&page[size]=100',
Maxence Larrieu's avatar
Maxence Larrieu committed
    "https://api.datacite.org/dois?client_id=inist.OSUG&page[size]=100",
Maxence Larrieu's avatar
Maxence Larrieu committed
    "https://api.datacite.org/dois?client_id=JBRU.AAU&page[size]=100",
Maxence Larrieu's avatar
Maxence Larrieu committed
    "https://api.datacite.org/dois?client_id=inist.persyval&page[size]=100"   
Maxence Larrieu's avatar
Maxence Larrieu committed
# on définit une fonction pour la lancer la requete avec chaque url pour les différentes affiliations et clients
    results = [req.json()]
    
    # obtenir les résultats de chaque page dans la liste results
    nb_pages = results[0]["meta"]["totalPages"]
    page = 1
    while(page < nb_pages):
        url = (results[page-1]["links"]["next"])
        req = requests.get(url)
        results.append(req.json())
        page += 1
    return results

# on crée une fonction pour ajouter les DOIs dans une liste, sans ajouter les résultats qui ne sont pas des DOIs
def get_dois(results):
    dois = []
    not_dois = []

    # prendre en compte les résultats de chaque page
    for res in results:
        num_dois = res["data"]
        for item in num_dois :
            doi = item["id"]
            if item.get("type") != "dois":
                print("Le résultat " + str(item) + " est de type " + item.get("type") + " : " + doi)
                not_dois.append(doi)
            else:
                dois.append(doi)
    return dois, not_dois

Maxence Larrieu's avatar
Maxence Larrieu committed
# récupérer les dois
for url in urls:
    doi, not_doi = get_dois(get_results(url))
    dois += doi
    not_dois += not_doi

Maxence Larrieu's avatar
Maxence Larrieu committed
# supprimer les doublons
Maxence Larrieu's avatar
Maxence Larrieu committed
print(f"Nombre de dois différents trouvés\t{len(unique_dois)}")
Maxence Larrieu's avatar
Maxence Larrieu committed
# exporter la liste de DOI au format txt
with open("datacite-dois.txt", 'w') as f :
    [f.write(f"{line}\n") for line in unique_dois]