2012-07-10 14 views
5

código pipeline.pyenvío de correo electrónico después de raspadura en scrapy

class Examplepipeline(object): 

def __init__(self): 
    dispatcher.connect(self.spider_opened, signal=signals.spider_opened) 
    dispatcher.connect(self.spider_closed, signal=signals.spider_closed) 

def spider_opened(self, spider): 
    log.msg("opened spider %s at time %s" % (spider.name,datetime.now().strftime('%H-%M-%S'))) 

def process_item(self, item, spider): 
     log.msg("Processsing item " + item['title'], level=log.DEBUG) 


def spider_closed(self, spider): 
    log.msg("closed spider %s at %s" % (spider.name,datetime.now().strftime('%H-%M-%S'))) 

En el código anterior araña, se mostrará la hora de inicio y hora de finalización de la araña, pero ahora después de la finalización de la araña, quiero recibir un mensaje de correo electrónico que dice "Scraping ha sido completado" de scrapy. Es posible hacer esto. Si es posible, podemos escribir ese código en el método spider_closed, ¿alguien puede compartir algún código de ejemplo sobre cómo hacerlo?

Respuesta

11

¿Has mirado en la documentación:

http://doc.scrapy.org/en/latest/topics/email.html

El uso básico de la documentación

from scrapy.mail import MailSender 

mailer = MailSender() 
mailer.send(to=["[email protected]"], subject="Some subject", body="Some body", cc=["[email protected]"]) 

También se podría implementar algo personalizado en su propia. Por ejemplo, si desea utilizar Gmail:

def send_mail(self, message, title): 
    print "Sending mail..........." 
    import smtplib 
    from email.MIMEMultipart import MIMEMultipart 
    from email.MIMEText import MIMEText 
    gmailUser = '[email protected]' 
    gmailPassword = 'password' 
    recipient = 'mail_to_send_to' 

    msg = MIMEMultipart() 
    msg['From'] = gmailUser 
    msg['To'] = recipient 
    msg['Subject'] = title 
    msg.attach(MIMEText(message)) 

    mailServer = smtplib.SMTP('smtp.gmail.com', 587) 
    mailServer.ehlo() 
    mailServer.starttls() 
    mailServer.ehlo() 
    mailServer.login(gmailUser, gmailPassword) 
    mailServer.sendmail(gmailUser, recipient, msg.as_string()) 
    mailServer.close() 
    print "Mail sent" 

y simplemente llamar así:

send_mail("some message", "Scraper Report") 
+0

Gracias por eso es muy útil respuesta –

+0

Hola, podría alguien decirme dónde poner en estos códigos? pipeline.py o el archivo sider principal. No tengo ides.Gracias – user2492364

+0

@ user2492364 no hay una respuesta específica, depende de la lógica de su negocio. Por ejemplo, si desea enviar un informe, podría hacerlo en la tubería, pero preferiría captar la señal de cierre de araña y luego enviar el correo –

1

Mis disculpas por la auto-promoción, pero recientemente he creado yagmail: un paquete que se esfuerza por hacer más fácil para enviar mensajes de gmail (texto, html, imagen, etc.).

Este es el código que había necesidad de conectar: ​​

import yagmail 
yag = yagmail.SMTP('[email protected]', 'password') 

continuación, utiliza esta opción para enviar mensajes de correo electrónico:

yag.send('mail_to_send_to', 'Scraper Report', 'some message') 

Lo bueno es que usted no tiene que mantener la configuración alrededor como texto, pero puede confiar en el llavero del sistema operativo para tener una sensación real de seguridad y comodidad.

Podría ser incluso un chiste (que se cierra automáticamente):

SMTP('mail_you_send_from').send('mail_to_send_to', 'Scraper Report', 'some message') 
Cuestiones relacionadas