爬取微博热搜并发送提醒(邮件和server酱)

爬取微博热搜并发送提醒

    • 写在前面
    • 用到的包
    • 全局变量
    • 爬取数据
    • 发送邮件
    • 开始任务
    • 入口函数
    • 定时提醒
    • 注意事项
    • 结果展示
    • 请参考以下内容

写在前面

今天在CSDN看到了一篇爬取微博热搜并发邮件的博客,但是我在将其部署到腾讯云函数时出现了错误,于是使用server酱推送到微信,效果看起来还不错,废话不多说,上代码!

用到的包

# -*- coding: utf-8 -*-
"""
Created on Thu Aug  6 18:09:58 2020

@author: 勇敢自由
"""
#请在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 = '' 
    #初始化contents字符串,并写入日期,用于server酱
    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('(.*?)<')
    titles = re.findall(pattern_title,res)
    pattern_href = re.compile(')
    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酱时请注释掉
            #content = title + '\n' + href + '\n\n'
            #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:
    	#如果在这里报错就把host换成QQ邮箱
        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__':
    run()
    
#腾讯云入口函数,此时还请不要使用邮件功能
"""def main_handler(event,context):
    run()
    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…

结果展示

爬取微博热搜并发送提醒(邮件和server酱)_第1张图片
爬取微博热搜并发送提醒(邮件和server酱)_第2张图片

请参考以下内容

知乎:十条简明的Markdown格式
CSDN:爬取微博热搜+定时发送邮件

你可能感兴趣的:(笔记,python)