在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网页爬虫框架流程,如下图:
从上图可以知道,想要将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等寄送爬取的资料档案,达到讯息通知的效果。增加电子邮件功能的读者有所帮助。欢迎在底下留言和我分享交流〜