python爬虫----b站的弹幕获取
这次逛到b站的音乐里面的我以歌声寄明月中的洛天依原创的《独醉宣月》,感觉是一首良曲,画风也很不错!所以就对它起了“歹徒之心”,而去把弹幕给获取来作词云。
导包
import requests-----网页请求
import time-----延时操作
import jieba----分词操作
import numpy as np-----图片格式转换为数组
from PIL import Image-----图片的读取
from wordcloud import WordCloud as wc----词云制作
网页分析
https://www.bilibili.com/video/av1490046/,这是目标资源。通过检查元素-->netword,去寻找有关弹幕的链接,会发现到一个与众不同的东西,名为list.so?oid=XXXX的目标。选中它直接点击preview并没有什么内容,正当我们去查看的它请求头的时候,把它的url重新去搜索一遍就会发现一丝不可告人的秘密了!
list.so?oid=xxxx的结果,这技术我们要找的弹幕资源了!
网页获取和解析
把所有的操作都封装成的一个类Bilibili,初始化就设置好请求头跟url以及弹幕的获取,由于弹幕的数据是放在一个xml文件的,所以就把这个目标的文件给下载了,再用xpath解析xml文档,xpath的作用在于快速去查找到想要的目标。
[code]"""docstring for Bilibili""" def __init__(self,oid): self.headers={ 'Host': 'api.bilibili.com', 'Connection': 'keep-alive', 'Cache-Control': 'max-age=0', 'Upgrade-Insecure-Requests': '1', 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.92 Safari/537.36', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8', 'Accept-Encoding': 'gzip, deflate, br', 'Accept-Language': 'zh-CN,zh;q=0.9', 'Cookie': 'finger=edc6ecda; LIVE_BUVID=AUTO1415378023816310; stardustvideo=1; CURRENT_FNVAL=8; buvid3=0D8F3D74-987D-442D-99CF-42BC9A967709149017infoc; rpdid=olwimklsiidoskmqwipww; fts=1537803390' } self.url='https://api.bilibili.com/x/v1/dm/list.so?oid='+str(oid) self.barrage_reault=self.get_page() # 获取信息 def get_page(self): try: # 延时操作,防止太快爬取 time.sleep(0.5) response=requests.get(self.url,headers=self.headers) except Exception as e: print('获取xml内容失败,%s' % e) return False else: if response.status_code == 200: # 下载xml文件 with open('bilibili.xml','wb') as f: f.write(response.content) return True else: return False # 解析网页 def param_page(self): time.sleep(1) if self.barrage_reault: # 文件路径,html解析器 html=etree.parse('bilibili.xml',etree.HTMLParser()) # xpath解析,获取当前所有的d标签下的所有文本内容 results=html.xpath('//d//text()') return results
弹幕去重
先把弹幕内容存储到一个results的空列表中去,每次都要判断当前的列表是否存在该元素,不存在就添加,否则,就添加到double_barrage列表和barrage的集合去,方便下面的弹幕内容的重复数量的统计。
[code]# 弹幕去重 def remove_double_barrage(self): ''' double_arrage:所有重复弹幕的集合 results:去重后的弹幕 barrage:每种弹幕内容都存储一遍 ''' double_barrage=[] results=[] barrage=set() for result in self.param_page(): if result not in results: results.append(result) else: double_barrage.append(result) barrage.add(result) return double_barrage,results,barrage
弹幕重复内容的计数和词云的制作
[code]# 弹幕重复计算和词云的制作 def make_wordCould(self): double_barrages,results,barrages=self.remove_double_barrage() # 重词计数,结果写进txt文件 with open('barrages.txt','w') as f: for barrage in barrages: # 数量的统计 amount=double_barrages.count(barrage) f.write(barrage+':'+str(amount+1)+'\n') # 设置停用词 stop_words=['【','】',',','.','?','!','。'] words=[] if results: for result in results: for stop in stop_words: # 去除上面的停用词,再拼接成字符串 result=''.join(result.split(stop)) words.append(result) # 列表拼接成字符串 words=''.join(words) words=jieba.cut(words) words=''.join(words) luo=np.array(Image.open('洛天依.jpg')) w=wc(font_path='C:/Windows/Fonts/SIMYOU.TTF',background_color='white',width=1600,height=1600,max_words=2000,mask=luo) w.generate(words) w.to_file('luo.jpg')
实现的效果
词云的制作
弹幕重复内容的计数
项目链接:链接:https://pan.baidu.com/s/1EyCYYXtQNBl0ZPEMG_RyjQ 密码:l22z
欢迎来pick!
阅读更多- 使用eclipse+python编写爬虫获取python百科的1000条词条
- python爬虫笔记(一):页面的获取(一)
- python3写爬取B站视频弹幕功能
- Python新手写出漂亮的爬虫代码2——从json获取信息
- Python 网络爬虫与信息获取(一)—— requests 库的网络爬虫
- python 2.7 用chardet解决爬虫获取网页编码的识别判断和转换问题
- 从零开始编写简易python爬虫:每日房价的获取
- 关于加快python爬虫获取页面的方法
- python编写爬虫获取区域代码-递归获取所有子页面
- 复杂的网页爬虫,python获取网页指的格式数据
- Python爬虫_简单获取百度贴吧图片
- Python 网络爬虫 009 (编程) 通过正则表达式来获取一个网页中的所有的URL链接,并下载这些URL链接的源代码
- 零基础掌握百度地图兴趣点获取POI爬虫(python语言爬取)(基础篇)
- python爬虫获取淘宝妹子信息和相片
- python爬虫-->获取数据
- python爬虫(9)获取动态搞笑图片
- python爬虫之爬取CQU毕业设计网批量获取数据
- python简易爬虫编写--图片获取
- python爬虫之获取豆瓣电影信息
- Python 爬虫笔记(获取整个站点中的所有外部链接)