2014-04-09 14 views
8

Jestem początkujący w Pythonie, a ja używam Scrapy do projektu internetowego personelu.Używanie oprogramowania pośredniego do ignorowania duplikatów w Scrapii

Używam Scrapy do wielokrotnego wyodrębniania danych z kilku stron internetowych, więc muszę sprawdzić każde przeszukiwanie, jeśli link jest już w bazie danych przed jej dodaniem. Zrobiłem to w klasie 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']) 

Ale słyszałem, że używanie Middleware jest lepsze dla tego zadania.

Znalazłem to trochę trudne w użyciu oprogramowania pośredniego w Scrapy, czy ktoś może przekierować mnie do dobrego samouczka.

porady są mile widziane.

Dzięki,

EDIT:

używam MySQL i memcache.

Oto moja próba według @Talvalin odpowiedź:

# -*- 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, } 

Ale wydaje się, że metoda process_request jest ignorowany podczas indeksowania.

Dzięki z góry,

+0

Zasadniczo trzeba utworzyć klasy middleware downloader, który implementuje metodę 'process_response' i ładuje zaindeksowanych adresów URL i sprawdza adres URL odpowiedzi przychodzącej, aby zobaczyć, czy jest mecz. http://doc.scrapy.org/en/latest/topics/downloader-middleware.html – Talvalin

+0

Jakiego DB używasz przy okazji? – Talvalin

+0

Używam MySql i memcache. Dzięki za odpowiedź. – elhoucine

Odpowiedz

8

Oto niektóre przykładowy kod middleware, który ładuje adresy z tabeli sqlite3 (Id INT, url TEXT) do zestawu, a następnie sprawdza adresy URL żądania wobec zestawu do określenia, czy adres URL powinien być ignorowane lub nie. Powinieneś rozsądnie przystosować ten kod do korzystania z MySQL i memcache, ale daj nam znać, jeśli masz jakieś problemy lub pytania. :)

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 

Z poza przypadkiem masz problemy importu jak ja i mają zamiar uderzyć monitora, powyższy kod był w middlewares.py pliku, który został umieszczony w folderze projektu najwyższego poziomu z następujących DOWNLOADER_MIDDLEWARES ustawienie

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

Witaj Talvalin, testowałem twoje rozwiązanie, ale wygląda na to, że Scrapy po prostu ignoruje metodę process_request podczas przeszukiwania, więc nie ignoruje duplikatów. Sprawdziłem dokumentację i znalazłem tylko takie metody, jak process_spider_input, process_spider_output .., ale nie process_request. Dzięki – elhoucine

+1

Po uruchomieniu spider, czy IgnoreDuplicates pojawiają się w dziennikach pod włączone middleware? – Talvalin

+0

Myślę, że tak. Uruchamiam program "scrapy crawl project_name" ---------- 2014-04-09 22: 36: 07 + 0100 [scrapy] INFO: Włączono oprogramowanie pośrednie downloader: HttpAuthMiddleware, DownloadTimeoutMiddleware, UserAgentMiddleware, RetryMiddleware, IgnoreDuplicates, DefaultHeadersMiddleware, MetaRefreshMiddleware, HttpCompressionMiddleware, RedirectMiddleware, CookiesMiddleware, ChunkedTransferMiddleware, DownloaderStats 9.04.2014 22: 36: 07 + 0100 [scrapy] Informacje: włączone middleware pająka: HttpErrorMiddleware, OffsiteMiddleware, RefererMiddleware, UrlLengthMiddleware, DepthMiddleware – elhoucine