爬取B站评论区并且生成词云图

已实现功能:爬取评论区内容并且生成云图。然后保存在桌面。
未实现功能:修改词云图形状没有实现。(如:苹果形状)报错没有解决。
视频效果:

爬取B站评论区并且生成词云图

在这里插入图片描述
创建一个B站评论爬虫改.py文件,这个文件功能是输入一个B站链接。爬取评论区,并且在桌面生成一个.txt文件

import random
import requests
import time
import re



headers = {
    # 'user-agent': 'Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/96.0.4664.110Safari/537.36Edg/96.0.1054.62',
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.106 Safari/537.36',
}

# 获取第一个aid作为文件名
def get_oid(url):
    resp = requests.get(url, headers=headers).text
    # print(resp)
    oid = re.findall('"aid":(.*?),', resp)[0]
    return oid


def get_second_reply(rpid, page):
    page_num = 1
    while True:
        params = {
            'jsonp': 'jsonp',
            'pn': page_num,
            'type': '1',
            'oid': aid,
            'ps': '10',
            'root': rpid,
            '_': '1640190856379',
        }
        second_url = 'https://api.bilibili.com/x/v2/reply/reply?'
        resp = requests.get(url=second_url, headers=headers, params=params).json()
        count = resp['data']['page']['count']
        replies = resp['data']['replies']
        for reply in replies:
            reply_create_time = reply['ctime']
            reply_uname = reply['member']['uname']
            reply_content = reply['content']['message'].replace('\n', '').replace(',', ',')
            reply_rpid = reply['rpid']
            line = '{}\n'.format(reply_content)
            fd.write(line)
        print('\r当前页码: {} -*- 二级评论: {}'.format(page, page_num), end='')
        time.sleep(random.uniform(0.5, 0.7))
        page_num += 1
        if page_num * 10 >= count:
            break


def get_first_reply():
    page_num = 0
    while True:
        params = {
            'jsonp': 'jsonp',
            'next': page_num,
            'type': '1',
            'oid': aid,
            'mode': '3',
            'plat': '1',
            '_': '1640189054670',
        }
        first_url = 'https://api.bilibili.com/x/v2/reply/main?'
        resp = requests.get(url=first_url, headers=headers, params=params).json()
        print('\r当前页码: {} -* 二级评论: 0\n'.format(page_num), end='')
        page_num = resp['data']['cursor']['next']
        replies = resp['data']['replies']
        if not replies:
            break
        for reply in replies:
            reply_create_time = reply['ctime']
            reply_uname = reply['member']['uname']
            reply_content = reply['content']['message'].replace('\n', '').replace(',', ',')
            reply_rpid = reply['rpid']
            reply_count = reply['rcount']
            line = '{}\n'.format( reply_content)
            fd.write(line)
            if reply_count != 0:
                get_second_reply(rpid=reply_rpid, page=page_num)
        time.sleep(random.uniform(0.2, 0.7))
aid = get_oid(url=input('url: '))
fd = open('C://Users//Wfy//Desktop//{}.txt'.format(aid), 'a', encoding='utf-8-sig')

def geturl():
    get_first_reply()
    return '{}'.format(aid)

创建词云增强.py文件,读取第一个py生成的txt文件,并且生成词云图

import jieba # 结巴分词
import wordcloud # 词云图
import imageio # 读取本地图片 修改词云图形
from imageio import imread, imwrite
import cv2
import numpy as np

# img = imageio.imread('../img/apple.jpg')
# img = imread('../img/apple.jpg')
def getPc(path):
    img = cv2.imread("../../img/apple.jpg")
    # 读取弹幕数据
    f = open('C://Users//Wfy//Desktop//{}.txt'.format(path), encoding='utf-8')
    text = f.read()
    # print(text)
    # 分词,把一句话 分割成多个词汇
    text_list = jieba.lcut(text)
    text_list = [word.strip() for word in text_list if len(word.strip())>1] # 截取大与一个字的词
    print(text_list)
    # 列表转成字符串
    text_str = ' '.join(text_list)
    print(text_str)
    # 词云图配置
    wc = wordcloud.WordCloud(
        width=5000, # 宽度
        height=5000, # 高度
        background_color='white', # 背景颜色
        mask=img, # 设置词云形状
        stopwords={'和','别人','虽然','我','了','注','doge'},
        font_path='msyh.ttc' # 字体文件
    )
    wc.generate(text_str)
    wc.to_file('C://Users//Wfy//Desktop//{}.png'.format(path))

最后写一个总的函数,调用两个py文件。main.py

import B站评论爬虫改
import 词云增强

geturl = B站评论爬虫改.geturl()

print('文件名:'+geturl)

词云增强.getPc(geturl)
  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,下面是具体步骤: 首先,我们需要导入所需的库,包括 requests、BeautifulSoup、jieba 和 wordcloud。 ```python import requests from bs4 import BeautifulSoup import jieba from wordcloud import WordCloud import matplotlib.pyplot as plt ``` 接下来,我们需要爬取百度热搜的页面内容,并使用 BeautifulSoup 进行解析,提取出热搜的关键词列表。 ```python url = 'http://top.baidu.com/buzz?b=1&fr=topindex' html = requests.get(url).text soup = BeautifulSoup(html, 'html.parser') hot_list = [] for item in soup.select('.list-table tr'): try: hot_list.append(item.select('.keyword a')[0].text) except: pass ``` 接下来,我们需要将关键词列表进行分词,并使用 jieba 库来进行分词操作。 ```python text = ' '.join(jieba.cut(''.join(hot_list))) ``` 接下来,我们就可以利用 WordCloud 库生成词云图了。首先,我们需要先设置一下词云图的参数,包括背景颜色、字体、图片尺寸等。然后,我们可以使用 `generate()` 函数来生成词云图。 ```python wordcloud = WordCloud(background_color='white', font_path='msyh.ttc', width=800, height=600).generate(text) ``` 最后,我们可以使用 matplotlib.pyplot 库中的 `imshow()` 函数来显示词云图。 ```python plt.imshow(wordcloud, interpolation='bilinear') plt.axis('off') plt.show() ``` 完整代码如下: ```python import requests from bs4 import BeautifulSoup import jieba from wordcloud import WordCloud import matplotlib.pyplot as plt url = 'http://top.baidu.com/buzz?b=1&fr=topindex' html = requests.get(url).text soup = BeautifulSoup(html, 'html.parser') hot_list = [] for item in soup.select('.list-table tr'): try: hot_list.append(item.select('.keyword a')[0].text) except: pass text = ' '.join(jieba.cut(''.join(hot_list))) wordcloud = WordCloud(background_color='white', font_path='msyh.ttc', width=800, height=600).generate(text) plt.imshow(wordcloud, interpolation='bilinear') plt.axis('off') plt.show() ``` 执行完上述代码后,就可以得到一张基于百度热搜关键词的词云图了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值