本文来源吾爱破解论坛
本帖最后由 54048371 于 2020-2-18 23:03 编辑 2020-02-15-10-36-19词云.jpg (246.18 KB, 下载次数: 0)
下载附件
保存到相册
2020-02-15-10-35-52词云.jpg (209.9 KB, 下载次数: 0)
下载附件
保存到相册
无标题.png (38.66 KB, 下载次数: 0)
下载附件
保存到相册
无标题1.png (227.61 KB, 下载次数: 0)
下载附件
保存到相册
2020-2-18更新:
本次更新亮点:
1.支持输入关键词自动搜索b站视频
2.支持自定义爬取词云图片的页码范围
3.支持自定搜索排序方式,支持综合排序、按照弹幕排序等
4.支持自定义搜索视频的时长范围
注意事项:需要在代码修改你想保存词云图片的位置,这里默认了F盘,其次wordcloud需要自己设定字体文件的位置,可以自行修改,Windows字体一般保存在c盘Windows下的fonts文件夹里面,自行替换即可
食用方法:该脚本的依赖库安装可能需要费一点心思,例如wordcloud,但好在网上该问题教程丰富,简单易懂,也好上手
import re,requests,os,time
from lxml import etree
from wordcloud import WordCloud
安装好以上的库咱们就可以欢快地食用该程序啦!
附赠一TIPS:由于py库安装默认国外下载源,10k/s的速度在几百兆时代怎么能忍受所以推荐使用一下两个国内镜像
pip install -i https://pypi.douban.com/simple/ salt
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple/ salt
#用你想安装的库名称替换salt,然后复制粘贴放入cmd运行就很愉快地跑起来啦
import re,requests,os,time
from lxml import etree
from wordcloud import WordCloud
class make_word_cloud:
def __init__(self):
self.search_kw = input('请输入b站搜索关键词:')
self.page_from = int(input('从第几页开始下载?')) - 1
self.page_to = int(input('你需要下载到第几页?'))
self.order_choice = int(input('请输入搜索排序类型==综合排序-1==弹幕排序-2==点击排序-3=='))
self.duration_choice = int(input('请输入视频时长选择(x分钟以上)==00==10==20==30=='))
self.headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.163 Safari/535.1'}
# 修改浏览器头部信息
self.disk_index = 'F' #F代表词云文件将要保存到的磁盘的名称
self.path = '%s:/哔哩哔哩弹幕词云v2.0/%s/' % (self.disk_index,self.search_kw)
# self.avurl = input('请输入视频弹幕网址并按回车键')
def start_all(self):
video_page_url_list = self.get_video_url_by_kw(self.search_kw,self.page_from,self.page_to,self.order_choice,self.duration_choice)
count = 1 # 用于查看任务进度的计数,完成第x个视频
for url in video_page_url_list:
print(url) #打印当前爬取的视频地址
cid_url,title = self.get_cid_url_title(url) #获取弹幕xml地址,视频标题
time.sleep(2) #睡2秒,避免爬取太快被ban
danmu_list = self.get_danmu(cid_url) #从xml地址提取全部弹幕
if danmu_list != []:
danmu_together = ' '.join(danmu_list) #该方法从上一个方法中获取到弹幕信息列表,并用join方法做成wordcloud词云需要的形式
self.make_dir(self.path) #根据输入的地址创建文件
try:
self.word_cloud(danmu_together, self.path,title) #制作弹幕词云图片
print('完成第%s个视频'%(count))
count += 1 #计数器加一
except:
print('pass掉第%s个视频'%(count))
count += 1 #计数器加一
def request_decode(self,url):
#该方法是decode过的requests值
r = requests.session()
response = r.get(url,headers = self.headers)
content_decode = response.content.decode()
return content_decode
def request_nodecode(self,url):
# 该方法是未decode过的requests值
r = requests.session()
response = r.get(url,headers = self.headers)
content_nodecode = response.content
return content_nodecode
def get_video_url_by_kw(self,kw,page_from,page_to,order_choice,duration_choice):
if order_choice == 1:
order = 'totalrank'
elif order_choice == 2:
order = 'dm'
elif order_choice == 3:
order = 'click'
if duration_choice == 00:
duration = 0
elif duration_choice == 10:
duration = 1
elif duration_choice == 20:
duration = 2
elif duration_choice == 30:
duration = 3
search_page_url_list = []
for i in range(page_from,page_to):
search_page_url_list.append('https://search.bilibili.com/all?keyword=%s&page=%s&order=%s&duration=%s&tids_1=0'%(kw,i+1,order,duration))
print(str(search_page_url_list) + '\n' + '==找到关于%s的%s页搜索数据,进行下一步处理=='%(kw,page_to))
video_page_url_list = []
count = 1 #由于第一页xpath路径特殊,采用计数判断页码应对
for url in search_page_url_list:
html_data = self.request_nodecode(url)
tree = etree.HTML(html_data)
video_url_list1 = tree.xpath('//*[@id="all-list"]/div[1]/div[2]/ul[2]/li/div/div[1]/a/@href')
video_url_list2 = tree.xpath('//*[@id="all-list"]/div[1]/ul/li/div/div[1]/a/@href')
video_url_list3 = tree.xpath('//*[@id="all-list"]/div[1]/div[2]/ul/li/div/div[1]/a/@href')
if video_url_list1 != []:
video_url_list = tree.xpath('//*[@id="all-list"]/div[1]/div[2]/ul[2]/li/div/div[1]/a/@href') #//*[@id="all-list"]/div[1]/ul/li[1]/div/div[1]/a,//*[@id="all-list"]/div[1]/ul/li[1]/div/div[1]/a
elif video_url_list2 != []:
video_url_list = tree.xpath('//*[@id="all-list"]/div[1]/ul/li/div/div[1]/a/@href') #//*[@id="all-list"]/div[1]/ul/li[1]/div/div[1]/a,//*[@id="all-list"]/div[1]/ul/li[1]/div/div[1]/a
elif video_url_list3 != []:
video_url_list = tree.xpath('//*[@id="all-list"]/div[1]/div[2]/ul/li/div/div[1]/a/@href')
for url in video_url_list:
video_page_url_list.append(url.replace('//','https://'))
count += 1
print(str(video_page_url_list) + '\n' + '==已找到%s页数据中的所有视频URL=='%(page_to))
return video_page_url_list
def get_cid_url_title(self,avurl):
#该方法用于获取一个b站视频连接下的弹幕xml地址
content = self.request_decode(avurl)
cid = re.findall('cid=(.*?)&aid=.*&attribute=.*',content)[0]
title = re.findall('<title data-vue-meta="true">(.*?)</title>',content)[0]
print('https://api.bilibili.com/x/v1/dm/list.so?oid=%s'%(cid))
cid_url = {cid:'https://api.bilibili.com/x/v1/dm/list.so?oid=%s'%(cid)}
return 'https://api.bilibili.com/x/v1/dm/list.so?oid=%s'%(cid),title
def get_danmu(self,url):
#该方法作用于根据弹幕xml地址获取弹幕信息
content = self.request_nodecode(url)
data = etree.HTML(content)
danmu = data.xpath('//d/text()')[:-1]
print(danmu)
return danmu
def make_dir(self,path):
if not os.path.exists(path):
os.makedirs(path)
print('创建目录成功词云已保存至%s'%(path))
else:
print('目录存在,词云已保存至%s'%(path))
def word_cloud(self,text,path,title):
#使用wordcloud创建词云图片
current_time = time.strftime("%Y-%m-%d-%H-%M-%S", time.localtime())
wdcld = WordCloud(font_path='F:/scrapy/bilibili_danmu/bilibili_danmu/yahei.ttc', scale=20, max_words=100,max_font_size=25,min_font_size=10, prefer_horizontal=1.0)
#上面这一行用于设置词云图片的参数,font_path 需要修改成你系统中相应的字体文件,如果没有定义文件,中文将会显示乱码
#scale用于设置图片的清晰度,maxwords用于设置显示最大词汇量,prefer_horizontal用于设置横向字符在所有字符中的占比,这里设置为1,意为100%字符都为横向字符
wdcld.generate(text)
title = title.replace('<','').replace('>','z').replace('/','z').replace('','z').replace('|','z').replace(':','z').replace('"','z').replace('*','z').replace('?','z').replace('\\','z')
wdcld.to_file('%s%s词云.jpg' % (path,title))
#这里输出词云图片,参数为文件名和相应地址
def exe_it_loop():
#该方法用于程序的循环启动
try:
make_word_cloud().start_all()
print('运行成功')
exe_it_loop()
except:
print('运行错误')
# exe_it_loop()
make_word_cloud().start_all()
版权声明:
本站所有资源均为站长或网友整理自互联网或站长购买自互联网,站长无法分辨资源版权出自何处,所以不承担任何版权以及其他问题带来的法律责任,如有侵权或者其他问题请联系站长删除!站长QQ754403226 谢谢。