[Scrapy教学9]一定要懂的Scrapy框架结合Gmail寄送爬取资料附件秘诀

请点击输入图片描述(最多18字)

在Python网页爬虫搜集资料的过程中,除了能够将资料存入资料库或汇入成档案外,另一个最常应用的场景就是“消息通知”,也就是在利用Python网页爬虫搜集到所需的资料后,透过讯息通知的管道来推送资料结果。

举例来说,[Python爬虫]Python爬虫结合LINE Notify打造自动化讯息通知服务文章整合了LINE Notify服务,来通知使用者Python网页爬虫获得的降价消息,而此则要来和大家分享另一个消息通知管道的结合,也就是电子邮件。

本文延续[python]详解Scrapy框架爬取分页资料的实用技巧–第八篇文章,将爬取的结果存入CSV档案后,透过Gmail附件邮寄给使用者。在开始之前,大家可以先参考[Python实战应用]Python寄送Gmail电子邮件实战教学文章的第二节步骤,获取Gmail的应用程序密码,刹车能够利用它的SMTP(简易邮件传输协定)来发送邮件。本文的重点包含:

Scrapy网页爬虫框架流程

Scrapy网页爬虫专案回顾

Scrapy MailSender结合Gmail发送邮件

一,Scrapy网页爬虫框架流程

首先,来复习一下在「python」快速入门Scrapy框架的5个执行模组及架构——第一篇文章中所分享的Scrapy网页爬虫框架流程,如下图:

请点击输入图片描述(最多18字)

从上图可以知道,想要将Scrapy网页爬虫取得的资料进行后续处理,就需要在SPIDERS爬虫程式取得回应结果(6)后,把爬取的资料暂存的ITEMS资料模型,传递给ITEM PIPELINE资料模型管道(7,8),来自订后续资料处理的逻辑。

所以,可想而知,如果想要将爬取的结果汇入成CSV档案,透过Gmail的附件寄出,就是要写在ITEM PIPELINE资料模型管道中,也就是Scrapy专案的pipelines.py档案。

二,Scrapy网页爬虫专案回顾

接下来,回顾一下目前Scrapy专案的三个部分,如下:

「SPIDERS爬虫程式(inside.py)」

进口沙皮
 
 
类InsideSpider (scrapy 。蜘蛛): 
    名称= “内部” 
    allowed_domains = [ 'www.inside.com.tw' ] 
    start_urls = [ 'https://www.inside.com.tw/tag/ai' ] 
    count = 1 #执行次数   
 
    def parse (self ,response ):
 
        产量从自我。刮(回应)#爬取网页内容    
 
        #定位「下一页」按钮元素
        next_page_url =响应。xpath (
            “ // a [@ class ='pagination_item pagination_item-next'] / @ href” )
 
        如果next_page_url :
 
            url = next_page_url 。get ()#取得下一页的网址  
 
            InsideSpider 。计数+ = 1 
 
            如果InsideSpider 。计数<= 3 :  
                产量scrapy 。请求(URL ,回调=自我。解析)#发送请求  
 
    def scrape (self ,response ):
 
        #爬取文章标题
        post_titles =响应。xpath (
            “ // h3 [@ class ='post_title'] / a [@ class ='js-auto_break_title'] / text()”
        )。getall ()
 
        #爬取发布日期
        post_dates =响应。xpath (
            “ // li [@ class ='post_date'] / span / text()”
        )。getall ()
 
        #爬取作者
        post_authors =回应。xpath (
            “ // span [@ class ='post_author'] / a / text()”
        )。getall ()
 
        对于数据在拉链(post_titles ,post_dates ,post_authors ):
            NewsScraperItem = {  
                “ post_title” :数据[ 0 ],
                “ post_date” :数据[ 1 ],
                “ post_author” :数据[ 2 ]
            }
 
            产生NewsScraperItem 

以上为Scrapy网页爬虫爬取INSIDE硬塞的网路趋势观察网站-AI新闻前3页的文章资讯,其中的实作说明可以参考[Scrapy教学8]详解Scrapy框架爬取分页资料的使用技巧文章。

「ITEMS资料模型(items.py)」

进口沙皮
 
 
类NewsScraperItem (scrapy 。项): 
    #在这里为您的商品定义字段,例如:
    #名称= scrapy.Field()
    post_title = scrapy 。字段()#文章标题  
    post_date = scrapy 。栏位()#发布日期  
    post_author = scrapy 。字段()#文章作者  

包含了后续要汇出到CSV档案的“文章标题”, “发布日期”及“文章作者”三个栏位。

「ITEM PIPELINE资料模型管道(pipelines.py)」

从itemadapter导入ItemAdapter 
从y不休。出口商进口CsvItemExporter 
 
 
CsvPipeline类: 
    def __init__ (self ):
        自我。文件=打开('posts.csv''wb' ) 
        自我。出口= CsvItemExporter (自我。文件,编码= '中文' ) 
        自我。出口商。start_exporting ()
 
    def process_item (self ,item ,spider ):
        自我。出口商。export_item (项目)
        退货项目
 
    def close_spider (self ,spider ):
        自我。出口商。finish_exporting ()
        自我。文件。关闭()

超过为[python]教你Scrapy框架汇出CSV档案方法提升资料处理效率-第七篇文章,将Scrapy网页爬虫爬取的资料汇入到CSV档案部分,而此处就是把其中的CSV档案附在Gmail邮件中寄出。(PS。第8行的CsvItemExporter预设为UTF-8编码,如果读者汇出的CSV档案要使用Microsoft Excel中开启,就需要设定为中文编码,否则会出现乱码)

三,Scrapy MailSender结合Gmail发送邮件

在Scrapy网页爬虫框架中,想要实作发送电子邮件的功能,可以使用内建的MailSender模组(模块),通过基本的设定即可达成。并且它是一个基于Twisted框架的非中断IO( non-blocking IO),能够在发送电子邮件时,避免因为非预期的错误而导致程式码卡住。

开启Scrapy专案的settings.py设置档,加入以下的Gmail SMTP设置:

请点击输入图片描述(最多18字)

并且,将第七篇文章中所建立的CsvPipeline资料模型管道设定开启,如下范例:

MAIL_HOST = “ smtp.gmail.com” 
MAIL_PORT = 587 
MAIL_FROM = “申请Gmail应用程序密码所使用的电子邮件帐号” 
MAIL_PASS = “ Gmail应用程序密码” 
MAIL_TLS = True #开启安全连线   

设定完成后,开启ITEM PIPELINE资料模型管道(pipelines.py)档案,引用Scrapy框架的设定档及MailSender模组(Module),如下范例:

#配置项目管道
#参见https://docs.scrapy.org/en/latest/topics/item-pipeline.html
ITEM_PIPELINES = { 
    'news_scraper.pipelines.CsvPipeline'500}

由于我们要在Scrapy网页爬虫将资料汇入到CSV档案结束后,才进行发送邮件的动作,所以,就需要在CsvPipeline类别(Class)的close_spider()方法(Method)中,来建立Scrapy MailSender物件,如下范例:

从itemadapter导入ItemAdapter 
来自news_scraper导入设置
从y不休。邮件导入MailSender 

以上范例第15行利用刚刚在settings.py档案中所设置的值来建立Scrapy MailSender对象,特别注意其中的关键字参数(关键字参数)需一模一样。

接着,指定Gmail的附件,包含“附件显示的名称(attach_name)”,“网际网络媒体类型(mime_type)”和“档案物件(file_object)”,如下范例:

CsvPipeline类: 
    def __init__ (self ):
        自我。文件=打开('posts.csv''wb' ) 
        自我。出口= CsvItemExporter (自我。文件,编码= '中文' ) 
        自我。出口商。start_exporting ()
 
    def process_item (self ,item ,spider ):
        自我。出口商。export_item (项目)
        退货项目
 
    def close_spider (self ,spider ):
        自我。出口商。finish_exporting ()
        自我。文件。关闭()
 
        邮件= MailSender (smtphost =设置。MAIL_HOST , 
                          smtpport =设置。MAIL_PORT ,
                          smtpuser =设置。MAIL_FROM ,
                          smtppass =设置。MAIL_PASS ,
                          smtptls =设置。MAIL_TLS )

最后,第26行通过Scrapy MailSender模块(模块)的send()方法(方法),寄出网页爬虫汇出的CSV资料档案,同样关键字参数(关键字参数)需一样,执行结果如下图:

CsvPipeline类: 
    def __init__ (self ):
        自我。文件=打开('posts.csv''wb' ) 
        自我。出口= CsvItemExporter (自我。文件,编码= '中文' ) 
        自我。出口商。start_exporting ()
 
    def process_item (self ,item ,spider ):
        自我。出口商。export_item (项目)
        退货项目
 
    def close_spider (self ,spider ):
        自我。出口商。finish_exporting ()
        自我。文件。关闭()
 
        邮件= MailSender (smtphost =设置。MAIL_HOST , 
                          smtpport =设置。MAIL_PORT ,
                          smtpuser =设置。MAIL_FROM ,
                          smtppass =设置。MAIL_PASS ,
                          smtptls =设置。MAIL_TLS )
 
        attach_name = “ posts.csv” #附件的显示名称   
        mime_type = “ application / vnd.openxmlformats-officedocument.spreadsheetml.sheet” 
        file_object = open (“ posts.csv” ,“ rb” )#读取汇出的csv档   
	
	#寄出邮件
        退回邮件。发送(至= [ “ example@gmail.com” ],#收件者  
                         subject = “ news” ,#邮件标题  
                         正文= “” ,#邮件内容  
                         attachs = [(attach_name ,MIME_TYPE ,FILE_OBJECT )]) #附件  

四,小结
在实务上,将Python网页爬虫取得的资料汇入到档案中,并且邮寄给使用者是一个非常常见的应用,而在Scrapy网页爬虫框架中,则提供了MailSender模组(模组),让开发人员只需要透过简单的设定,即可轻松结合SMTP(简易邮件传输协定),像是Gmail等寄送爬取的资料档案,达到讯息通知的效果。增加电子邮件功能的读者有所帮助。欢迎在底下留言和我分享交流〜

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

mikes zhang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值