首先关于模块的下载,使用国内镜像源,格式为:
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。
至此,一个小项目就总结完毕了,虽然很简单的项目,但对于我这个新手中的新手仍然学到了很多,总结起来花了一个多小时,但制作过程却花了我将近十天和好多头发
先写到这把,以后再来补充,希望能慢慢成长为大佬。路还很长啊