B站弹幕爬取(保存文本、排行榜、生成词云)的自我总结。(python)(新手)

B站弹幕爬取(保存文本、排行榜、生成词云)的自我总结。(python)

首先关于模块的下载,使用国内镜像源,格式为:
pip install -i http://pypi.douban.com/simple/ xxxxxx --trusted-host pypi.douban.com

第一步:用requests库发送请求

        headers = {
            "User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) \
        AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1"
        }
        html = requests.get(url=bili_url, headers=headers).content.decode('utf-8')

encode:编码
decode:解码

#这里的.content就是读取源文件字节流,随后将该字节流编码为Unicode编码

用正则表达式获取弹幕id

danmuID = re.findall(r"comment: '//comment.bilibili.com/' \+ (.*?) \+ '.xml',", html)

解析html,提取xml文件中标签中的文字

danmu_file = etree.HTML(response.content) # 解析html
danmu_list = danmu_file.xpath("//d/text()")

返回包含弹幕的列表之后,就可以对其进行操作了

统计相同弹幕次数:

def count_sentence(video_url):
    danmu_list = analysis_bili(video_url)  # 获得弹幕列表,analysis_bili为返回弹幕列表的函数
    count = {}  # 创建字典
    for sentence in danmu_list:
        if len(sentence) == 1:
        continue
    else:
        count[sentence] = count.get(sentence, 0) + 1
    items = list(count.items())  # 转换成列表
    items.sort(key=lambda x: x[1], reverse=True)  # 对列表排序sort,true:降序
    top = eval(input("请输入排行榜数量:"))
    for i in range(top):
        w, times = items[i]
        space = ' '* count_ascii(w)  # 统计ascii字符的个数,补齐空格对齐
        print("TOP:{4:<3}{0:{2}<30}{3}{1:{2}<10}{3}".format(w, times, chr(12288), space, i + 1))

保存.txt文本:

def save_txt(video_url):
    danmu_list = analysis_bili(video_url)  # 获得弹幕列表
    print("保存中......")
    with open("danmu.txt", 'w', encoding='utf-8') as f:
        for line in danmu_list:
            f.write(line + '\n')
    print("保存成功!文件已保存到当前工作目录下。")
    print("*" * separator_len) # separator = '*'*60

统计词频:

def count_words(video_url):
    danmu_list = analysis_bili(video_url)  
    txt = "".join(danmu_list)   # 把列表转换为字符串    
    words  = jieba.lcut(txt) 
    counts = {}
    for word in words:
        if len(word) == 1:
            continue
        else:
            counts[word] = counts.get(word, 0) + 1
    items = list(counts.items())
    items.sort(key=lambda x: x[1], reverse=True)
    top = eval(input("请输入排行榜数量:"))
    for i in range(top):
        w, times = items[i]
        space = ' '* count_ascii(w)  # 统计ascii字符的个数,补齐空格对齐
        print("TOP:{4:<3}{0:{2}<20}{3}{1:{2}<10}{3}".format(w, times, chr(12288), space, i + 1))
    print("*" * separator_len)

生成词云:

def word_cloud(video_url):
    danmu_list = analysis_bili(video_url)
    danmustr= ''.join(danmu_list)   # 把列表转换为字符串
    words = list(jieba.cut(danmustr))   # 分词
    fnl_words = [word for word in words if len(word)>1]  # 去掉单字

    wc = wordcloud.WordCloud(width=1000, font_path='simfang.ttf',height=800)    # 一定要设定字体,否则中文显示不出来
    wc.generate(' '.join(fnl_words))
    wc.to_file(r"danmu_pic.png") # 保存文件

关于 :generate(text) #根据文本生成词云

设计过程中遇到的问题:
由于是新手中的新手,几乎所有都是现学的,包括requests、re、wordcloud、lxml…(啥时候才能成为大佬啊…)
学到的东西:

以前连镜像源都不知道是啥,现在能熟练使用了,也不用记住命令,直接保存到一个txt里,需要的时候改一改,然后复制粘贴就行。

下载wordcloud遇到的问题:出现了一堆报错,安装VS后就安装成功了。

从requests学到,发送请求要先伪装头部#headers,同时要.content.decode(‘utf-8’)。用re找到自己想要爬取的内容,而关于lxml和xpath函数还是有疑问。

前三个功能还是比较简单的,要注意列表、字典、字符串的转换。熟练使用 # join strip split等函数

而 isascii 函数第一次见到,好像3.7以上的版本才有,在对齐文本上起了很大的帮助。

关于wordcloud模块,wc = wordcloud.WordCloud(…),生成wc这个对象之后,再wc.generate(text)生成词云,wc.to_file() 生成文件。# 含.jpg和.png
但在打包上出现了很多问题
学会了 cd 打开目录,pyinstaller -F xx 打包
但打包后一打开就闪退,原因出在wordcloud上。(我是用手机录视频一帧一帧看才看到报错的)
上传不了图片,总之在找一堆资料的时候找到一个大佬的帖子才解决了这个问题,原因出在绝对路径和相对路径的问题上。问题解决的链接:
https://blog.csdn.net/Beyond_F4/article/details/88706837
同时,stopwords文件要和exe处于同一个目录。
而后在重新安装python3.7(原来用3.5)之后,这个问题又出现了,然后按着原来的办法去改之后,发现改不了,会弹出python [Errno 13] Permission denied 的报错,原因是权限出了问题,在一番折腾后,改完了wordcloud函数,打包文件依旧不能运行,报错信息提示stopwords不在xxx文件夹里面。对比了之前的报错信息发现,这次报错的文件夹位置和之前的不一样,在users里,而且文件夹的名字每次都不一样,我又陷入了苦恼。。。最后在我重新安装3.5又重新安装3.7反复几次后,问题就解决了。害,所以说实话还是不知道问题出在哪。

安装python时学到了:
一开始用cmd要pip的时候,显示’pip’ 不是内部或外部命令,也不是可运行的程序或批处理文件,于是就要添加环境变量。具体操作https://blog.csdn.net/miss85246/article/details/81069276。
至此,一个小项目就总结完毕了,虽然很简单的项目,但对于我这个新手中的新手仍然学到了很多,总结起来花了一个多小时,但制作过程却花了我将近十天和好多头发
先写到这把,以后再来补充,希望能慢慢成长为大佬。路还很长啊

你可能感兴趣的:(新手)