Skip to content

[script médias] rejet par l'api si trop de requêtes #691

Description

@gildeluermoz

Lors de l'import de médias depuis wikimedia sur une instance avec 12500 taxons dans la synthese, une erreur survient.
HTTP Error 429: Please respect our robots policy[ https://w.wiki/EuL5](https://w.wiki/EuL5) and limit your requests to 2 RPS (7339550)
Tant que le script trouve des images à insérer tout va bien. Cette erreur se produit si un trop grand nombre de requêtes intervient dans un temp défini. Elle survient lorsque le script enchaîne rapidement plusieurs taxons sans media.

Une piste de solution serait de capturer l'erreur 429 et de mettre un sleep() avant de permettre au script de poursuivre.

Autres pistes que j'ai testé avec succès :
ajouter une table qui enregistre les taxons sans image :

CREATE TABLE taxonomie.t_no_wikimedias (
	cd_ref int4,
	meta_create_date timestamp DEFAULT now() NULL,
	CONSTRAINT pk_t_no_wikimedias PRIMARY KEY (cd_ref),
	CONSTRAINT fk_t_no_wikimedias_taxref FOREIGN KEY (cd_ref) REFERENCES taxonomie.taxref(cd_nom) ON UPDATE CASCADE
);

Puis dans le script, si pas de medias, on écrit dans cette table (version ancienne du script, à adapter pour la V2.3.x de taxhub)

sqlR = "INSERT INTO taxonomie.t_no_wikimedias (cd_ref) SELECT %s"

# Si images présentes pour le taxon
if results["results"]["bindings"]:
    ... on traite la récupération et l'écriture des url des images en base
# Si pas d'images
else:
                print(" -- INSERT NO MEDIA FOR %s" % cd_ref[0])
                try:
                    sql2 = sqlR % (
                        cd_ref[0]
                    )
                    sql2 = sql2 + " WHERE '" + str(cd_ref[0]) + "' NOT IN (SELECT cd_ref FROM taxonomie.t_no_wikimedias)"
                    if simulate is False:
                        cur.execute(sql2)
                        dbconnexion.commit()
                except Exception as e:
                    print("         ERROR")
                    print(e)
                    dbconnexion.rollback()
                    pass

Dans la sélection des cd_ref à traiter, on exclu les taxons déjà consultés qui n'ont pas d'images.

sql = """SELECT DISTINCT t.cd_ref 
    FROM gn_synthese.synthese s 
    JOIN taxonomie.taxref t USING(cd_nom) 
    WHERE t.cd_ref NOT IN (SELECT DISTINCT cd_ref FROM taxonomie.t_medias  WHERE url ilike '%/commons.wikimedia.org%')
    AND t.cd_ref NOT IN (SELECT cd_ref FROM taxonomie.t_no_wikimedias)
    ORDER BY t.cd_ref"""

On peut ainsi relancer le script, il ne sollicitera plus l'api pour les taxons sans images, ni les taxons ayant déjà des images de wikimedia.
Ceci devrait permettre de relancer le script périodiquement.
Il faudrait envisager une purge de la table taxonomie.t_no_wikimedias sur la base de meta_create_date afin de permettre la récupération de medias ajoutés récemment dans wikimedia.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions