Scrub

2014-04-09 9 views
8

'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

+0

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

+0

Bu arada ne DB kullanıyorsunuz? – Talvalin

+0

MySql ve memcache kullanıyorum. Yanıt için teşekkürler. – elhoucine

cevap

8

İşte yükleri bir dizi içine bir Sqlite3 masanın (Id INT, url TEXT) gelen URL'ler ve sonra çekleri url ardı edilen ya da gerekip gerekmediğini belirlemek için sette karşı URL'ler talep bazı örnek katman kod. Bu kodu MySQL ve memcache kullanacak şekilde uyarlamak oldukça mantıklı olmalıdır, ancak herhangi bir sorununuz veya sorunuz olursa lütfen bize bildirin. :), kod yukarıdaki DOWNLOADER_MIDDLEWARES aşağıdaki üst düzey proje klasörüne yerleştirilir bir middlewares.py dosyada benim gibi ithalat sorunları var ve monitör yumruk üzeresiniz şans kapalı On

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 

oldu

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

Merhaba Talvalin, çözümünüzü test ettim, ancak Scrapy sadece tarama yaparken process_request yöntemini Ignore (Gözden Geçir) gibi görünüyor, bu nedenle yinelenen bağlantılar göz ardı edilmiyor. Dokümantasyonu kontrol ettim ve process_spider_input, process_spider_output .. gibi yöntemler buldum, ancak process_request yok. Teşekkürler – elhoucine

+1

Örümcekinizi çalıştırdığınızda, IgnoreDuplicates etkinleştirilmiş orta sınıflar altındaki günlüklerde görünür mü? – Talvalin

+0

Sanırım evet. I "scrapy tarama PROJECT_NAME" ---------- çalıştırmak 2014/04/09 22: 36: Etkin indirici ara katman: +0100 [scrapy] BİLGİ 07 HttpAuthMiddleware, DownloadTimeoutMiddleware, UserAgentMiddleware, RetryMiddleware, IgnoreDuplicates, DefaultHeadersMiddleware, MetaRefreshMiddleware, HttpCompressionMiddleware, RedirectMiddleware, CookiesMiddleware, ChunkedTransferMiddleware, DownloaderStats 2014/04/09 22: 36: 07 + 0100 [scrapy] BİLGİ: Etkin örümcek ara katman: HttpErrorMiddleware, OffsiteMiddleware, RefererMiddleware, UrlLengthMiddleware, DepthMiddleware – elhoucine