为了使用 Scrapy 正确发送电子邮件,我忘记了什么

2024-02-22

我想使用 Scrapy 发送电子邮件

我看了 throw 官网,发现可以这样做:

from scrapy.mail import MailSender
        from scrapy.utils.project import get_project_settings
        settings = get_project_settings()
        mailer = MailSender(mailfrom ="[email protected] /cdn-cgi/l/email-protection", smtphost="smtp.gmail.com", smtpport=465, smtppass ="MySecretPassword")
        mailer.send(to=["Ano[email protected] /cdn-cgi/l/email-protection"], subject="Some subject", body="Some body")

代码没有抛出任何异常,但没有发送邮件。

我错过了什么?

Note1:

我需要使用 Scrapy 框架,而不是纯 Python

Note2:

我不想通过使用应用默认设置mailer = MailSender.from_settings(settings),因为正如您所看到的,我有自定义选项,并且我尝试使用默认设置,但结果相同,没有例外,但没有发送电子邮件。

我希望你能帮助我


您的代码会想到两件事。首先,邮件程序代码是否正在执行,其次,smtpuser应填充参数。

以下是使用 Scrapy 通过 Gmail 发送电子邮件的工作代码。这个答案有 4 个部分:电子邮件代码、完整示例、日志记录和 Gmail 配置。提供了完整的示例,因为需要协调一些事情才能使其正常工作。

电子邮件代码

要让 Scrapy 发送电子邮件,您可以在 Spider 类中添加以下内容(下一节中的完整示例)。这些示例让 Scrapy 在爬行完成后发送电子邮件。

有两块代码需要添加,第一块用于导入模块,第二块用于发送电子邮件。

导入模块:

from scrapy import signals
from scrapy.mail import MailSender

在你的 Spider 类定义中:

class MySpider(Spider):

    <SPIDER CODE>

    @classmethod
    def from_crawler(cls, crawler):
        spider = cls()
        crawler.signals.connect(spider.spider_closed, signals.spider_closed)
        return spider

    def spider_closed(self, spider):
        mailer = MailSender(mailfrom="[email protected] /cdn-cgi/l/email-protection",smtphost="smtp.gmail.com",smtpport=587,smtpuser="[email protected] /cdn-cgi/l/email-protection",smtppass="MySecretPassword")
        return mailer.send(to=["A[email protected] /cdn-cgi/l/email-protection"],subject="Some subject",body="Some body")

完整示例

综上所述,本示例使用位于以下位置的 dirbot 示例:

https://github.com/scrapy/dirbot https://github.com/scrapy/dirbot

只需要编辑一个文件:

./dirbot/spiders/dmoz.py

这是整个工作文件,其中导入位于顶部附近,电子邮件代码位于蜘蛛类的末尾:

from scrapy.spider import Spider
from scrapy.selector import Selector

from dirbot.items import Website

from scrapy import signals
from scrapy.mail import MailSender

class DmozSpider(Spider):
    name = "dmoz"
    allowed_domains = ["dmoz.org"]
    start_urls = [
        "http://www.dmoz.org/Computers/Programming/Languages/Python/Books/",
        "http://www.dmoz.org/Computers/Programming/Languages/Python/Resources/",
    ]

    def parse(self, response):
        """
        The lines below is a spider contract. For more info see:
        http://doc.scrapy.org/en/latest/topics/contracts.html

        @url http://www.dmoz.org/Computers/Programming/Languages/Python/Resources/
        @scrapes name
        """
        sel = Selector(response)
        sites = sel.xpath('//ul[@class="directory-url"]/li')
        items = []

        for site in sites:
            item = Website()
            item['name'] = site.xpath('a/text()').extract()
            item['url'] = site.xpath('a/@href').extract()
            item['description'] = site.xpath('text()').re('-\s[^\n]*\\r')
            items.append(item)

        return items

    @classmethod
    def from_crawler(cls, crawler):
        spider = cls()
        crawler.signals.connect(spider.spider_closed, signals.spider_closed)
        return spider

    def spider_closed(self, spider):
        mailer = MailSender(mailfrom="[email protected] /cdn-cgi/l/email-protection",smtphost="smtp.gmail.com",smtpport=587,smtpuser="[email protected] /cdn-cgi/l/email-protection",smtppass="MySecretPassword")
        return mailer.send(to=["A[email protected] /cdn-cgi/l/email-protection"],subject="Some subject",body="Some body")

更新此文件后,从项目目录运行标准爬网命令来爬网并发送电子邮件:

$ scrapy crawl dmoz

Logging

通过返回的输出mailer.send方法中的spider_closed方法,Scrapy 会自动将结果添加到其日志中。以下是成功和失败的例子:

成功日志消息:

2015-03-22 23:24:30-0000 [scrapy] INFO: Mail sent OK: To=['A[email protected] /cdn-cgi/l/email-protection'] Cc=None Subject="Some subject" Attachs=0

错误日志消息 - 无法连接:

2015-03-22 23:39:45-0000 [scrapy] ERROR: Unable to send mail: To=['[email protected] /cdn-cgi/l/email-protection'] Cc=None Subject="Some subject" Attachs=0- Unable to connect to server.

错误日志消息 - 身份验证失败:

2015-03-22 23:38:29-0000 [scrapy] ERROR: Unable to send mail: To=['[email protected] /cdn-cgi/l/email-protection'] Cc=None Subject="Some subject" Attachs=0- 535 5.7.8 Username and Password not accepted. Learn more at 5.7.8 http://support.google.com/mail/bin/answer.py?answer=14257 sb4sm6116233pbb.5 - gsmtp

Gmail 配置

要将 Gmail 配置为以这种方式接受电子邮件,您需要启用“访问不太安全的应用程序”,您可以在登录帐户时通过以下 URL 执行此操作:

https://www.google.com/settings/security/lesssecureapps
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为了使用 Scrapy 正确发送电子邮件,我忘记了什么 的相关文章

随机推荐

  • C# 中析构函数有必要吗?

    我有一个担忧 我是计算机科学专业的一年级学生 通常我在课堂上很好奇 但老师并不总是有答案 或者并不总是知道答案 C 中析构函数有必要吗 我的意思是 如果我必须像通常对构造函数那样实现析构函数方法 这是一个好的做法还是我可以避免它并且垃圾收集
  • macOS 钥匙串 ACL 如何确定哪些应用程序具有访问权限?

    当应用程序将项目保存到钥匙串时 macOS 会将该应用程序添加到访问控制列表中 以便您的应用程序稍后可以访问它 如果您尝试从其他应用程序访问该项目 macOS 将显示系统提示 询问用户是否允许访问 这是有记录的here https deve
  • sockaddr_in 未声明的标识符

    我正在遵循 beej 的网络指南 进展非常顺利 因为我对一切都很了解 而且他解释得很好 然而 当我想测试他向我展示的一些很酷的东西时 这是行不通的 我不确定 sockaddr in 到底在哪里声明 但也许这里有人会帮助我 这是我到目前为止所
  • Office 文档提示登录匿名 SharePoint 网站

    我有一个配置为匿名访问的 MOSS 07 站点 该站点内有一个文档库 也启用了匿名访问 当匿名用户单击该库中的 PDF 文件时 他或她可以毫无问题地阅读或下载该文件 当用户单击 Office 文档时 系统会提示他或她登录框 用户可以在不登录
  • 内联 MSIL/CIL

    我创建了以下简单方法 public static void Main Console WriteLine Hello world Console ReadKey true 然后我使用ILSpy获取MSIL代码 method public h
  • System.InvalidOperationException:无法解析类型依赖注入.net core web api的服务

    System InvalidOperationException 尝试激活 Pwc EMSWebapi UserManagementController 时无法解析类型 Pwc EMSWebapi IUserManagementServic
  • 如何从一组用户中提取电子邮件

    If I do User all pluck email 然后就可以正常工作了 但如果我这样做 arr Array new arr User all and then arr pluck email 这引发了以下错误 undefined m
  • 重写构造函数类

    下面是我的代码 我不明白这是什么错误 有谁可以指导一下吗 class State static String country static String capital State Constructor country America s
  • 连接两个向量同时转换一个向量的元素的最佳方法是什么?

    假设我有 std vector
  • wget:无法解析主机地址“github.com”

    我正在使用 Redhat UBI 映像构建 dockerfile 当我构建映像时 我得到 wget 无法解析主机地址 github com 我尝试添加一个不以 GitHub 开头的不同 URL 但该 URL 有效 不确定是什么问题 以下是我
  • NSFetchedResultsController 在 objectAtIndexPath 上崩溃?

    我在尝试访问以下对象时发生崩溃NSFetchedResultsController 2013 11 10 15 15 06 568 Social 11503 70b CoreData error Serious application er
  • 在 C#.NET 中动态转换为类型

    替代标题 在运行时动态转换为类型 我想将对象转换为将在运行时分配的类型 例如 假设我有一个分配字符串值的函数 来自TextBox or Dropdownlist to an Object Property 我如何将值转换为正确的类型 例如
  • 如何设置包装给定函数的函数的类型

    我正在做一个简单的memoize函数 它的作用是接受一个函数 并在缓存返回结果的地方做一些魔法 但基本上返回函数的类型memoize与给定的完全相同 但我遇到了错误 我不知道如何修复 当使用该函数并忽略我遇到的错误时 这些类型可以工作 我已
  • 用户代理字符串可以有多大?

    如果您要将用户代理存储在数据库中 您会容纳多大的数据库 我找到了这个技术网文章 http technet microsoft com en us library bb496341 aspx建议将 UA 保持在 200 以下 HTTP 规范中
  • PHP base64_decode C# 等效项

    我正在尝试模仿执行以下操作的 php 脚本 用 号替换 GET 变量的每个空格 var preg replace s GET var 解码为 Base64 base64 decode var 首先我添加了一个执行 Base64 解码的方法
  • 无符号整数取负值[重复]

    这个问题在这里已经有答案了 有人可以解释为什么 unsigned int 取负值吗 一个unsigned int应该只取正值 From 维基百科 http en wikipedia org wiki Integer 28computer s
  • 更改 nginx 工作进程运行的用户(Ubuntu 12.04)

    我在 Ubuntu 12 04 上手动安装了 nginx 当我跑的时候 configure我使用了以下选项 configure user www data group www data with http ssl module with h
  • 如何将此 csv 数据转换为条形图?

    旅游 旅游名称 开始 开始时的可用预订 结束 剩余预订量 csv 文件列 ID Tour Start End 12345 Italy 100 80 13579 China 50 30 24680 France 50 30 到目前为止我有这个
  • Ruby——寻找某种“Regexp unescape”方法

    我有一堆带有特殊转义代码的字符串 我想存储未转义的代码 例如 解释器显示 014 000 016smoothing 011mean 022color 011zero 016 但我希望它显示 检查时 为 014 000 016smoothin
  • 为了使用 Scrapy 正确发送电子邮件,我忘记了什么

    我想使用 Scrapy 发送电子邮件 我看了 throw 官网 发现可以这样做 from scrapy mail import MailSender from scrapy utils project import get project