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. P>
5 Réponses :
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__ code>: p>
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
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)
Un support de fermeture ")" est manquant après (élément ["URL '] [0], élément [" desc'] [0]) code>. Il devrait être
(élément ['URL'] [0], élément ['desc'] [0])) code>
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
Cela ne fonctionne pas, et il semble que crawl code> soit également obsolète.
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()
En plus d'être plus flexible dans le DB utilisé, cet aspect sensiblement plus convolué à utiliser que l'utilisation de l'ancienne PYSQLite2 i>, 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 code> 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 code> Vrai . Pour SQLite,
piscineClass code> Nullpool
Les éléments suivants doivent être compatibles avec: si vous souhaitez utiliser APSW , il suffit de remplacer SQLite comme indiqué dans les commentaires. P> Si vous avez votre dans dans Vous pouvez ensuite vérifier votre DB de la ligne de commande avec: p> Avertissement: strong> p> parce qu'un différence dans comment Le items.py code> strong> ressemble à ceci: p>
paramètres.py code> strong>: p>
pipelines.py code> strud>: p>
items.py code> élément les touches em> sont commandées
Lorsque obtenu via
élément.Keys () code> ou en importation de votre classe d'articles
directement via
self.ikeys = newadsitem.fields.Keys () code>, 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 em> 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 () code>. p>
blockQuote> p>
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.