Usando Middleware para ignorar duplicados en Scrapy

Soy principiante en Python, y estoy usando Scrapy para un proyecto web de personal.

Utilizo Scrapy para extraer datos de varios sitios web repetidamente, por lo que debo verificar cada rastreo si un enlace ya está en la base de datos antes de agregarlo. Hice esto en una clase de piplines.py:

class DuplicatesPipline(object): def process_item(self, item, spider): if memc2.get(item['link']) is None: return item else: raise DropItem('Duplication %s', item['link']) 

Pero escuché que usar Middleware es mejor para esta tarea.

Me pareció un poco difícil usar Middleware en Scrapy, ¿alguien puede redirigirme a un buen tutorial?

Los consejos son bienvenidos.

Gracias,

Editar:

Estoy usando MySql y memcache.

Aquí está mi bash según la respuesta de @Talvalin:

 # -*- coding: utf-8 -*- from scrapy.exceptions import IgnoreRequest import MySQLdb as mdb import memcache connexion = mdb.connect('localhost','dev','passe','mydb') memc2 = memcache.Client(['127.0.0.1:11211'], debug=1) class IgnoreDuplicates(): def __init__(self): #clear memcache object memc2.flush_all() #update memc2 with connexion: cur = connexion.cursor() cur.execute('SELECT link, title FROM items') for item in cur.fetchall(): memc2.set(item[0], item[1]) def precess_request(self, request, spider): #if the url is not in memc2 keys, it returns None. if memc2.get(request.url) is None: return None else: raise IgnoreRequest() 

 DOWNLOADER_MIDDLEWARES = { 'myproject.middlewares.IgnoreDuplicates': 543, 'scrapy.contrib.downloadermiddleware.httpproxy.HttpProxyMiddleware': 500, } 

Pero parece que el método process_request se ignora cuando se rastrea.

Gracias por adelantado,

Aquí hay un ejemplo de código de middleware que carga las urls de una tabla sqlite3 (Id INT, url TEXT) en un conjunto, y luego verifica las urls de solicitud contra el conjunto para determinar si la url debe ignorarse o no. Debería ser razonablemente sencillo adaptar este código para usar MySQL y memcache, pero hágame saber si tiene algún problema o pregunta. 🙂

 import sqlite3 from scrapy.exceptions import IgnoreRequest class IgnoreDuplicates(): def __init__(self): self.crawled_urls = set() with sqlite3.connect('C:\dev\scrapy.db') as conn: cur = conn.cursor() cur.execute("""SELECT url FROM CrawledURLs""") self.crawled_urls.update(x[0] for x in cur.fetchall()) print self.crawled_urls def process_request(self, request, spider): if request.url in self.crawled_urls: raise IgnoreRequest() else: return None 

En el caso de que tenga problemas de importación como yo y esté a punto de perforar su monitor, el código anterior estaba en un archivo middlewares.py que se colocó en la carpeta del proyecto de nivel superior con la siguiente configuración DOWNLOADER_MIDDLEWARES

 DOWNLOADER_MIDDLEWARES = { 'myproject.middlewares.IgnoreDuplicates': 543, 'scrapy.contrib.downloadermiddleware.httpproxy.HttpProxyMiddleware': 500, }