Python爬取韩寒微博生成词云图片

参考资料:
用Python爬取微博数据生成词云图片
上面文章的代码地址
JSON查看器下载

结果:

大家 86
电影 82
朋友 76
我们 72
自己 61
一个 58
感谢 52
喜欢 41
可以 38
后会无期 36
这个 34
你们 33
就是 32
知道 29
很多 29
什么 28
他们 27
已经 27
希望 25
导演 24
最后 22
今天 22
哈哈哈 21
韩寒 21
微博 20
因为 20
看到 20
没有 20
一切 19
乘风破浪 19
一些 19
照片 19
一起 18
快乐 18
世界 18
有人 18
中国 17
拉力 17
锦标赛 17
车手 17
觉得 17
现在 17
这样 17
一下 16
时候 16
还有 16
获得 15
转发 15
还是 15
以后 15
上海 14
全国 14
不能 14
赛车 14
比赛 14
地方 14
先生 14
留言 14
不是 14
不会 14
一定 14
故事 14
一次 14
总冠军 13
汽车 13
老师 13
不要 13
辛苦 13
拍摄 13
海报 13
生活 13
一句 13
一直 12
上映 12
谢谢 12
车队 12
抽取 12
发现 12
观众 12
所以 12
欢迎 12
年度 12
杀青 12
理解 11
重要 11
昨天 11
视频 11
看过 11
一年 11
如果 11
这些 11
一部 11
怎么 11
感觉 11
以及 10
城市 10
以前 10
后来 10
只能 10
他人 10

代码:

import requests
import os
import hashlib
import json
import re
import matplotlib.pyplot as plt
from wordcloud import WordCloud
from scipy.misc import imread
import jieba
import jieba.analyse

URL = 'https://m.weibo.cn/api/container/getIndex'


headers= {
    'host':'m.weibo.cn',
    'Referer':'https://m.weibo.cn/p/index',
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36'
}

params = {
    'uid':'1191258123',
    'luicode':'10000011',
    'featurecode':'20000320',
    'type':'uid',
    'value':'1191258123',
    'page':'{page}',
    'containerid':'1076031191258123',
}


def get_urls_md5_hash(url):
    # 根据urls计算哈希值作为文件名
    md5 = hashlib.md5()
    md5.update(url.encode())
    return md5.hexdigest()


# 第一次从网络获取并保存到硬盘,第二次从硬盘读取
# 有些请求的链接是一样的,参数不一样,index提供区别
def get_url_html(url,index = '',**kargs):
    md5_value = get_urls_md5_hash(url+index)
    filename = '{md5}.html'.format(md5=md5_value)

    filedir = __file__.replace('main.py','html')
    if os.path.exists(filedir):
        os.chdir(filedir)
    else:
        os.mkdir(filedir)
        os.chdir(filedir)

    if os.path.exists(filename):
        print('正在读取本地文件{url},index:{index}...'.format(url=url,index=index))
        with open(filename,'rb') as f:
            return f.read()
    else:
        print('正在访问链接{url},index:{index}...'.format(url=url,index=index))
        # 在网站爬取错误的时候输入错误信息,然后继续
        try:
            txt = requests.get(url,params=params, headers=headers).text
        except Exception as e:
            print('读取网页失败,原因:{error}'.format(error=repr(e)))

        if txt:
            with open(filename,'w') as f:
                f.write(txt)

            return txt
        else:
            return None


def clean_txt(txt):
    pattern = re.compile(r'//<.*?>@.*|//@.*|<.*>|转发微博|//:|Repost|,|?|。|、|分享图片|回复@.*?:')
    return re.sub(pattern, '', txt)


def fetch_data():
    total = 595

    index = 0
    base_path = __file__.replace('main.py','')
    # while os.path.exists(base_path + 'hanhan{index}.txt'.format(index = index)):
    #     index += 1
    filename = base_path + 'hanhan{index}.txt'.format(index = index)

    # 创建新文件
    with open(filename,'w',encoding='utf-8') as f:
        weibo_cnt = 0
        blogs = []
        for i in range(0,total//10+1):
            params['page'] = str(i+1)

            request_txt = get_url_html(URL,str(i),params=params,headers = headers)
            if request_txt:
                cards = json.loads(request_txt).get('cards')

                for card in cards:
                    if card.get('card_type') == 9:
                        txt = card.get('mblog').get("text")
                        if weibo_cnt == 438:
                            print(txt)

                        txt = clean_txt(txt)
                        if txt:
                            blogs.append(txt)
                            # f.write('\n第{cnt}条微博:'.format(cnt = weibo_cnt) + txt)
                            f.write('\n' + txt)
                            weibo_cnt += 1

                print("抓取第{page}页,目前总共抓取了 {count} 条微博".format(page=i+1, count=len(blogs)))


def generate_img():
    from collections import Counter

    os.chdir(__file__.replace('/main.py', ''))

    jieba.analyse.set_stop_words('stopwords.txt')

    with open('hanhan0.txt', 'r',encoding='utf-8') as f:
        txt = f.read()

    words = [word for word in jieba.cut(txt, cut_all=False) if len(word) >= 2]
    c = Counter(words)

    for word_freq in c.most_common(100):
        word, freq = word_freq
        print(word, freq)



# def grey_color_func(word, font_size, position, orientation, random_state=None,
#                     **kwargs):
#     s = "hsl(0, 0%%, %d%%)" % 0
#     return s


# def generate_img2():
#     data = []
#
#     os.chdir(__file__.replace('/main.py', ''))
#
#     jieba.analyse.set_stop_words("stopwords.txt")
#
#     with open("hanhan0.txt", 'r', encoding="utf-8") as f:
#         for text in f.readlines():
#             data.extend(jieba.analyse.extract_tags(text, topK=20))
#         data = " ".join(data)
#         mask_img = imread('original.bmp', flatten=True)
#         wordcloud = WordCloud(
#             font_path='msyh.ttc',
#             background_color='white',
#             mask=mask_img
#         ).generate(data)
#         plt.imshow(wordcloud.recolor(color_func=grey_color_func, random_state=3),
#                    interpolation="bilinear")
#         plt.axis('off')
#         plt.savefig('xxxxxxxxxx.jpg', dpi=1600)

def main():
    fetch_data()
    generate_img()


if __name__ == '__main__':
    main()

你可能感兴趣的:(Python爬取韩寒微博生成词云图片)