Search code examples
pythonemailscrapypipeline

How to send mail with scraped data?


How to send email with specific scraped data after spider ends in Scrapy.

I'm trying to send some item data with multiple lines after the end of a spider, but i'm only receiving one line. I think i have to do some iteration but i can't make it work.

items.py

import scrapy

class ScrapeadorItem(scrapy.Item):
    Nro = scrapy.Field()
    SITUACION = scrapy.Field()

pipelines.py

from itemadapter import ItemAdapter
from scrapy.mail import MailSender

mailer = MailSender(mailfrom="*@gmail.com", smtpuser="*@gmail.com", smtphost="smtp.gmail.com", smtpport=587, smtppass="*")

class ScrapeadorPipeline:
    
    def process_item(self, item, spider):
        
        adapter = ItemAdapter(item)
        contenidomail = ""            
        if adapter.get('SITUACION') == "DESCARGADO":
            contenidomail = contenidomail + "\n" + str(adapter.get('Nro')) + " " + adapter.get('SITUACION') + "\n"
            self.contenidomail = contenidomail
    
        return item
    
    def close_spider(self, item):
        mailer.send(to=["*@msn.com"], subject="Reporte", body=self.contenidomail)

Solution

  • You should concatenate each item to self.contenidomail, not the local contenidomail variable (which you just initialized to be empty).

    class ScrapeadorPipeline:
    
        def __init__(self):
            self.contenidomail = ''
        
        def process_item(self, item, spider): 
            adapter = ItemAdapter(item)
            if adapter.get('SITUACION') == "DESCARGADO":
                self.contenidomail += str(adapter.get('Nro')) + " " + adapter.get('SITUACION') + "\n"    
            return item
        
        def close_spider(self, item):
            mailer.send(to=["*@msn.com"], subject="Reporte", body=self.contenidomail)