很多人都是在朋友圈装死,微博上蹦迪。
微信朋友圈已经不是一个可以随意发表心情的地方了,微博才是!

所以你不要傻傻盯着女神的朋友圈发呆啦!本文教你如何用 Python 自动通知女神微博情绪变化,从今天开始做一个贴心小棉袄。

为了及时获取这些消息,三步可以实现:

1、定时自动爬取微博内容
2、微博内容的情绪分析
3、邮件自动提醒

一、微 博 内 容 获 取

首先是一些常规操作:你需要注册一个微博账户,找到你微博账户的 Cookie

然后找到你需要关注的微博用户的 id,下面以李荣浩为例:

image

或者直接去用户主页查看,进入指定用户主页,如李荣浩的主页 :https://m.weibo.cn/u/1739046981?uid=1739046981&luicode=10000011&lfid=231093_-_selffollowed其中 1739046981 就是 uid。先根据这些信息设置好自己的账号,由于最新的微博内容肯定在第一页,设置好首页微博内容的 url

# 改成自己的user_id和cookie
user_id = YOUR_ID
cookie = {"Cookie": "YOUR_COOKIE"}
# url
url = 'http://weibo.cn/%d/profile?page=1'%user_id
# 获取初始url页面html内容,获取user_id和cookie(在返回的response header中)
html = requests.get(url, cookies = cookie).content
print ('user_id和cookie读入成功')

有了这些信息以后,我们就可以爬取微博内容啦,这里需要注意的是我们需要加一个第一条微博的判断。

#根据用户uid获取该用户第一页的微博消息
page_num = 1
nickname = None
weibo = None
try:
json = r.get(
('https://m.weibo.cn/api/container/getIndex?'
'is_search[]=0&'
'visible[]=0&'
'is_all[]=1&'
'is_tag[]=0&'
'profile_ftype[]=1&'
'page={0}&'
'jumpfrom=weibocom&'
'sudaref=weibo.com&'
'type=uid&'
'value={1}&'
'containerid=107603{1}').format(page_num, uid),
verify=False,
).json()
except:
return None, None
if json['ok'] == 0:
print('sth wrong')
return None, None
else:
for card in json['cards']:
if card['card_type'] == 9:
weibo = [
card['mblog']['created_at'],
BeautifulSoup(
card['mblog']['text'], 'lxml'
).text.replace(' \u200b\u200b\u200b', ''),
*get_comments_from_one_weibo(
card['mblog']['id']),
]

这样的话我们就可以获取到女神的最新微博啦~下面要做的就是根据获取到的微博数据来分析情感内容。

二、微 博 内 容 情 感

这部分仅对文本内容有效,如果是图片内容就直接通知你内容不做情感分析。如果需要计算中文文本内容的情绪分,主要是三步:1、情感字典及对应的分数2、数据的分词处理3、构建情绪分计算逻辑这里主要介绍一下情绪分的计算逻辑,情感词典和完整的实现逻辑后台回复「微博通知」获取,下次再专门写一篇针对文本情绪评分的内容。

简化的情感分数计算逻辑:所有情感词语组的分数之和

定义一个情感词语组:
两情感词之间的所有否定词和程度副词与这两情感词中的后一情感词构成一个情感词组,即 notWords + degreeWords + sentiWords,
例如不是很开心,其中不是为否定词,很为程度副词,开心为情感词,那么这个情感词语组的分数为:finalSentiScore = (-1) ^ 1 * 1.25 * 3.546其中1指的是一个否定词,1.25 是程度副词的数值,3.546 是开心的情感分数。伪代码如下:finalSentiScore = (-1) ^ (num of notWords) * degreeNum * sentiScorefinalScore = sum(finalSentiScore)具体实现逻辑如下:

def scoreSent(senWord, notWord, degreeWord, segResult):
W = 1
score = 0
# 存所有情感词的位置的列表
senLoc = senWord.keys()
notLoc = notWord.keys()
degreeLoc = degreeWord.keys()
senloc = -1
# notloc = -1
# degreeloc = -1 # 遍历句中所有单词segResult,i为单词绝对位置
for i in range(0, len(segResult)):
# 如果该词为情感词
if i in senLoc:
# loc为情感词位置列表的序号
senloc += 1
# 直接添加该情感词分数
score += W * float(senWord[i])
# print "score = %f" % score
if senloc < len(senLoc) - 1:
# 判断该情感词与下一情感词之间是否有否定词或程度副词
# j为绝对位置
for j in range(senLoc[senloc], senLoc[senloc + 1]):
# 如果有否定词
if j in notLoc:
W *= -1
# 如果有程度副词
elif j in degreeLoc:
W *= float(degreeWord[j])
# i定位至下一个情感词
if senloc < len(senLoc) - 1:
i = senLoc[senloc + 1]
return score

