自制微博那年今日

博主受QQ空间“那年今日”功能启发,提出用脚本将微博数据保存到本地,再获取当日微博内容发送到邮箱的方案。通过正则表达式抓取微博内容存入sqlite数据库,编写发邮件脚本,最后添加到Windows计划任务,实现每日提醒。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

发表于2016年 02月 15日

很喜欢QQ空间的“那年今日”功能,这样就可以和不同时空的自己说话了,也可以看到一年前的今天发生了什么,自己做过什么。

我想到的方案:写个脚本把微博的数据保存到本地,再写一个脚本获取日期是今天的微博内容发送到我的邮箱里,然后用本机的计划任务每天执行这个脚本。

如今这个已经运行了两个月了,效果不错。

首先,获取微博内容并保存

直接抓取wap版本的微博的数据会方便很多,数据内容结构简洁,关键不用处理异步加载内容的问题。

基本方法就是获取页面文本,然后用正则表达式获取微博内容保存到本地的sqlite数据库表。

获取一页微博内容的功能函数:

#获取一页微博页面内微博list
def getWeiBo(url):
    headers = {
                'Cookie':"自行获取",
                'Referer':"自行获取",
                'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.132 Safari/537.36'
                }
    req = urllib2.Request(url, headers=headers)  # 每次访问页面都带上 headers 参数
    try:
        html = urllib2.urlopen(req)
        html_text=html.read()
        html_text=html_text.replace(r'\n','').replace('\\','')
        item_re='<div class="c" id="M_.*?">.*?</div></div>'
        id_re='<div class="c" id="M_(.*?)">'
        time_re=r'<span class="ct">(201.*?) .*?</span>'
        content_re=r'<span class="ctt">(.*?)</span>'
        webItemList=re.findall(item_re, html_text,re.S)
        dataList=[]
        for webItem in webItemList:
#            print webItem+'\n'
            item=[]
            if len(re.findall(time_re,webItem))!=0:#根据日期格式排除今年的
                item.append(re.findall(id_re,webItem)[0])
                item.append(re.findall(time_re,webItem)[0])
                item.append(re.findall(content_re,webItem)[0])
                dataList.append(item)
        return dataList
    except (Exception)  as e: 
        print url
        print 'error:',
        print e
        return {}

其中headers的内容需要自己获取,登录微博之后用Chrome浏览器的开发者工具获取即可

然后重复获取每页内容保存到sqlite数据库表:

for page in range(1, 15):
        dataList=getWeiBo('http://weibo.cn/12306/profile?page='+ str(page))#不同页面的URL
        conn=sql.connect(r'D:\SQLite Datafiles\weibo.db')#sqlite数据库路径
        cur=conn.cursor()
        print len(dataList)
#        cur.execute('delete from weibo')#清空
        for item in dataList:
            cur.execute('INSERT INTO weibo values(NULL,?,?,?)',('http://weibo.com/12306/'+item[0],item[1],item[2].decode('utf8')))#将URL转换成电脑网页版URL存储
        conn.commit()
    cur.close()
    conn.close()

以上部分脚本程序需要每年执行一次更新数据库表。

接下来是每天执行一次的发邮件脚本:

mailto_list=['example@163.com'] # 定义发送列表 
# 设置服务器名称、用户名、密码以及邮件后缀 
mail_host = 'smtp.163.com' 
mail_user = 'example_test'#小号</span>
mail_pass = '客户端授权密码' 
mail_postfix='163.com'
# 发送邮件函数 
def send_mail(to_list, sub, context): 
    '''''
    to_list: 发送给谁
    sub: 主题
    context: 内容
    send_mail('xxx@126.com','sub','context')
    ''' 
    me = 'example' + '<'+mail_user+'@'+mail_postfix+'>' </span>
    msg = MIMEText(context,'html','utf-8') 
    msg['Subject'] = sub 
    msg['From'] = me 
    msg['To'] = ";".join(to_list) 
    try: 
        smtp_server = smtplib.SMTP(mail_host)
#        smtp_server.starttls()#https
#        smtp_server.set_debuglevel(1)
        smtp_server.login(mail_user, mail_pass) 
        smtp_server.sendmail(me, to_list, msg.as_string()) 
        smtp_server.quit() 
        return True 
    except Exception, e: 
        print e
        return False 

其中发邮件需要一个小号,如果用的是网易163的邮箱小号的密码是客户端授权密码需要在邮箱中设置。

再接下来是获取sqlite数据库表中的数据,如果曾经的今天有发过微博就调用发邮件程序把微博内容发到指定邮箱即可。

    subject=u'那年今日'
    content=''
    conn=sql.connect(r'D:\SQLite Datafiles\weibo.db')
    cur=conn.cursor()
    
    t = datetime.datetime.now()
#    print t.strftime('%m-%d')
    datatable=cur.execute("select [time],[content],[url] from weibo where [time] like '%"+t.strftime('%m-%d')+"%'")
#    datatable=cur.execute("select [time],[content],[url] from weibo where [time] like '%12-13%'")
    for row in datatable:
#        context=context+row['url']
        date=datetime.datetime.strftime(datetime.datetime.strptime(row[0],"%Y-%m-%d %H:%M:%S"),"%Y年%m月%d日: <br/>")
        content=content+date.decode('utf-8')
        content=content+row[1]
        content=content+row[2]+' <br/>'
    conn.commit()
    cur.close()
    conn.close()
#    print content
    if content !='':
        send_mail(mailto_list,subject,content.encode('utf-8'))

最后把它添加到Windows的计划任务设置每天某个时刻执行一次,另外为了防止每次运行脚本都弹出一个命令行黑框可以把脚本后缀改为pyw即可。

完成。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值