基于Requests和Ajax分析法的新浪微博关键词采集

1 项目介绍

本项目介绍使用requests模块和Ajax分析法采集微博关键词的方法。
本项目仅以“杨幂”、郑爽 、“赵丽颖”这三个关键词挖掘举例说明,如果有挖掘微博其他关键词的需求,可以更换关键词进行采集。

目标:
- 搜索关键词,如#赵丽颖#,采集底下的微博
- 采集微博用户的性别、地点、院校、标签、行业、公司、简介等信息
- 采集关键词的搜索结果微博内容(以电影举例),可分析电影的舆情评价、观影人群画像制作等

2 技术要点

  • 文本循环

  • Ajax点击

3 实现步骤

3.1 搜索微博内容爬取


import requests


def get_hot_info(kw, page):
    """
    获取热搜文章信息
    :param kw: 搜索关键字
    :return: 搜索的文章
    """
    # 使用在线URL解码器进行解码, 如下:
    #       https://m.weibo.cn/api/container/getIndex?containerid=100103type%3D1%26q%3D%E4%BA%92%E8%81%94%E7%BD%91&page_type=searchall
    # 微博的url基本地址
    url = "https://m.weibo.cn/api/container/getIndex"
    # url访问需要添加的参数
    params = {
        'containerid': '100103type=1&q=%s' % (kw),
        'page': page
    }

    # 获取页面内容,并通过ijson解析返回一个字典;
    hot_infos = requests.get(url, params).json()

    # 提取需要的微博热搜正文内容
    hot_cards = hot_infos['data']['cards']
    infos = []
    for card in hot_cards:
        for text in card['card_group']:
            if text.get('mblog'):
                infos.append(text['mblog']['text'])
    return infos

3.2 数据清洗

def data_cleaning(text):
    """
    微博数据的清洗
    :param text: 需要清洗的内容, 提取需要的中文
    :return:
    """
    import re
    pattern = '([\u4e00-\u9fa5])'
    cleanData = "".join(re.findall(pattern, text))
    return cleanData

3.3 持久化保存数据

def persistent_data(kw='996', filename='./data/996.txt', page=5):
    """
    持久化保存爬取数据到文件中, 便于数据清洗于数据分析;
    :param kw: 搜索的关键字
    :param filename: 存储的文件位置
    :param page: 爬取关键字微博信息的个数
    :return:
    """
    f = open(filename, 'w')
    for page in range(page):
        print(str(page).center(50, '*'))
        print("正在爬取第%d页" % (page + 1))
        infos = get_hot_info(kw, page + 1)
        for info in infos:
            info = data_cleaning(info)
            f.write(info + '\n')

3.4 词云展示分析


def wordcloud_analyze(filename, pngFile='./data/mao.jpg', savePngFile='./data/程序员.png'):
    """
    词云分析
    :param filename:
    :return:
    """
    import jieba
    import wordcloud
    import numpy as np
    from PIL import Image

    # 打开图片
    imageObj = Image.open( pngFile)
    cloud_mask = np.array(imageObj)

    wc = wordcloud.WordCloud(
        background_color='snow',  # 背景颜色
        font_path='/usr/share/fonts/wqy-microhei/wqy-microhei.ttc',  # 处理中文数据时
        min_font_size=5,  # 图片中最小字体大小;
        max_font_size=100,  # 图片中最大字体大小;
        margin=2,
        mask=cloud_mask,
    )

    f = open(filename)
    results = ''
    for line in f:
        line = line.strip()
        result = jieba.lcut(line)
        results += (",".join(result))

    # print(results)
    wc.generate(results)
    wc.to_file( savePngFile)

4 完整代码及效果展示

  • 完整代码
import requests


def get_hot_info(kw, page):
    """
    获取热搜文章信息
    :param kw: 搜索关键字
    :return: 搜索的文章
    """
    # 使用在线URL解码器进行解码, 如下:
    #       https://m.weibo.cn/api/container/getIndex?containerid=100103type%3D1%26q%3D%E4%BA%92%E8%81%94%E7%BD%91&page_type=searchall
    # 微博的url基本地址
    url = "https://m.weibo.cn/api/container/getIndex"
    # url访问需要添加的参数
    params = {
        'containerid': '100103type=1&q=%s' % (kw),
        'page': page
    }

    # 获取页面内容,并通过ijson解析返回一个字典;
    hot_infos = requests.get(url, params).json()

    # 提取需要的微博热搜正文内容
    hot_cards = hot_infos['data']['cards']
    infos = []
    for card in hot_cards:
        for text in card['card_group']:
            if text.get('mblog'):
                infos.append(text['mblog']['text'])
    return infos


def persistent_data(kw='996', filename='./data/996.txt', page=5):
    """
    持久化保存爬取数据到文件中, 便于数据清洗于数据分析;
    :param kw: 搜索的关键字
    :param filename: 存储的文件位置
    :param page: 爬取关键字微博信息的个数
    :return:
    """
    f = open(filename, 'w')
    for page in range(page):
        print(str(page).center(50, '*'))
        print("正在爬取第%d页" % (page + 1))
        infos = get_hot_info(kw, page + 1)
        for info in infos:
            info = data_cleaning(info)
            f.write(info + '\n')


def data_cleaning(text):
    """
    微博数据的清洗
    :param text: 需要清洗的内容, 提取需要的中文
    :return:
    """
    import re
    pattern = '([\u4e00-\u9fa5])'
    cleanData = "".join(re.findall(pattern, text))
    return cleanData


def wordcloud_analyze(filename, pngFile='./data/mao.jpg', savePngFile='./data/程序员.png'):
    """
    词云分析
    :param filename:
    :return:
    """
    import jieba
    import wordcloud
    import numpy as np
    from PIL import Image

    # 打开图片
    imageObj = Image.open( pngFile)
    cloud_mask = np.array(imageObj)

    wc = wordcloud.WordCloud(
        background_color='black',  # 背景颜色
        font_path='/usr/share/fonts/wqy-microhei/wqy-microhei.ttc',  # 处理中文数据时
        min_font_size=5,  # 图片中最小字体大小;
        max_font_size=100,  # 图片中最大字体大小;
        margin=2,
        mask=cloud_mask,
    )

    f = open(filename)
    results = ''
    for line in f:
        line = line.strip()
        result = jieba.lcut(line)
        results += (",".join(result))

    # print(results)
    wc.generate(results)
    wc.to_file( savePngFile)


if __name__ == '__main__':
    kw = '程序员'
    filename = './data/%s.txt' % (kw)
    page = 100
    # persistent_data(filename=filename, page=page)
    wordcloud_analyze(filename)
  • 效果展示
    在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/gf_lvah/article/details/89401348