写在前面
今天在csdn看到了一篇爬取微博热搜并发邮件的博客,但是我在将其部署到腾讯云函数时出现了错误,于是使用server酱推送到微信,效果看起来还不错,废话不多说,上代码!
用到的包
# -*- coding: utf-8 -*-
"""
Created on Thu Aug 6 18:09:58 2020
@author: ljc545w
"""
#请在cmd下使用pip install requests命令安装依赖
import requests
import re
import datetime
#以下三个包用于发送邮件,非第三方包,无需使用pip安装
#如果不使用邮件提醒,可以注释掉
import smtplib
from email.mime.text import MIMEText
from email.header import Header
全局变量
#定义一个请求头...尊重一下你要爬的网站
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.116 Safari/537.36'
}
#获取日期
date = datetime.datetime.now().strftime('%Y-%m-%d')
#server酱秘钥,请到sc.ftqq.com按提示获取
SCKEY = ''
爬取数据
#爬取微博热搜数据
def Weibo_Spider():
#初始化contents字符串,并写入日期
contents = '> 今天是' + date + '\n\n'
#微博热搜地址
url = 'https://s.weibo.com/top/summary'
#使用requests读取目标url
response = requests.get(url,headers = headers)
response.encoding = response.apparent_encoding
#如果返回值不是200,可能你小子的ip被封了....
if response.status_code == 200:
res = response.text
#当然你也可以看看返回的是什么...
#print(res)
else:
print('error')
#正则匹配我们想要的数据
pattern_title = re.compile('<a\shref="/weibo?.*?">(.*?)<')
titles = re.findall(pattern_title,res)
pattern_href = re.compile('<a\shref="(/weibo?.*?)".*?<')
hrefs = re.findall(pattern_href,res)
#尝试捕捉异常
try:
#如果titles与href数量不一致,嗯。。。不管它!
if len(titles) != len(hrefs):
print('可能有一点小小的error')
#配置contents字符串
for i in range(len(titles)):
title = titles[i]
href = 'https://s.weibo.com' + hrefs[i]
#server酱支持Markdown格式
content = '#####' + title + '\n' + '[点击查看详情](' + href + ')\n\n'
contents += content
#返回contents字符串
return contents
except:
pass
发送邮件
#用于发送邮件的函数
def send_email(contents):
#配置邮箱host,没有163邮箱的用QQ邮箱也可以
#mailhost = 'smtp.qq.com'
mailhost = 'smtp.163.com'
mail = smtplib.SMTP()
#通过25端口连接host
mail.connect(mailhost,25)
#在这里写入你的邮箱
sender = ''
#SMTP/IMAP授权码,去个人邮箱中开启,请勿使用邮箱密码
password = ''
#收件人,可以与sender一致,也就是自己给自己发邮件
receiver = ''
mail.login(sender, password)
#邮件内容
news = contents
message = MIMEText(news,'plain','utf-8')
#邮件标题
subject = '今日热搜'
message['Subject'] = Header(subject,'utf-8')
#尝试捕捉error
try:
mail.sendmail(sender,receiver,message.as_string())
print('邮件发送完毕')
except Exception as e:
print('邮件发送失败\n' + e)
mail.quit()
开始任务
def run():
print('开始推送')
#server酱标题,不可缺省
title = '今日热点已经送达'
#调用函数获取热搜信息
content = Weibo_Spider()
#将数据整理成一个字典
msg = {
'标题':title,
'内容':content
}
#server酱推送到微信
push(SCKEY,msg)
#发送邮件,部署到腾讯云时尽量不要使用,经常调用失败
#send_email(content)
print(date + '任务完成')
入口函数
#本地入口函数,如果使用腾讯云请删除或注释掉
if __name__ == '__main__':
job()
#腾讯云入口函数,此时还请不要使用邮件功能
"""def main_handler(event,context):
job()
return("Success")"""
云函数定时提醒
1:使用微信扫码登录腾讯云 2:点击新建,输入函数名称,运行环境选择python3.6,创建方式选择空白函数 3:清空index.py原有内容,并贴入本文代码,取消末尾入口函数的注释 4:点击下方保存并测试,如果调用成功,你将在返回结果中看到“success”,并且收到微信提醒 5:在下方高级设置里,将内存修改为64MB,超时时间修改为900,点击完成 6:创建触发器,触发方式选择定时触发,cron表达式参考:
0 0 18 * * * *
分别代表秒、分、时、日、月、星期、年,参考式代表的是每天下午6点。
注意
1:请勿在五分钟内通过server酱推送相同信息,不然无法收到提醒 2:每天调用尽量不要超过500次,被封的话可以捐赠server酱或者重新注册一个github...