Python 微博画像分析

来源:互联网 发布:造字软件在线使用 编辑:程序博客网 时间:2024/05/22 00:58
      写这篇文章的思路来自于这样的一盘文章:《程序员的七夕应该这么过》。https://mp.weixin.qq.com/s/CF0rCG8r54AQIvVmBcqkpw

      在写这篇文章之前,我对Python的涉猎并不多,很多基础知识都是现学现用,中间也出现了很多问题,最终也都一一解决,也是颇为不易。

      在看这篇文章前,我的MAC还只有系统自带的Python2.7环境,而这篇文章要求的运行环境是Python3.0以上,为此,我并没有在七夕,也就是昨天就鼓捣出来整个项目,而是用了一个七夕去安装Python3.0的环境,真的要手动滑稽一下,hhhhhh。
      在MAC上安装Python 3.0的教程,可以查看我的前一篇博客 :MAC 下 Python3 环境安装 

      言归正传,进入正题。

      首先介绍本人开发环境: 系统: MAC OS 10.12.5
                                                Python版本: Python 3.6
                                          Conda版本: Conda 4.3.25

      今天,我要做的是一件什么事情呢?就是要对微博数据进行爬取,然后对数据进行清洗加工后进行分词处理,将处理后的数据交给词云工具,再配合科学计算工具和绘图工具绘制出图像出来。

      这一系列的工作,涉及到的工具包包括: 网络请求包 Requests、中文分词处理 jieba  、 词云处理 wordcloud 、 图片处理库 Pillow、科学计算工具 Numpy、2D绘图库 Matplotlib。

       因此,下一步,就是一一下载上面提到的库。

       下载的方法通过 pip install 和 conda install 结合起来,主要原因在于conda 无法找到 jieba 、和wordcloud这两款对应的工具包,只可以通过pip install下载。我在 MAC 下 Python3 环境安装 提到了如何为 conda 添加国内镜像源从而提高下载速度,在这里也提下如何添加 pip 国内镜像源来提高下载速度,附上相关链接,需要的自行查阅 http://blog.csdn.net/lambert310/article/details/52412059

        在安装好相关工具之后,我们顺着《程序员的七夕应该这么过》的思路走。
        首先,我们打开微博,搜索某某明星女神的微博,这里我们以李冰冰为例子来做分析,进入她的微博主页,分析浏览器的的发送请求过程。


        刷新网页或者第一次请求网页,打开调试窗口,发现如下XHR请求,双击其中一条请求,我们可以查看这条请求的详细信息如下:


        这里,我们首先分析请求链接:https://m.weibo.cn/api/container/getIndex?uid=1192515960&luicode=10000011&lfid=100103type%3D3%26q%3D%E6%9D%8E%E5%86%B0%E5%86%B0&type=uid&value=1192515960&containerid=1076031192515960
        通过这个链接可以提取出如下关键字:
        uid=1192515960
        luicode=10000011
        lfid=100103type%3D3%26q%3D%E6%9D%8E%E5%86%B0%E5%86%B0
        type=uid
        value=1192515960
        containerid=1076031192515960
     
      且不管这些关键字的具体含义是什么,这些字段在接下来的爬取过程中将会用到。

      再来分析请求的返回结果,返回数据是一个JSON字典结构,total 是微博总条数,每一条具体的微博内容封装在 cards 数组中


      
       分析完网页后,我们开始用 requests 模拟浏览器构造爬虫获取数据,因为这里获取用户的数据无需登录微博,所以我们不需要构造 cookie信息,只需要基本的请求头即可,具体需要哪些头信息也可以从浏览器中获取,首先构造必须要的请求参数,包括请求头和查询参数。这一部分内容,我们同样可以在同一个xhr请求中获得。


       于是,我们可以构建如下headers:

headers = {
   "Host":"m.weibo.cn",
   "Referer":"https://m.weibo.cn/u/1705822647,
   "User-Agent":"Mozilla/5.0(Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Mobile        Safari/537.36",
}

params = {"uid":"{uid}",
         "luicode":"20000174",
         "featurecode":"20000320",
         "type":"uid",
         "value":"1705822647",
         "containerid":"{containerid}",
         "page":"{page}”}

在经过前文的这些爬取准备基础之后,就可以开始构建我们的简单爬虫系统了,代码来源来自于:https://mp.weixin.qq.com/s/CF0rCG8r54AQIvVmBcqkpw

通过返回的数据能查询到总微博条数 total,爬取数据直接利用 requests 提供的方法把 json 数据转换成 Python 字典对象,从中提取出所有的 text 字段的值并放到 blogs 列表中,提取文本之前进行简单过滤,去掉无用信息。顺便把数据写入文件,方便下次转换时不再重复爬取。

def fetch_data(uid=None, container_id=None):
    """
   抓取数据,并保存到CSV文件中
    :return:
    """
    page = 0
    total = 4754
    blogs = []
    for iin range(0, total // 10):
        params['uid'] = uid
        params['page'] = str(page)
        params['containerid'] = container_id
        res = requests.get(url, params=params, headers=headers)
        cards = res.json().get("cards")

        for cardin cards:
           #每条微博的正文内容
           if card.get("card_type") == 9:
                text = card.get("mblog").get("text")
                text = clean_html(text)
                blogs.append(text)
        page += 1
        print("抓取第{page}页,目前总共抓取了 {count} 条微博".format(page=page, count=len(blogs)))
        with codecs.open('weibo1.txt', 'w', encoding='utf-8')as f:
            f.write("\n".join(blogs))


将爬取到的微博数据,保存在weibo1.txt文件里面,作为词元处理数据源。

下一步进行分词处理并构建词云。
爬虫了所有数据之后,先进行分词,这里用的是结巴分词,按照中文语境将句子进行分词处理,分词过程中过滤掉停止词,处理完之后找一张参照图,然后根据参照图通过词语拼装成图。
由于在MAC环境进行相关词云分析处理,wordcloud如果没有添加MAC环境下的中文字体库路径,将会出现中文乱码现象,因此,对原文的中文字体库路径做了更改,改为MAC环境下的字体库路径

def generate_image():
    data = []
    jieba.analyse.set_stop_words("./stopwords.txt”)

    alice_coloring = imread('./52f90c9a5131c.jpg', flatten=True)
    ##从背景图片生成颜色值
    image_colors = ImageColorGenerator(alice_coloring)

    with codecs.open("weibo1.txt", 'r', encoding="utf-8")as f:
        for textin f.readlines():
            data.extend(jieba.analyse.extract_tags(text, topK=20))
        data =" ".join(data)
        mask_img = imread('./52f90c9a5131c.jpg', flatten=True)
        wordcloud = WordCloud(
#            font_path='msyh.ttc’,
     ##添加MAC路径的中文字体库宋体作为标准字体库 
            font_path='/Library/Fonts/Songti.ttc',
            background_color='white',
            mask=mask_img
        ).generate(data)
       

        plt.imshow(wordcloud.recolor(color_func=image_colors, random_state=3),
                    interpolation="bilinear")
        plt.axis('off')
        plt.savefig('./heart2.jpg', dpi=1600)


至此,完成了从依赖库安装、Python微博数据采集、Python构建简单爬虫、Python分词处理并构建词云这一系列过程,完成效果如下:


在完成了《程序员的七夕应该这么过》这篇文章的主要思路之后,我本人对于最后的结果呈现效果并不是很满意,所以,进行了二次词云分解处理,思路来自于:http://www.cnblogs.com/lyrichu/p/6151265.html
最后的呈现结果如下所示:多了彩色效果好看多了。


        最后,就是整体工作的总结了。在这篇文章中,介绍到的内容可以说是很多了,在很多内容上,我还只是处于知其然而不知其所以然的基础上,代码完整性也都是来自于《程序员的七夕应该这么过》。
       
       不过对于Python小白的我,刚刚接触Python这个领域的世界,也被Python这个神奇的世界给迷住了。正所谓纸上得来终觉浅,绝知此事要躬行。我们看那诸多的技术博客,往往存在这样的两种人,一种人认为,哇,如此高大上,定是难以企及的物种;一种人则认为,不过如此,三两行代码而已,我何必动手,欣赏就好了。这样子,少了实战,一切都是镜花水月一般。  就比如我,若是没有经过这一天的实战折腾,又怎么会知道MAC 下Python3的安装,Conda的国内镜像源加速、wordcloud的中文乱码解决等等等,这些都是在实际开发中的经验。
         
        所以啊,生命在于折腾啊。
        不过,七夕都过了,我这要为谁做画像呢??难过一秒钟。