Sono principiante in Python e sto utilizzando Scrapy per un progetto Web personale.Utilizzo del middleware per ignorare i duplicati in Scrapy
Uso Scrapy per estrarre ripetutamente i dati da diversi siti Web, quindi è necessario controllare ogni scansione se un collegamento è già presente nel database prima di aggiungerlo. Ho fatto questo in una classe 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'])
Ma ho sentito che l'utilizzo di Middleware è meglio per questo compito.
Ho trovato un po 'difficile usare Middleware in Scrapy, qualcuno può per piacere reindirizzarmi a un buon tutorial.
i consigli sono benvenuti.
Grazie,
Modifica:
sto usando MySql e memcache.
Qui è la mia prova in base alle @Talvalin risposta:
# -*- 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, }
ma sembra che il metodo process_request viene ignorato durante la scansione.
Grazie in anticipo,
in sostanza, è necessario creare una classe middleware downloader che implementa un metodo 'process_response' e carica i tuoi URL scansione e controlla l'URL della risposta in entrata per vedere se v'è una corrispondenza. http://doc.scrapy.org/en/latest/topics/downloader-middleware.html – Talvalin
Che DB stai usando? – Talvalin
Sto usando MySql e memcache. Grazie per la risposta. – elhoucine