Skip to content
Snippets Groups Projects
Commit d39136dd authored by Maxence Larrieu's avatar Maxence Larrieu
Browse files

improve zenodo script

parent 9285e786
No related branches found
No related tags found
No related merge requests found
This diff is collapsed.
# Récupérer les DOIs de l'UGA depuis Zenodo # Récupérer les DOIs de l'UGA depuis Zenodo
## 2023-11-29, Maxence Larrieu ## 2023-12-06, Maxence Larrieu
""" """
## todo ## todo
- recherche itératives par types : dataset, image, video, software, physical object, other OU bien regarder si on requeter aussi dans le champs type directment - v2 : rechercher UGA comme financeur `grants.funder.doi`
- v2 : passer par les ORCID des `creator.orcid` et `contributors.orcid`
## Documentation ## Documentation
* Liste des métadonnées obligatoires lors du dépôts (upload_type, sub_type, publication_date, titre, creators, ) https://developers.zenodo.org/#representation * Liste des métadonnées obligatoires lors du dépôts (upload_type, sub_type, publication_date, titre, creators, ) https://developers.zenodo.org/#representation
* Recherche dans l'interfance : https://zenodo.org/search?q=creators.affiliation%3Agrenoble&q=type%3Adataset&l=list&p=1&s=10&sort=bestmatch * Recherche dans l'interface : https://zenodo.org/search?q=creators.affiliation%3Agrenoble&q=type%3Adataset&l=list&p=1&s=10&sort=bestmatch
* Doc dev API champs de requêtes classsiques https://developers.zenodo.org/#records * Doc dev API champs de requêtes classsiques https://developers.zenodo.org/#records
* doc champs poussées pour la recherche https://help.zenodo.org/guides/search/ * doc champs poussées pour la recherche https://help.zenodo.org/guides/search/
* typologie des dépôts possiblent : publication: Publication, poster: Poster, presentation: Presentation, Dataset: Dataset, image: Image, video: Video/Audio, software: Software, lesson: Lesson, physicalobject: Physical object, other: Other * typologie des dépôts possiblent : publication: Publication, poster: Poster, presentation: Presentation, Dataset: Dataset, image: Image, video: Video/Audio, software: Software, lesson: Lesson, physicalobject: Physical object, other: Other
### Identifier les dépôts : ### Identifier les dépôts :
- utilisation du champs `creators.affiliation` (multi affiliation) - utilisation du champs `creators.affiliation` et contributor.affiliation (multi affiliation)
- v2 : chercher aussi au niveau des "contributeurs" : `contributors.affiliation` et au niveau auteur `contributors.orcid` - utilisation de la forme "grenoble" uniquement, possibilité de bruit
- v2 : passer par les ORCID des 'auteurs' `creator.orcid`
- v2 : rechercher UGA comme financeur `grants.funder.doi`
## Notes sur la récupération ## Notes sur la récupération
- exemple résultats de requete : https://zenodo.org/api/records?q=creators.affiliation%3A*grenoble*&type=dataset&page=6&size=100&sort=mostrecent&all_version=False&access_tpoken=4A1P6e4gIkvhpcNpVpI05C9yVCjJIDD3vljILoJ1wlyxT9VA70ZXyPMdjqHB) - exemple résultats de requete : https://zenodo.org/api/records?q=creators.affiliation%3A*grenoble*&type=dataset&page=6&size=100&sort=mostrecent&all_version=False
- deux DOI identiques sont présent : un à la racine `[hits][doi]` et un autre dans `[hits][metadata][doi]` - deux DOI identiques sont présents : un à la racine `[hits][doi]` et un autre dans `[hits][metadata][doi]`
- il y a des DOI renseignés par le déposant qui ne sont pas de Zenodo - il y a des DOI renseignés par le déposant qui ne sont pas de Zenodo
""" """
import pandas as pd, requests, json import requests, json
# import sys
# sys.path.append('0-collect-data')
print("\n\nzenodo.py is launched") print("\n\nzenodo.py is launched")
with open("personnal-keys.json") as f : with open("personnal-keys.json") as f :
## load zenodo keys for requests the API
ACCESS_TOKEN = json.load(f)["ZENODO_KEY"] ACCESS_TOKEN = json.load(f)["ZENODO_KEY"]
def req_zenodo(page_nb) : def req_zenodo_with_page(uga_perimeter, record_type, page_nb) :
""" """
retourne les jeux de données UGA depuis Zenodo retourne les jeux de données UGA depuis Zenodo
page_nb précise le numéro de la page de la requête page_nb précise le numéro de la page de la requête
...@@ -46,8 +44,8 @@ def req_zenodo(page_nb) : ...@@ -46,8 +44,8 @@ def req_zenodo(page_nb) :
r = requests.get( r = requests.get(
"https://zenodo.org/api/records", "https://zenodo.org/api/records",
params = { params = {
"q" : "creators.affiliation:grenoble", "q" : uga_perimeter,
"type" : "dataset", "type" : record_type,
"page" : page_nb, "page" : page_nb,
"size" : 100, "size" : 100,
"sort" : "mostrecent", "sort" : "mostrecent",
...@@ -55,7 +53,8 @@ def req_zenodo(page_nb) : ...@@ -55,7 +53,8 @@ def req_zenodo(page_nb) :
"access_tpoken" : ACCESS_TOKEN "access_tpoken" : ACCESS_TOKEN
} }
) )
# to debug print(r.url) # for debugging
#print(r.url)
## si pb présent dans les résultats ## si pb présent dans les résultats
if r.status_code != 200 : if r.status_code != 200 :
...@@ -64,7 +63,7 @@ def req_zenodo(page_nb) : ...@@ -64,7 +63,7 @@ def req_zenodo(page_nb) :
"content" : r "content" : r
} }
## s'il n'y a pas de probleme ## if no problem
res = r.json() res = r.json()
return { return {
...@@ -73,40 +72,68 @@ def req_zenodo(page_nb) : ...@@ -73,40 +72,68 @@ def req_zenodo(page_nb) :
} }
## var to initiate the loop def req_zenodo(uga_perimeter, record_type) :
output_dois = [] """
current_page_number = 0 permet de gérer la pagination de zenodo en fonction du nb de résutlat donné par l'API
iterate = True tant que le nombre de DOI récolté est inf. au résutlat de la requête
"""
while iterate : output_dois = []
current_page_number = 0
current_page_number += 1 iterate = True
print("new iteration page =", current_page_number)
res = req_zenodo(current_page_number) while iterate :
current_page_number += 1
res = req_zenodo_with_page(uga_perimeter, record_type, current_page_number)
# verifier si la requete a bien fonctionnée
if not res["continue"] :
print(r"/!\ oups, problem with the query")
print(res["content"].status_code ) ## contient la réponse de la requête
break
# pour la premiere iteration, extraire le nb de DOI a récupérer
if current_page_number == 1 :
nb_dois_to_get = res["content"]["total"]
print(f"\t{record_type}\n\tDOIs to get", nb_dois_to_get )
# verifier si la requete a bien fonctionnée #to debug
if not res["continue"] : #print("\titeration page nb", current_page_number)
print("oups, problem with the query")
print(res["content"].status_code ) ## res[content] contient la réponse de la requête ## parcourir tous les DOIs et les placer dans la liste
break ## placer le DOI uniquement si une donnée est présente
[output_dois.append( item["doi"] ) for item in res["content"]["hits"] if item.get("doi")]
# pour la premiere iteration, extraire le nb de DOI a récupérer ## managing the loop
if current_page_number == 1 : ### if I have all the DOIs inside my outputs, then I had finish, if not continue
nb_dois_to_get = res["content"]["total"] if len(output_dois) >= nb_dois_to_get :
print("\tfirst iteration. DOIs to get =", nb_dois_to_get ) iterate = False
## parcourir tous les DOIs et les placer dans la liste return output_dois
## placer le DOI uniquement si une donnée est présente
[output_dois.append( item.get("doi") ) for item in res["content"]["hits"] if item.get("doi")]
## managing the loop
### if I have all the DOIs inside my outputs, then I had finish
if len(output_dois) >= nb_dois_to_get :
iterate = False
##_______________________________________________
all_dois = set() # a set to gather all DOIs
uga_perimeter = "creators.affiliation:*grenoble* contributors.affiliation:*grenoble*"
types_to_req = ["dataset", "image", "video", "software", "other"]
for record_type in types_to_req :
temp_dois = req_zenodo(uga_perimeter, record_type)
## placer les DOI dans le buffer général qui ne peut contenir que des valeurs uniques
[all_dois.add(doi) for doi in temp_dois]
print("Zenodo nb of DOIs catched",
len(all_dois)
)
## ____z____ exporter la liste de DOI au format txt ## ____z____ exporter la liste de DOI au format txt
with open("zenodo-dois.txt", 'w') as f : with open("zenodo-dois.txt", 'w') as f :
[f.write(f"{line}\n") for line in output_dois] [f.write(f"{line}\n") for line in all_dois]
...@@ -7,12 +7,13 @@ ...@@ -7,12 +7,13 @@
(so far) (so far)
| |Dataset numbers| | |Dataset numbers| UGA perimter |
|-----------|---------------| |-----------|---------------|---------------|
|RDG |51 | |RDG |51 |contact, auteurs, producteur et contributeurs avec "UGA" OR "Grenoble" |
|DataCite |294| |DataCite |294| creator avec ROR |
|Zenodo | | |Zenodo |1027|creator et contributor avec "grenoble" |
|Nakala |26 | |Nakala |26 |UGA user identifiers |
|BSO via HAL|32 |NA |
|... | | |... | |
......
This diff is collapsed.
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment