Python收集微博热评进行情感分析祝你狗年

大侠一枝花 2023-02-05 0

ps:重要的事情说三遍! ! ! 最后的复活节彩蛋,最后的复活节彩蛋,最后的复活节彩蛋。

如果你需要抓取数据量比较大的(cai)虫(ji),为了防止你的IP被网站封掉,可以分时间段抓取。 另外,爬取到的数据一般是用来存储数据库的,需要数据移除。 再处理,记录上次爬取的状态,可以在爬虫中断后快速继续上次的状态,实现增量爬取。 这里可以参考我之前写的一个新闻采集,增量采集新闻数据,本文写的新浪微博数据采集处理的完整代码在我的。

玩微博的人应该都知道微博搞笑排行榜。 就在写这篇文章之前,看到1月8日0点姐姐榜的话题是一个人谈一个,追妹子的小道理。 我觉得这个话题只是针对普通大众的。 单身男人的好处ヾ(✿゚゚)ノ,还不如收藏评论分析一波思路。

1.使用新浪微博提供的API采集数据

作为爬虫菜鸟,如果不知道如何使用代理IP池,不了解网站的反爬机制,建议查看网站本身是否提供API。 我们今天要爬取的网站是新浪微博 当然,新浪网作为一个24小时为全球用户提供全面及时的中文信息的大型网站,必须要提供自己的API接口。 这么大的网站肯定经历过无数次爬虫和反爬虫的战争,肯定有完善的反爬策略,所以我们调用新浪微博这个开放平台就可以得到我们想要的信息。 使用前请详细阅读API文档,在开放平台进行开发者身份认证,并附上App key链接。

# 如果这里引入失败,可以直接下载SDK和文件放一块就ok
from weibo import APIClient 
import webbrowser
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
APP_KEY = '你的App Key '  # 获取的app key 
APP_SECRET = '你的AppSecret'  # 获取的appsecret 
CALLBACK_URL = 'https://api.weibo.com/oauth2/default.html' #回调链接 
# 在网站设置"使用微博账号登陆"的链接,当用户点击链接后,引导用户跳转至如下地址  
client = APIClient(app_key=APP_KEY, app_secret=APP_SECRET, redirect_uri=CALLBACK_URL) 
# 得到授权页面的url,利用webbrowser打开这个url  
url = client.get_authorize_url() 
webbrowser.open_new(url) #打开默认浏览器获取code参数 
# 获取URL参数code:
print '输入url中code后面的内容后按回车键:'
code = raw_input() # 人工输入网址后面的code内容  
r = client.request_access_token(code)  # 获得用户授权 
access_token = r.access_token   # 新浪返回的token,类似abc123xyz456
expires_in = r.expires_in
# 设置得到的access_token,client可以直接调用API了
client.set_access_token(access_token, expires_in)

获取用户最近发布的微博列表

获取uid的方法,我们点开不同的微博,会发现链接中u后面的数字就是用户的uid。

content = client.statuses.user_timeline(uid=2706896955, count=100)

返回结果为json格式

{
    "statuses": [
        {
            "created_at": "Tue May 31 17:46:55 +0800 2011",
            "id": 11488058246,
            "text": "求关注。",
            "source": "新浪微博",
            "favorited": false,
            "truncated": false,
            "in_reply_to_status_id": "",
            "in_reply_to_user_id": "",
            "in_reply_to_screen_name": "",
            "geo": null,
            "mid": "5612814510546515491",
            "reposts_count": 8,
            "comments_count": 9,
            "annotations": [],
            "user": {
                "id": 1404376560,
                "screen_name": "zaku",
                "name": "zaku",
                "province": "11",
                "city": "5",
                "location": "北京 朝阳区",
                "description": "人生五十年,乃如梦如幻;有生斯有死,壮士复何憾。",
                "url": "http://blog.sina.com.cn/zaku",
                "profile_image_url": "http://tp1.sinaimg.cn/1404376560/50/0/1",
                "domain": "zaku",
                "gender": "m",
                "followers_count": 1204,
                "friends_count": 447,
                "statuses_count": 2908,
                "favourites_count": 0,
                "created_at": "Fri Aug 28 00:00:00 +0800 2009",
                "following": false,
                "allow_all_act_msg": false,
                "remark": "",
                "geo_enabled": true,
                "verified": false,
                "allow_all_comment": true,
                "avatar_large": "http://tp1.sinaimg.cn/1404376560/180/0/1",
                "verified_reason": "",
                "follow_me": false,
                "online_status": 0,
                "bi_followers_count": 215
            }
        },
        ...
    ],
    "previous_cursor": 0,                     // 暂未支持
    "next_cursor": 11488013766,      // 暂未支持
    "total_number": 81655
}

返回字段说明

假设我们要查看的是微博信息的内容,调用text即可

for info in content.comments:
         text = info.text

2.新浪微博爬虫

在浏览器上右击查看这些老套路。 我不会谈论他们。

另:代码为新浪微博移动端

信息采集,之所以爬移动端而不是PC爬虫,是为了先爬移动端版本(别问我为什么好爬微博评论收集,我也不知道怎么躲

点击链接返回json格式的数据

接下来直接上代码

import re
import time
import requests
uid = '4193705642468999'
url = 'https://m.weibo.cn/single/rcList?format=cards&id=' + uid + '&type=comment&hot=0&page={}'
headers = {
"Accept": "application/json, text/javascript, */*; q=0.01",
"Accept-Encoding": "gzip, deflate, br",
"Accept-Language": "zh-CN,zh;q=0.9",
"Connection": "keep-alive",
"Cookie": "你的cookie",
"Host": "m.weibo.cn",
"Referer": "https://m.weibo.cn/status/" + uid,
"User-Agent": "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.75 Mobile Safari/537.36",
"X-Requested-With": "XMLHttpRequest",
}
i = 0
comment_num = 1  # 第几条评论
while True:
    res = requests.get(url=url.format(i), headers=headers)
    r = res.json()
    content = r[0]['card_group']
    if r.status_code == 200:
        try:
            for j in range(0, len(content)):
                hot_data = content[j]
                comment_id = hot_data['user']['id']  # 用户id
                user_name = hot_data['user']['screen_name']  # 用户名
                created_at = hot_data['created_at']  # 评论时间
                comment = re.sub('<.*?>|回复<.*?>:|[\U00010000-\U0010ffff]|[\uD800-\uDBFF][\uDC00-\uDFFF]', '', hot_data['text'])  # 评论内容
                like_counts = hot_data['like_counts']  # 点赞数
                comment_num += 1
            i += 1
            time.sleep(3)
        except Exception as e:
            logger.debug(e)
else:
    break

下一步是保存和处理数据。

注意:

新浪毕竟是大公司,肯定有自己的爬虫反爬策略。 为了防止频繁禁止访问,可以设置代理ip池,限制爬取时间等。 你问我怎么知道的,我不说~

如果您出现在该页面或无法收集到任何信息,恭喜您,您被新浪看中了

3. 数据存储与处理

因为越来越多的公司开始使用它作为公司数据库,所以这里我们把数据存进去。为了让我们整个项目更加工程化,我们单独定义操作数据库的方法。

# 对数据库实现查询的方法
def execute_select(conn, sql, params=None):
    with conn.cursor() as cur:
        if params:
            cur.execute(sql, params)
        else:
            cur.execute(sql)
        return cur.fetchall()
# 对数据库实现增删改的方法
def execute_sql(conn, sql, params=None):
    with conn.cursor() as cur:
        if params:
            cur.execute(sql, params)
        else:
            cur.execute(sql)

一半的工作完成了,运行代码 --> 保存数据库 接下来当然是分析(hu)分析(shuo)展示(ba)展示(dao)我们获得的数据(一个没变的套路千百年来..)

这里我们可以看到数据已经成功存入数据库

4. 数据处理与分析

既然说到中文数据的处理和展示,我们常用的方法有词云、情感分析、数据可视化展示等几种。 这里不得不提一个比较知名的中文NLP库: ,它可以根据给定的句子生成一个0到1之间的值,当该值大于0.5时,表示该句子的情感极性为正. 当得分小于 0.5 时,情绪极性为负。 越往两端,情绪越敏感。 使用库最简单的方法是阅读官方文档。

使用起来也很简单

我随机选择了两个结果,并简单地标记了它们。 不难发现,主动性、帅气、有钱、勇敢、口红、情商相关的词的值都是0.9。 渣和你这样的词产生的数值都在0.5以下,林佳给我留个口子! 什么鬼,甚至0.7? ? ?

def word_cloud(comment):
    logger.info('制作词云图...word_cloud')
    comment_text = ''
    back_coloring = imread("static/heart.jpg")
    cloud = WordCloud(font_path='static/simhei.ttf', 
                      background_color="white",  # 背景颜色
                      max_words=2000,  
                      mask=back_coloring,  
                      max_font_size=100,  
                      width=1000, height=860, margin=2,  
                      random_state=42,
                      )
    for li in comment:
        comment_text += ' '.join(jieba.cut(li, cut_all=False))
    wc = cloud.generate(comment_text)
    image_colors = ImageColorGenerator(back_coloring)
    plt.figure("wordc")
    plt.imshow(wc.recolor(color_func=image_colors))
    wc.to_file('微博评论词云图.png')

def snow_analysis(comment):
    logger.info('自然语言处理NLP...snow_analysis')
    sentimentslist = []
    for li in comment:
        s = SnowNLP(li)
        # logger.debug(li)
        # logger.debug(li, s.sentiments)
        print(li, s.sentiments)
        sentimentslist.append(s.sentiments)
    fig1 = plt.figure("sentiment")
    plt.hist(sentimentslist, bins=np.arange(0, 1, 0.02))
    plt.show()

微博一个人说一个人,追妹小道理评论情感值分布

可以看到情感值接近0.6~1.0,频率比较高,说明这条微博的粉丝评论大部分是正面的,因为这条微博本身就是正面的,结果也说明了这一点。 问题。

我们的初衷是怎么追妹子。 我统计了很多评论(有些博主为了抢人气频繁刷评论?),三行代码就可以搞定,这个的用法之前写过,传送门:第三方库在用

# 使用python的第三方库
from collections import Counter
userdict = Counter(comment_list)
print(userdict.most_common(8))

1.一定要主动,要不就等妹子主动吧! 但要适度主动,不要让对方感到害怕……

2、品行端正,三观端正,有责任感,孝顺善良也是重要的内在因素

3、追女生只追一个人,不跟别人调情

4.说话幽默但不轻浮

5.把她当女儿一样

6、女孩子是用来宠的,不是用来跟她讲道理的。

7、多和她聊天,多关心她,爱她,保护她,理解她,宠她,尊重她,给她安全感

8、不要含糊,不要套路

文末彩蛋:

很多男生抱怨追不上心仪的女生,追了几周就放弃了。 其实微博评论收集,你需要改变的是你自己,只要你努力让自己变得更好,同时对女孩子保持适当的关心和热情,坚持几个月,总有一天你会发现,如果你不喜欢,你不喜欢。 没有别的办法。

最后,由于这篇博客是2018年的第一篇博客,祝大家狗年大吉~