欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

爬虫实战-抓取微博用户文本数据并生成词云(小白入门)

程序员文章站 2024-03-26 08:43:29
...

作为爬虫小白,代码偏向简单,大佬勿喷~

本次使用语言:Python
本次使用库:requests、wordcloud、jieba

思路

通过尝试,在网页版微博死活找不出文本url(可能是能力有限),在移动端微博找到了,所以推荐大家爬取移动端微博数据。
移动端微博网址:https://m.weibo.cn/
1.此次爬取的是“方方”的文本,进入开发者模式,找到名为"getIndex…“的接口。可以看到Preview里有id和text。
爬虫实战-抓取微博用户文本数据并生成词云(小白入门)
2.进入此url,发现没有中文text,对此疑惑不解。搜索id发现有多个匹配,推断id为微博的编号。
此外,在url后加上"&page="可以实现翻页
爬虫实战-抓取微博用户文本数据并生成词云(小白入门)
3.为了找到text,点击单个微博,发现网址后面跟了一串数字,推测可能是ID。然后查看网页源代码,发现url跟的确实是ID,并且此url中包含了发布时间"created_at”,文本"text"。好,我们需要爬取的内容就基于此url了。
爬虫实战-抓取微博用户文本数据并生成词云(小白入门)
爬虫实战-抓取微博用户文本数据并生成词云(小白入门)
4.将爬取的text进行清理使之剩下中文,然后使用jieba分词,最后生成词云。

代码

import requests
import re
from matplotlib import pyplot as plt
from wordcloud import WordCloud
import matplotlib.pyplot as plt  #绘制图像的模块
import  jieba                    #jieba分词
plt.rcParams['font.sans-serif']=['SimHei'] #解决中文乱码

'''
~总思路:(找接口是真的麻烦)
0.网页版微博找了半天没找到接口,在移动端可以找到,移动端微博:https://m.weibo.cn/
1.Chrome浏览器的开发者工具下找到getIndex?网址。
2.先爬取微博ID存入列表。
3.然后找到每个ID相对应的微博url,爬取微博内容和发布时间。
4.清理数据,只剩下中文。
5.利用jieba分词。
6.画出词云。
'''
'''
函数说明:
getID():爬取微博ID
getText():爬取微博的文本即发表时间
clearText():清理文本,只保留中文
makeWordCloud():分词,绘图
'''
def getID(ID):
    print("爬取微博ID")
#    ID = []
    for p in range(0,5): #自己设置页数
        #经过尝试,在网址后面加“&page=”可以翻页
        URL = "https://m.weibo.cn/api/container/getIndex?uid=1222425514&luicode=10000011&lfid=231093_-_selffollowed&type=uid&value=1222425514&containerid=1076031222425514"+"&page="+str(p)
        try:    
            r = requests.get(url = URL, headers = header)        
            r.raise_for_status()
            r.encoding = r.apparent_encoding
            IDD = re.findall('"id":"(.*?)"',r.text) #匹配id,IDD为当前页面的所有id
            ID += IDD #将当前页面的id加入到总ID列表
        except:
            print("爬取失败")   
    print(ID)
    return ID

def getText(ID, text):
    print("每条微博的text爬取:")
    text = []
    textsingle = []
    for i in range(len(ID)):
        print("ID:"+ID[i])
        #url后加微博ID可查看此微博的信息,其中text为文本,created_at为发表时间
        url = "https://m.weibo.cn/detail/"+ID[i]
        print(url)
        try:    
            r = requests.get(url = url, headers = header)        
            r.raise_for_status()
            r.encoding = r.apparent_encoding
            createTime = re.findall('"created_at": "(.*?)"',r.text) #匹配发表时间
            print("create at:"+createTime[0])
            print("~ ~ ~ ~ ~ ~ ~")
            textsingle = re.findall('"text": "(.*?)"',r.text) #匹配此微博文本
            text += textsingle #将此微博文本加入总微博文本列表
        except:
            print("爬取失败")
    TEXT = ''
    for i in range(len(text)):
        TEXT = TEXT + text[i] #将列表转换成字符型TEXT,便于分词
    print("爬取微博个数:"+str(len(ID)))
    return TEXT

def clearText(TEXT):
    rule = re.compile(u"[^\u4e00-\u9fa5]") #匹配非中文字符
    TEXT = rule.sub('',TEXT) #将非中文字符替换为空
    return TEXT

def makeWordCloud(TEXT):    
    cut_text = " ".join(jieba.cut(TEXT)) #jieba分词,空格字符分隔
    print(cut_text)
    wordcloud = WordCloud(
       #设置字体,不然会出现口字乱码,文字的路径是电脑的字体一般路径,可以换成别的
       font_path="C:/Windows/Fonts/simfang.ttf",
       #设置了背景,宽高
       background_color="white",width=1000,height=880).generate(cut_text)
    
    plt.imshow(wordcloud, interpolation="bilinear")
    plt.axis("off")
    plt.show()

def main():
    header = {
        'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36'
        }
    ID = []
    text = []
    ID = getID(ID)
    text = getText(ID,text)
    text = clearText(text)
    makeWordCloud(text)
    
main()

结果

(此例子爬取页数为5页,爬取微博条数为58,微博发布时间从2020.3.31 - 2020.4.8)
爬虫实战-抓取微博用户文本数据并生成词云(小白入门)
分词结果:
爬虫实战-抓取微博用户文本数据并生成词云(小白入门)
词云:
爬虫实战-抓取微博用户文本数据并生成词云(小白入门)
附加网址:
如何生成词云
https://mp.weixin.qq.com/s/FUwQ4jZu6KMkjRvEG3UfGw