通过这个计算逻辑最终输出整条微博的情绪评分,在做这个最重要的是要有好用的语料库,定义好正向情感词和负向情感词。

基础情感词典已经有整理好了的情感词典。使用的是大连理工大学的情感词汇本体库,停用词表使用哈工大的停用词表。

三、邮 件 自 动 提 醒

当我们获取到新的微博内容时,就需要将消息推送到我们的邮箱,这时候,我们需要添加判定条件,判断是否执行邮件提醒。这个判断条件与爬取最新微博的判断设置成一致。python 发邮件需要掌握两个模块的用法,smtplib 和 email,这俩模块是 python 自带的,只需 import 即可使用。smtplib 模块主要负责发送邮件,email 模块主要负责构造邮件。smtplib 模块主要负责发送邮件:是一个发送邮件的动作,连接邮箱服务器,登录邮箱,发送邮件(有发件人,收信人,邮件内容)。email 模块主要负责构造邮件:指的是邮箱页面显示的一些构造,如发件人,收件人,主题,正文,附件等。导入我们需要用到的包

from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.image import MIMEImage
import smtplib msg = MIMEMultipart()

在邮件中插入微博正文,同时将情绪分值添加到邮件正文里:

##在邮件中插入文本信息
df_text="Hi!\n你的女神新发了一条微博,情绪分值只有 %s \n快去看看吧!"% score
msgtext = MIMEText(df_text, 'plain', 'utf-8')
msg.attach(msgtext)

剩下的就是设置一些邮件参数来发送邮件:

#Python学习群592539176
#设置邮件信息常量
email_host= '' # 服务器地址
sender = '' # 发件人
password ='' # 密码,如果是授权码就填授权码
receiver = '' # 收件人

发送邮件:

try:
smtp = smtplib.SMTP(host=email_host)
smtp.connect(email_host,port)
smtp.starttls()
smtp.login(sender, password)
smtp.sendmail(sender, receiver.split(',') , msg.as_string())
smtp.quit()
print('发送成功')
except Exception:
print('发送失败')

具体邮件发送参数说明如下:

smtplib.SMTP():实例化SMTP()
connect(host,port):
email_host:指定连接的邮箱服务器。常用邮箱的smtp服务器地址如下:
新浪邮箱:smtp.sina.com
163网易邮箱:smtp.163.com。
port:指定连接服务器的端口号,默认为25
login(user,password):
sender:登录邮箱的用户名。
password:登录邮箱的密码(网易邮箱一般是网页版,需要用到客户端密码,需要在网页版的网易邮箱中设置授权码,该授权码即为客户端密码)
sendmail(from_addr,to_addrs,msg,…):
sender:邮件发送者地址
receiver:邮件接收者地址
msg:邮件内容
quit():用于结束SMTP会话

四、效 果 展 示

运行程序结果如下:

如果你觉得文章还不错,请大家点赞分享下。你的肯定是我最大的鼓励和支持。

