'daki yinelemeleri yok saymak için Middleware'i kullanıyorum Python'da başlangıç yapıyorum ve personel web projesi için Scrapy kullanıyorum.Scrub
Birkaç web sitesindeki verileri art arda ayıklamak için Scrapy'i kullanıyorum, bu nedenle eklemeye başlamadan önce bir veritabanında zaten bir bağlantı varsa her taramaya bakmam gerekiyor. Bir piplines.py sınıfta yaptılar:
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'])
Ama Middleware'i kullanarak bu görev için daha iyi olduğunu duydum.
Scrapy'de Middleware'i kullanmak biraz zor buldu, lütfen herkes beni iyi bir eğiticiye yönlendirebilir.
tavsiyeleri kabul edilir.
sayesinde
Düzenleme: MySql ve memcache kullanıyorum
.
# -*- 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, }
Ama tararken process_request yöntemi göz ardı edilir gibi görünüyor:
İşte @Talvalin cevaba göre benim denemek değer. peşin
sayesinde
ayar Esasen, bir 'process_response' yöntemi uygular ve taranan URL'leri yükler ve bir eşleşme olup olmadığını görmek için gelen yanıtın URL'sini kontrol eden bir indirici katman sınıf oluşturmak gerekir. http://doc.scrapy.org/en/latest/topics/downloader-middleware.html – Talvalin
Bu arada ne DB kullanıyorsunuz? – Talvalin
MySql ve memcache kullanıyorum. Yanıt için teşekkürler. – elhoucine