Scrapy爬虫结束后如何发送含指定爬取数据的邮件?
解决Scrapy爬虫结束后发送多行Item数据邮件的问题
你的问题出在每次处理Item时都覆盖了邮件内容,没有累加,同时close_spider方法的参数也写错了(应该是spider而非item)。以下是修正后的实现:
修正后的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 __init__(self): # 初始化邮件内容为空字符串,用于累加符合条件的Item数据 self.contenidomail = "" def process_item(self, item, spider): adapter = ItemAdapter(item) if adapter.get('SITUACION') == "DESCARGADO": # 追加当前Item的内容到邮件字符串,而非覆盖 self.contenidomail += f"\n{adapter.get('Nro')} {adapter.get('SITUACION')}\n" return item def close_spider(self, spider): # 爬虫结束时发送邮件,使用累加好的内容 mailer.send(to=["*@msn.com"], subject="Reporte", body=self.contenidomail)
关键修改点
- 在
__init__方法中初始化self.contenidomail,避免每次处理Item时重置为空 - 使用
+=运算符追加内容,而不是直接赋值覆盖 - 修正
close_spider的参数为spider(原代码写的item是错误的,会导致运行报错)
这样处理后,所有符合SITUACION == "DESCARGADO"条件的Item数据都会被累加到邮件内容里,爬虫结束时就能收到包含所有目标数据的多行邮件了。
内容的提问来源于stack exchange,提问作者Harker
相关产品推荐
相关产品推荐

