发表于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即可。
完成。