Używam usługi Scrapy w celu przeszukiwania kilku witryn internetowych, które mogą udostępniać nadmiarowe informacje.Złomowanie - Cicho upuszczanie elementu
Za każdą stronę, którą skrobię, przechowuję URL strony, jej tytuł i kod HTML, w mongoDB. Chcę uniknąć duplikowania w bazie danych, dlatego też wdrażam potok w celu sprawdzenia, czy podobny element jest już przechowywany. W takim przypadku podniosę wyjątek DropItem
.
Mój problem polega na tym, że za każdym razem, gdy upuszczam element przez wyjątek, DropItem
, Scrapy wyświetli całą zawartość elementu w log (stdout lub plik). Gdy rozpakowuję cały kod HTML każdej skrobanej strony, w przypadku upuszczenia cały kod HTML zostanie wyświetlony w dzienniku.
Jak mogę po cichu upuścić przedmiot bez wyświetlania jego zawartości?
Dziękuję za poświęcony czas!
class DatabaseStorage(object):
""" Pipeline in charge of database storage.
The 'whole' item (with HTML and text) will be stored in mongoDB.
"""
def __init__(self):
self.mongo = MongoConnector().collection
def process_item(self, item, spider):
""" Method in charge of item valdation and processing. """
if item['html'] and item['title'] and item['url']:
# insert item in mongo if not already present
if self.mongo.find_one({'title': item['title']}):
raise DropItem('Item already in db')
else:
self.mongo.insert(dict(item))
log.msg("Item %s scraped" % item['title'],
level=log.INFO, spider=spider)
else:
raise DropItem('Missing information on item %s' % (
'scraped from ' + item.get('url')
or item.get('title')))
return item
gdzie to się dzieje? Middlewares? Rurociągi? – Xodarap777
@ Xodarap777, Myślę, że plik 'middlewares.py' jest bardziej odpowiedni. Możesz także utworzyć nowy plik, taki jak 'logformatter.py'. Kod z tej odpowiedzi oferuje umieszczenie kodu w pliku z pająkiem. ** Uwaga **: ten kod jest przestarzały, ale odpowiedź @mirosval poniżej zaktualizowała działającą wersję. – kupgov