11
votes

Quelqu'un a-t-il exemple de code pour un pipeline SQLITE en skérapie?

Je cherche un exemple de code d'un pipeline SQLite en skérapie. Je sais qu'il n'y a pas de soutien intégré pour cela, mais je suis sûr que cela a été fait. Seul le code actuel peut m'aider, car je ne sais que suffisamment de python et de skérapie pour compléter ma tâche très limitée et avoir besoin du code comme point de départ.


3 commentaires

Ne sèche pas, qui fonctionne de manière asynchrone, nécessite un magasin de données non bloquant? Dans quel cas SQLite ne fonctionnerait pas?


Il semble que SQLite3 soit assez rapide et suffisamment intelligent pour gérer la concurrence (jusqu'à un point). voir ici


Il aurait été formidable de voir une solution utilisant APSW , car ceux ci-dessous ne sont pas très transparents et tout à fait obsolète.


5 Réponses :


3
votes

Si vous vous sentez à l'aise avec Adbapi de Twisted, vous pouvez prendre comme point de départ ce pipeline mysql: http://github.com/darkrho/scrady-googledir-mysql/blob/master/googledir/pipelines.py

et utilisez cette ligne à __ init__ : xxx


1 commentaires

Si vous utilisez SQLite3, soyez conscient des exigences de threading nécessitant des objets SQLite d'être utilisés dans le même thread que la création



15
votes

J'ai fait quelque chose comme ceci:

#
# Author: Jay Vaughan
#
# Pipelines for processing items returned from a scrape.
# Dont forget to add pipeline to the ITEM_PIPELINES setting
# See: http://doc.scrapy.org/topics/item-pipeline.html
#
from scrapy import log
from pysqlite2 import dbapi2 as sqlite

# This pipeline takes the Item and stuffs it into scrapedata.db
class scrapeDatasqLitePipeline(object):
    def __init__(self):
        # Possible we should be doing this in spider_open instead, but okay
        self.connection = sqlite.connect('./scrapedata.db')
        self.cursor = self.connection.cursor()
        self.cursor.execute('CREATE TABLE IF NOT EXISTS myscrapedata ' \
                    '(id INTEGER PRIMARY KEY, url VARCHAR(80), desc VARCHAR(80))')

    # Take the item and put it in database - do not allow duplicates
    def process_item(self, item, spider):
        self.cursor.execute("select * from myscrapedata where url=?", item['url'])
        result = self.cursor.fetchone()
        if result:
            log.msg("Item already in database: %s" % item, level=log.DEBUG)
        else:
            self.cursor.execute(
                "insert into myscrapedata (url, desc) values (?, ?)",
                    (item['url'][0], item['desc'][0])

            self.connection.commit()

            log.msg("Item stored : " % item, level=log.DEBUG)
        return item

    def handle_error(self, e):
        log.err(e)


1 commentaires

Un support de fermeture ")" est manquant après (élément ["URL '] [0], élément [" desc'] [0]) . Il devrait être (élément ['URL'] [0], élément ['desc'] [0]))



2
votes

Pour quiconque tente de résoudre un problème similaire, je viens de rencontrer un bel article SQLite Exproter pour SQLite: https://github.com/rockyz/scrapy-sqlite-item-exporter .

Après l'inclusion à vos paramètres de votre projet, vous pouvez l'utiliser avec: p>

scrapy crawl <spider name> -o sqlite.db -t sqlite


1 commentaires

Cela ne fonctionne pas, et il semble que crawl soit également obsolète.



9
votes

Voici un pipeline SQLite avec SQLALCHÉMY. Avec SQLalchemy, vous pouvez facilement modifier votre base de données si nécessaire.

in Params.py code> Ajouter une configuration de la base de données P>

#items.py
import scrapy

class BookItem(scrapy.Item):
    title = scrapy.Field()
    author = scrapy.Field()
    publisher = scrapy.Field()
    scrape_date = scrapy.Field()


2 commentaires

En plus d'être plus flexible dans le DB utilisé, cet aspect sensiblement plus convolué à utiliser que l'utilisation de l'ancienne PYSQLite2 , comme décrit déjà par @ibisum. Sans parler de toute la pollution de l'espace Nom créée par tous les de x importer y etc.


J'aime mieux cette solution que la réponse choisie pour la complétude et la polyvalence. De plus, SQLALCHEMY facilite la gestion des connexions DB simples après la configuration initiale et utilise une approche orientée objet opposée aux chaînes de requête en forme de codage dur. Je n'ai que deux "critiques" de la réponse et ils ont juste des licenciements. checkfirst Vrai . Pour SQLite, piscineClass Nullpool



2
votes

Les éléments suivants doivent être compatibles avec: xxx

si vous souhaitez utiliser APSW , il suffit de remplacer SQLite comme indiqué dans les commentaires.

Si vous avez votre items.py ressemble à ceci: xxx

dans paramètres.py : xxx

dans pipelines.py : xxx

Vous pouvez ensuite vérifier votre DB de la ligne de commande avec: xxx


Avertissement:

parce qu'un différence dans comment Le items.py élément les touches sont commandées Lorsque obtenu via élément.Keys () ou en importation de votre classe d'articles directement via self.ikeys = newadsitem.fields.Keys () , vous trouverez que le premier cas est trié en fonction de l'ordre d'apparence (dans le fichier), tandis que dans le second cas, il est ordre alphabétiquement commandé. C'est très triste, puisqu'il crée des problèmes lorsque vous essayez de créer le dB Tables Dynamiquement, avant d'avoir exécuté process_item () .


0 commentaires