基于云服务的网站种子采集器,还能发送到邮箱,你不来考虑一下?
这篇文章涉及到的网站,是下面这段代码运行的结果:
if __name__ == '__main__':num = 108print("%s%d+1"%(int(str(num)[-2:][::-1])>>3,(num>>4<<2)-1))
复制代码
不知道大家是否还有印象,之前皮爷写过一篇『【Python实战】用Scrapy编写“xxxxx子吞噬爬虫”』(全网搜索应该可以搜得到)的文章,广受好评,大家也纷纷拿去学习。不知道跑过代码的同学发现没有,在那个代码里面,下载图片和种子的时候,速度很慢很慢。效率不是很高。
经过长期的磨练,皮爷这期专门为大家带来一篇Python爬虫框架Scrapy的高阶骚操作,和市面上97%的爬虫文章绝对不同,因为这篇文章,属于版本迭代的产物,相当于『种子吞噬器v2.0』熟悉开发的同学肯定明白迭代的意义,运行效率更高,实现更多新的好用的特性。不管怎么说,看完这篇文章,你将会:
- 熟悉Scrapy的基本操作
- 掌握Scrapy的高阶骚操作
- 学会拿着Scrapy的FilesPipeline来搞事情
- 会使用Python来发Email
- 以及在服务器上面部署爬虫的小知识点
- 当别人留下邮箱说好人一生平安的时候,你知道怎么做了
总而言之,这篇文章给你讲述的,不是一段代码,也不是一个工程,而是一个项目,从前到后,从上到下,从开发到部署,完完整整的项目讲解。而且,项目的实现思想,可能是有些人曾经的想法,他们想过,但是不知从何下手,最后就放弃了,别慌,皮爷为你们一一实现。
看皮爷的文章,要知道皮爷讲的都是项目开发的思路,而不是项目本身。因为项目代码是死的,而你的思维方式是活的。
-----插播福利------
马上就正月十五了,还不赶紧用六十四卦摇一摇啊?看看运势如何啊~
福利就要写在最前面:
过大年了,大家是不是又有了压岁钱了啊??啊哈哈哈哈,压岁钱买糖吃还不如投资到自己身上。比如用来买课程,或者用来买服务器,来学习编程,写爬虫。来买服务器啊买服务器啊!只在本地跑,根本没用的!恰巧,皮爷这里就有上千元的阿里云和腾讯云的优惠券给你使用(每一款优惠只要点击优惠链接,进入即可领取):
阿里云部分:
【阿里云新人1888元云产品通用代金券】:
promotion.aliyun.com/ntms/yunpar…
【阿里云爆款云主机,2折优惠券】:
promotion.aliyun.com/ntms/act/qw…
【阿里云企业级服务器2折优惠券】:
promotion.aliyun.com/ntms/act/en…
腾讯云:
【新客户无门槛领取总价值高达2775元代金券,每种代金券限量500张,先到先得】:
cloud.tencent.com/redirect.ph…
【腾讯云服务器、云数据库特惠,3折优惠券】:
cloud.tencent.com/redirect.ph…
--接下来是正文--
废话不多说,快来看看我们这次迭代的东西到底是什么。
INTROCDUCTION
我们还是来拿Scrapy爬1024社区,主要就是爬那几个有下载链接的版块。
# settings.py文件中
BLOCK_INFO = {15: "亚洲骠骑大将军",2: "黄皮肤的马前卒",25: "国内摄影师",4: "国外摄影师",26: "中文原创"
}
复制代码
针对每一个板块的每一个帖子,里面有下载种子的地址,一般还有配图,我们可以把这些图片和种子一起下载下来,保存到本地。
同时也可以将下载下来的图片和种子,通过邮件的形式发送到指定邮箱里面。
整个项目思路条理清晰:爬取,分析,下载,保存,发送。但是我们可以玩出一些花活儿。比如,我通过Scrapyd可以将爬虫部署到服务器上面,这样就可以定时定点去爬,然后可以将结果情况发送到邮箱里,方便管理员管理查看。
HOW TO USE
先来说一说使用说明,源码在Github上已经共享出来了,之前关注过我Github的小伙伴可以在上面找到,项目叫『SESpider1024』,不知道地址的小伙伴没关系,关注微信公众号『皮爷撸码』,回复『代码』即可获取下载地址。
将工程git到本地之后,推荐用PyCharm打开,在跑程序之前,需要在setting.py
里面下面的这些变量设置一下:
ROOT_URL = "https://XX.XXXX.XX/" # 这里需要更新到最新的地址# 这里是用126邮箱做例子,并不局限126邮箱
SMTP_HOST = "smtp.126.com" # 发送邮件的smtp服务器
SMTP_USER = "XXXXXX@126.com" # 用于登录smtp服务器的用户名,也就是发送者的邮箱
SMTP_PWD = "XXXXXXX" # 授权码,和用户名user一起,用于登录smtp, 非邮箱密码
SMTP_PORT = 25 # smtp服务器SSL端口号,默认是465,具体是什么,网上一搜邮箱域名和他的smtp就知道了
SMTP_SENDER = "XXXXXX@126.com" # 发送方的邮箱
SMTP_TO_LIST = ["YYYYYY@126.com", "ZZZZZZ@126.com"] # 发送目标邮箱地址,是个list
复制代码
设置成功之后,直接运行/Email1024/Run.py
文件即可。
这里会涉及到发邮件的问题,这里皮爷要多说一点,可能有的小伙伴不知道这个是什么,所以这里皮爷手把手的来叫你们如何打开你们邮箱的SMTP设置。
皮爷这里就以126邮箱为例,其实邮箱都差不多的,万变不离其宗。
注册邮箱的过程,我就不多说了,这个应该大家都会的。
然后登录邮箱,在最上面一行找到『设置
』,选择『POP3/SMTP/IMAP
』:
点击之后,需要将下面的几个打钩选择开通即可:
这里我们看到,针对126邮箱的SMTP服务器地址是:smtp.126.com,这个东西就是我们上面需要在settings.py里面设置的。
端口号怎么找?直接百度126 smtp
,就会出来官方的帮助中心,里面我们打开,就能看到端口号列表了。
我们就把25填写到上面settings.py
里面的端口号就可以。
这里就设置完毕了,如果设置QQ邮箱,163邮箱,步骤都是差不多的,打开邮箱的SMTP服务即可。
一切都搞好之后,运行Run.py
就可以了。
OUTCOME
我是做了这个项目之后,才知道,原来个人邮箱每天发邮件是有上限的。从来都不打嘴炮,用实例和图片说话,下面就是简简单单的跑了一小部分的成果:
大家自己看就好,图片都是预览图片,种子文件都是可以点击下载的。整体程序运行起来方便快捷,当你看到console里面打印的日志的时候,简直:行云流水。发送邮箱截图也给你们看一看:
TECH DETAIL
这里的技术要点,我主要挑Scrapy的骚操作来说一下。
骚操作之FilesPipeline
首先是FilesPipeline,这个东西是Scrapy内部集成好的,主要用途是下载文件或者图片。因为是集成在框架内部的,所以速度很快,调用方便。
官网相关文档参考地址:
https://doc.scrapy.org/en/latest/topics/media-pipeline.html
我们如何使用?首先要从两个地方着手:items.py
和 pipelines.py
。
``` items.py```
class Email1024Item(scrapy.Item):topic_id = scrapy.Field()topic_url = scrapy.Field()topic_title = scrapy.Field()topic_img_url = scrapy.Field()block_name = scrapy.Field()file_urls = scrapy.Field()file = scrapy.Field() # 这个需要创建出来,为下载文件提供使用
复制代码
在items.py
文件里面,我们需要创建item的各个变量,若是需要使用FilesPipeline的话,需要在建一个file=scrapy.Field()
的变量。
下一步就是关键的pipelines.py
文件
```pipelines.py```
class Email1024FilePipeline(FilesPipeline):def get_media_requests(self, item, info):for index, image_url in enumerate(item['file_urls']):if 'gif' in image_url:continueyield Request(image_url, meta={'name': item['topic_title'], 'index': str(index), 'block_name': item['block_name']})def file_path(self, request, response=None, info=None):# 因为'/'字符会在路径中转换成文件夹,所以要替换掉name = request.meta['name'].strip().replace('/', '-')if request.meta['index'] == '0':return request.meta['block_name'] + "/" + name + "/" + name + ".torrent"else:return request.meta['block_name'] + "/" + name + "/" + name + "-" + request.meta['index'] + ".jpg"def item_completed(self, results, item, info):emailHelper = EmailHelper()emailHelper.sendEmailWithAttr(results, item)return item
复制代码
这里我要着重解释一下:
首先是get_media_requests()
方法。这个方法的用途是:当item生成好,传入的时候,需要在这个方法里面发起文件下载的请求。即调用 scrapy.Request()
方法。
在这里,我们做法就是将file_urls
里面的每一个url请求一遍。注意,这里的file_urls
就是上面item中的 file_urls=scrapy.Field()
,这个东西是一个list()
。
接着,是方法 file_path()
,这个方法的用途主要是要返回一个合法的string作为下载文件的保存路径名字。我这里做了特殊处理,因为request请求回来的其实都是字节流,将这些东西保存下来,如果想要打开,还需要添加相对于的合法后缀才行。所以,我固定的将种子文件放在file_urls
列表中第一个,并且将它的请求文件保存后缀改成.torrent
,其他的则保存成.jpg
。如果最后返回的文件路径不合法或者错误,运行Spider结束之后,是不会有任何下载保存动作的,所以这里需要调试的时候特别用心,多多注意一下。
最后是item_completed()
方法,这个方法的调用时机是在item里面的所有url下载完毕之后,会有一个result返回。result是一个集合,里面记录了各个url的下载情况和路径。我们可以根据result的结果,来对item做处理。在这里,我的处理是将结果发送出去。
OK,这就是FilesPipeline的玩法。这个东西不光能下载文件,还能下载图片,我这里的例子就是包含了种子和图片两种。所以,多实践,多采坑。
最后还要注意一步,就是写了Pipeline,一定要在settings.py
文件里面去设置一下:
ITEM_PIPELINES = {'Email1024.pipelines.Email1024FilePipeline': 1,
}
复制代码
骚操作之Email
接着,我们来说说发送email的事儿。在上面的代码,我们看到了有个东西叫EmailHelper()
的东西。这个东西就在emailUtil.py
里面。这个文件主要作用就是用来发邮件的。其实Scrapy内部就已经集成了MailSender
,但是,这个东西我没找到他发送附件的功能,只能发送一些简单的文字类东西。所以,我放弃了。转头开始用Python的email库。这个库在Python3之后就是自带的了,用起来还算挺方便的。这里就简单来说一下关键的技术点:
def sendEmailWithAttr(self, result, item):message = MIMEMultipart()message['From'] = self.sender # 发件人message['To'] = ",".join(self.toLst) # 收件人列表message['Subject'] = item['topic_title'] # 邮件标题message.attach(MIMEText(item['topic_title'], 'plain', 'utf-8'))for downItem in result:if downItem[0] == True:filename = './' + FILES_STORE + '/' + downItem[1]['path']with open(filename, 'rb') as f:attachfile = MIMEApplication(f.read())filename = downItem[1]['path'].split('/')[-1]attachfile.add_header('Content-Disposition', 'attachment', filename=filename)encoders.encode_base64(attachfile)message.attach(attachfile)try:smtpSSLClient = smtplib.SMTP(self.smtp_host, self.smtp_port)loginRes = smtpSSLClient.login(self.smtp_user, self.smtp_pwd)print(f"登录结果:loginRes = {loginRes}")if loginRes and loginRes[0] == 235:print(f"登录成功,code = {loginRes[0]}")smtpSSLClient.sendmail(self.sender, self.toLst, message.as_string())print(f"发送成功. message:{message.as_string()}")else:print(f"登陆失败,code = {loginRes[0]}")except Exception as e:print(f"发送失败,Exception: e={e}")
复制代码
这里比较关键的点就是那段添加附件的代码,这里需要找到已经下载好的文件路径,然后读取文件,并且调用message.attach(attachfile)
加入到附件里就可有。邮件的内容,我这里是发送的是帖子的标题。其实邮件内容可以发送html格式的东西,写法:message.attach(MIMEText(htmlBody, 'html', 'utf-8'))
即可。
关于发邮件,在实际运行的时候,是会打印状态码的。到时候,可以根据具体的状态吗,去百度查一下是什么状态。我这里写几点我遇到的问题:
- 个人邮箱每日都有邮件上限
- 如果把程序布置到服务器上,是需要调用SSL发送的。
- 邮件内容如果附带一些url,会被邮件系统误判为垃圾邮件或者病毒邮件而发送不出去。
- 最好把发送邮箱地址添加到白名单里面。
WHAT ABOUT ON SERVER
如果要把爬虫部署到服务器上,这又需要些什么啊?下面皮爷就和你来说一说:
首先请参考这篇文章【压岁钱来买服务器玩云爬虫】把Scrapy爬虫一步一步通过Scrapyd部署到腾讯云上(阿里云同理),里面讲述了详细的部署方法和周期运行方法。
然后,如果你不修改任何代码就将程序部署到服务器上,邮件功能是跑不通的。就比如我自己轻身经历,将爬虫部署到阿里云服务器,我需要修改主要是emailUtil.py
,地方如下:
#将
self.smtp_port = 25
# 改为
self.smtp_port = 465#将
smtpSSLClient = smtplib.SMTP(self.smtp_host, self.smtp_port)
#改为
smtpSSLClient = smtplib.SMTP_SSL(self.smtp_host, self.smtp_port)
复制代码
然后再将服务器的安全组里面,打开465端口就可以了。
CONCLUSION
这次的骚操作解说,现在看来就差不多完结了,我们可以从皮爷的文章中了解到:Scrapy可以下载文件,同时还支持发送Email,而且,可以把爬虫部署到服务器上,这样就能够解放双手,还能了解到爬网站的动向。方便的很。皮爷就已经把这种会发email的爬虫部署到了服务器阿里云服务器,还专门给女朋友做了一个爬虫,你们可以通过
https://peekpa.tech/
其实这种代码模式很好,自动爬取,还可以发送邮件通知,在一定程度上很自动化。就比如,你可以爬取某个购物网站,如果一点价格发生变化,你就发邮件预警,这样玩也是可以的;再比如你可以爬取某个论坛,实时的检测论坛上帖子数量是否变化,这样玩也是可以的;爬取论坛,突然发现有一条是你喜爱的明星出演的帖子,发邮件通知,这样玩也可以。。。玩法有很多,关键的手法,这篇文章给你讲授了手法,希望能够给大家带来帮助。
最后,再给想获得代码的同学说一下获取途径:关注公众号『皮爷撸码』,回复『代码』即可获取。
皮爷最近不定期要在文章里面藏彩蛋的哦~~~一个有效期是10天的神秘代码,就看你能不能发现了。
这么硬核的公众号,还不赶紧关注一波啊
基于云服务的网站种子采集器,还能发送到邮箱,你不来考虑一下?相关推荐
- 基于云服务创建实时运营数据分析服务(一)
基于云服务创建实时运营数据分析服务 实时运营数据分析 使用数据计算服务.流数据总线.流计算产品,可对实时业务数据进行归档和分析,实现秒级响应,对接数据大屏或BI报表产品即刻呈现业务状态. 使用京东云的 ...
- 基于云服务创建实时运营数据分析服务(二)
基于云服务创建实时运营数据分析服务 实时运营数据分析 使用数据计算服务.流数据总线.流计算产品,可对实时业务数据进行归档和分析,实现秒级响应,对接数据大屏或BI报表产品即刻呈现业务状态. 使用京东云的 ...
- 基于云服务创建离线数据统计分析服务(一)
基于云服务创建离线数据统计分析服务 离线数据统计分析 使用数据工厂.数据计算服务产品,可对多源数据(DB,FILE)整合分析,制定周期性的调度任务,提供任务监控及预警.数据统计分析等功能,可对接BI报 ...
- 航天恒星服务器虚拟化,基于云服务的卫星应用公共服务平台
1.一种基于云服务的卫星应用公共服务平台,其特征在于,包括软件系统和硬件系统: 所述软件系统包括并行处理分系统.数据管理分系统和应用服务分系统:所述数据管理分系统,用于统一管理关系数据库中存储的所有应 ...
- 云盘存储 教学反思_《基于云服务的数字化校园建设与应用研究》
第 1 页共 8 页 <基于云服务的数字化校园建设与应用研究> 结题研究报告 我校<基于云服务的数字化校园建设与应用研究>课题自 2012 年 5 月批准立项之日起,便秉承&q ...
- 基于云服务创建实时运营数据分析服务(三)
基于云服务创建实时运营数据分析服务 实时运营数据分析 使用数据计算服务.流数据总线.流计算产品,可对实时业务数据进行归档和分析,实现秒级响应,对接数据大屏或BI报表产品即刻呈现业务状态. 使用京东云的 ...
- 基于云服务创建弹性托管集群服务
弹性托管集群服务 使用JMR产品,可在几分钟内创建并启动集群,弹性灵活,可根据业务规模与工作负载等需求实现低成本集群组件最优组合,动态扩容缩容,更专注于业务分析. 使用京东云的JMR,对于其他云平台可 ...
- 一年降本 40%:基于云服务的技术成本精细化运营策略
降本增效是今年的主旋律,对于技术团队来说,最大的成本除了人力成本,就是我们的技术成本.这里的技术成本包括各种 CDN.网络带宽.服务器.存储.云计算服务等. 如果你是一个运维总监,或者是技术负责人,需 ...
- 怎么通过邮箱发超大附件?介绍一种基于云服务的方法
合作伙伴第5次催促时,10G的CAD图纸才传了67%:又一次,写好邮件上传附件时,被通知文件太大无法上传:邮件发送出去的会议资料,永远不知道谁没有查看,还要电话通知一遍-- 工作中,你肯定遇到过上述类 ...
最新文章
- 数据蒋堂 | JOIN提速 - 外键指针的衍生
- calendar获取月份少一个月_6月份,花园小学、铁岭小学等哈尔滨南岗校区部分二手房量价齐涨...
- C# PictureBox加载图片并显示进度条
- java虚拟内存扩展_Java 8虚拟扩展方法
- 机器学习-贝叶斯网络
- 【BZOJ1146】网络管理,整体二分
- hihoCoder 1014trie树(字典树)
- Linux下磁盘加密
- Bootstrap Table配置
- repo/git提交代码
- ProGuard:保留包名,混淆类
- 泛微oa流程表单之明细表下拉框事件
- python-mao
- NHibernate体系结构概览
- REST ful规范
- TCP协议中的Ack和Seq号
- 公司服务器文件拷贝痕迹,服务器文件拷贝监控
- uni-app中内嵌u-charts图标导致页面在图表无法滑动
- windows系统下完全卸载mysql数据库
- 评测 osmo_易用能折叠的稳定器 大疆OSMO Mobile3评测