[PYTHON] Comment séparer le code de traitement du pipeline par spider avec Scrapy

introduction

Si vous augmentez le nombre de cibles de scraping (fichiers spider) dans Scrapy, le code de traitement du pipeline augmentera dans le même fichier, ce qui entraînera une mauvaise visibilité et des problèmes de maintenabilité. Je suis venu. En fin de compte, j'ai pu séparer le fichier d'implémentation du pipeline pour chaque spider, je vais donc vous présenter la méthode.

Méthode cible provisoire

Il existe un fichier de paramètres appelé setting.py dans le projet Scrapy. Même s'il y a un élément de réglage de ʻITEM_PIPELINES dans setting.py` et qu'il y a plusieurs araignées Au départ, je pensais que je n'avais pas d'autre choix que d'agréger le traitement du pipeline en classes dans le fichier d'implémentation unique spécifié ici.

setting.py


ITEM_PIPELINES = {
    'example_project.pipelines.DBPipeline': 100,
}

--Modèle pour le traitement et la ramification avec le nom de siper

J'étais en route avec le nom de l'araignée comme clé, mais il est clair que la visibilité du code s'aggrave à mesure que l'araignée augmente.

pipelines.py


class DBPipeline(object):
    def process_item(self, item, spider):
        if spider.name in ['example_spider']:
            # example_Traitement du pipeline Spider
        
        if spider.name in ['example_spider2']:
            # example_Traitement du pipeline Spider2

Conclusion

Si vous définissez l'élément ʻITEM_PIPELINESdanscustom_settings` pour chaque araignée comme indiqué ci-dessous, Le fichier d'implémentation pour le traitement du pipeline peut être individualisé. [^ 1]

example_spider.py


class ExampleSpider(scrapy.Spider):
    custom_settings = {
        'ITEM_PIPELINES': {
            'example_project.example_pipelines.ValidationPipeline': 100,
            'example_project.example_pipelines.DBPipeline': 200,
        }
    }

example_spider2.py


class ExampleSpider2(scrapy.Spider):
    custom_settings = {
        'ITEM_PIPELINES': {
            'example_project.example_pipelines2.DBPipeline': 100,
        }
    }

Routé individuellement vers le traitement de pipeline suivant comme défini dans custom_settings.

example_pipelines.py


class ValidationPipeline(object):
    def process_item(self, item: scrapy.Item, spider: scrapy.Spider):
        # example_spider.Traité lors de l'exécution de py

class DBPipeline(object):
    def process_item(self, item: scrapy.Item, spider: scrapy.Spider):
        # example_spider.Traité lors de l'exécution de py

example_pipelines2.py


class DBPipeline(object):
    def process_item(self, item: scrapy.Item, spider: scrapy.Spider):
        # example_spider2.Traité lors de l'exécution de py

Avec ce qui précède, même si le nombre de cibles de grattage (spiders) augmente, la visibilité du code de traitement du pipeline peut être maintenue en bon état.

[^ 1]: De même, il semble que vous puissiez personnaliser d'autres éléments tels que SPIDER_MIDDLEWARES.

Recommended Posts

Comment séparer le code de traitement du pipeline par spider avec Scrapy
Comment transmettre les paramètres au pipeline d'articles dans Scrapy
Comment exécuter du code TensorFlow 1.0 en 2.0
Comment utiliser les fonctions dans des fichiers séparés version Perl et version Python
Comment lire des fichiers CSV avec Pandas
Résumé de la façon d'importer des fichiers dans Python 3
Comment créer une sortie JSON Scintillante en japonais
Comment vérifier / extraire des fichiers dans un package RPM
Comment obtenir les fichiers dans le dossier [Python]
[Traitement du langage naturel / PNL] Comment effectuer facilement une traduction arrière par traduction automatique avec Python
Comment mesurer le temps de traitement avec Python ou Java
Comment utiliser des variables dans les fichiers de définition d'unité systemd
Comment ajouter des numéros de page à un fichier PDF (en Python)
Comment lister les nombres en les divisant en n
Comment télécharger des fichiers dans la vue de classe générique Django
Comment référencer des fichiers statiques dans un projet Django
Comparez comment écrire le traitement des listes par langue
Comment utiliser VS Code dans un environnement Venv avec Windows
Comment réparer les multi-colonnes générées par le groupe Pandas en les traitant en single
Résumé de l'écriture des fichiers .proto utilisés dans gRPC
Comment rechercher par chaîne pour utiliser les json_contains de mysql dans SQL Alchemy
Comment séparer les chaînes avec ','
Ecrire des tests Spider dans Scrapy
Comment développer en Python
Comment afficher une colonne de fichiers spécifiée sous Linux (awk)
[Pour les débutants] Comment implémenter l'exemple de code O'reilly dans Google Colab
Comment implémenter du code Java en arrière-plan de Red Hat (Linux ONE)
Comment transformer une chaîne en tableau ou un tableau en chaîne en Python
Comment combiner tous les CSV d'un dossier en un seul CSV
[FSL] Comment décoller Atlas un par un et les séparer
Comment déboguer un programme Python en se connectant à distance à un conteneur Docker dans un environnement WSL2 avec VS Code
Tutoriel "Cython" pour rendre Python explosif: Comment analyser la classe Enum définie en code C ++ vers Enum en Python.