谁说程序员没有时间关心女朋友的,Python 教你如何掌握女神情绪变化的更多相关文章

  1. [Python 学习]2.5版yield之学习心得 - limodou的学习记录 - limodou是一个程序员,他关心的焦点是Python, DocBook, Open Source …

    [Python 学习]2.5版yield之学习心得 - limodou的学习记录 - limodou是一个程序员,他关心的焦点是Python, DocBook, Open Source - [Pyth ...

  2. 程序员用HTML5给女朋友制作的3D相册

    程序员给女朋友用HTML5制作的3D相册,使用鼠标拖拽,能看到3D旋转效果,点击相片,相片能放大,移近.程序员发挥自己的专长,这是那些不懂编程的人望尘莫及的.本相册使用了HTML5的画布技术,需要谷歌 ...

  3. 对java程序员来说时间格式永远让人挠头来看Java Date Time 教程-时间测量

    在Java中,用System.currentTimeMillis()来测量时间最方便. 你要做的是在某些操作之前获取到时间,然后在这些操作之后你想要测量时间,算出时间差.下面是一个例子: long s ...

  4. 想转行做程序员,是学习JAVA还是Python?哪个更好?

    请大家务必审题,转行做程序员,是程序员,并非数据分析也不是软件测试. 首先声明:这是一篇容易引起撕逼的问答,为了祖国和谐,人民安康,请各位看官尽量理性讨论. 同时,这篇文章是面向一些初入行的朋友进行一 ...

  5. 程序员快递请查收,来自Python黑客大佬的一份DDOS攻击说明书!

    DDoS攻击没有我们想象中的那么简单,并不是什么Python程序员都能够做到的. 若要知晓黑客利用DDOS攻击原理那么我们必须要知道是实行DDoS攻击比较难的原因是什么? 很简单的一句话概括:&quo ...

  6. pop动画大全 只能时代程序员更应该关心效果而不是冷冰冰的代码

    下载地址 https://pan.baidu.com/s/1o8pQWau

  7. 程序员需要掌握的七种 Python 代码更易维护的武器

    检查你的代码风格 PEP 8 是 Python 代码风格规范,它规定了类似行长度.缩进.多行表达式.变量命名约定等内容.尽管你的团队自身可能也会有稍微不同于 PEP 8 的代码风格规范,但任何代码风格 ...

  8. 有终将被编程潮流淹没的程序员,那是因为没学python人工智能吧?

    2017年被称为中国人工智能元年--在两会时期,人工智能曾经成为国度计策,同时被写进当局报告.在从前的一年里,人工智能获得注重,已逐步浸透到别的行业,无人超市.主动驾驶.人脸识别.智能家居等" ...

  9. #华为云·寻找黑马程序员# 如何实现一个优雅的Python的Json序列化库

    在Python的世界里,将一个对象以json格式进行序列化或反序列化一直是一个问题.Python标准库里面提供了json序列化的工具,我们可以简单的用json.dumps来将一个对象序列化.但是这种序 ...

随机推荐

  1. js前端模块化的前世今生

    前言: <!DOCTYPE html> <html> <head> <title></title> </head> <sc ...

  2. 题解【洛谷P2070】刷墙

    题面 将每一次移动的距离进行差分,前缀和判断移动的距离是否\(\geq 2\)即可. #include <bits/stdc++.h> #define itn int #define gI ...

  3. 【15】【有点特殊的dp】 剪绳子

    题目 给你一根长度为 n 的绳子,请把绳子剪成整数长度的 m 段(m.n都是整数,n>1并且m>1),每段绳子的长度记为 k[0],k[1]...k[m] .请问 k[0]k[1]...* ...

  4. 阿里云安装Nginx+vue项目部署

    阿里云安装Nginx+vue项目部署 nginx安装包下载 http://nginx.org/en/download.html nginx安装 首先先安装PCRE pcre-devel 和Zlib,因 ...

  5. 在已部署好的docker环境下配置nginx项目路径

    第一步:申请一个docker连接账号,可以借用putty工具,如果使用sublime,可以下载sftp插件,上传.下载来同步你线上线下的文件: 第二步:修改nginx区域配置文件,在conf文件夹里放 ...

  6. 解决jmeter 24h长时间压测-o生成报告文件达到几个g以及以上的问题

    问题描述:jmeter执行稳定性测试时,因时间过长,导致jtl文件过大,生成html报告过程报内存溢出错误(增加内存配置也不能解决) 使用 jmeter -n -t    test.jmx   -l  ...

  7. csrf跨站点请求伪造

    什么是csrf(跨站请求伪造) 伪造请求的定义有很多种,我将不是用户本意发出的请求统称为伪造请求(在用户不知情的情况下执行某些操作)xss的通过用户对浏览器的信任造成的,csrf是通过服务器对浏览器的 ...

  8. C正数负数的原码补码反码以及内存地址分析

    #include<stdio.h> void swap(int a, int b); void main1(){ int i = 10; //正数的原码 00000000 00000000 ...

  9. CBE引擎概览

    摘录于CBE官方文档:https://www.comblockengine.com/docs/1.0/overview/index/ 架构图总览: Switch Fabric:交换机网络,根据网络环境 ...

  10. SpringCloud Netflix Hystrix

    Hystrix的一些概念 Hystrix是一个容错框架,可以有效停止服务依赖出故障造成的级联故障. 和eureka.ribbon.feign一样,也是Netflix家的开源框架,已被SpringClo ...