萌新学习Python爬取B站弹幕+R语言分词demo说明
代码地址如下:
http://www.demodashi.com/demo/11578.html
一、写在前面
之前在简书首页看到了Python爬虫的介绍,于是就想着爬取B站弹幕并绘制词云,因此有了这样一个简单的尝试,从搭建环境到跑通demo,不懂语法,不知含义,装好环境,查到API,跑通Demo,就是目标!纯零基础萌新!
关于环境的安装及调试过程中遇到的问题记录请移步
二、Python爬取B站弹幕
环境说明
windows8.1 x64+python3.6+scrapy1.4
参考文档:
scrapy github
scrapy document
scrapy爬虫框架入门实例
步骤说明
- 安装python3.6
- 安装scrapy1.4
- 建立scrapy demo
- 跑通demo遇到问题、解决问题
- 更改demo为B站弹幕爬取demo
我这边是按照参考文档中 scrapy爬虫框架入门实例这个demo来做的,这个文章里面无论是介绍还是scrapy的入门都非常详细,建议大家按照- 这个来入门,但是由于慕课网的结构样式以及更改了,所以demo是跑不起来的,因此我换成了爬取B站的弹幕demo。截止2017年9月2日亲测可跑通。
Demo说明
1. 安装scrapy成功之后建立项目scrapytest
scrapy startproject scrapytest
2. demo目录
本demo目录仅保留当前demo可用的文件,且文件名字不同于scrapy自动生成的文件名字,对于未涉及到的文件进行了删除
│ scrapy.cfg//项目的配置文件
└─scrapytest│ CourseItems.py//定义一个容器保存要爬取的数据│ MyPipelines.py//项目中的pipelines文件.│ settings.py//项目中的设置文件.├─spiders│ │ data.json//爬取数据生成的文件│ └─ Myspider.py//爬虫主代码
3. demo代码
创建CourseItems.py文件
定义一个容器保存要爬取的数据。为了定义常用的输出数据,Scrapy提供了Item类。Item对象是种简单的容器,保存了爬取到得数据。 其提供了 类似于词典(dictionary-like)的API以及用于声明可用字段的简单语法。由于最后输出的只要弹幕的内容,所以容器中只定义了弹幕的内容
#引入文件
import scrapy
class CourseItem(scrapy.Item):#弹幕内容content = scrapy.Field()
编写爬取代码Myspider.py
bilibili的弹幕是在xml文件里,每个视频都有其对应的cid和aid,我们取到cid中的数字放入http://comment.bilibili.com/+cid+.xml,即可得到该视频对应的cid。
cid取法:cid在源码中是没有找到的,目前我的做法是在页面上F12,然后查找cid,该cid即为弹幕页的标识,如果有可以通过代码查到的方法,还请告知。目前例子中的cid有1000多条弹幕,建议大家换个少的进行测试。
弹幕的xml文件结构非常简单,所以通过Xpath简单解析即可
import scrapy
#引入容器
from scrapytest.CourseItems import CourseItemclass Myspider(scrapy.Spider):#设置namename = "Myspider" //启动项目时所用name#设定域名allowed_domains = ["bilibili.com"]#填写爬取地址start_urls = ["http://comment.bilibili.com/2015358.xml"]#编写爬取方法def parse(self, response):#实例一个容器保存爬取的信息item = CourseItem()#这部分是爬取部分,使用xpath的方式选择信息,具体方法根据网页结构而定#直接爬取弹幕内容str0 = ''for box in response.xpath('/i/d/text()'):#获取每一条弹幕内容str0 += box.extract()+',';#返回信息item['content'] = str0;//最后输出的结构是值:字符串的结构,详细见输出图yield item
编写MyPipelines.py处理数据
当成功获取信息后,要进行信息的验证、储存等工作,这里只进行简单的将数据存储在json中的操作。
#引入文件
from scrapy.exceptions import DropItem
import jsonclass MyPipeline(object):def __init__(self):#打开文件self.file = open('data.json', 'w', encoding='utf-8')#该方法用于处理数据def process_item(self, item, spider):#读取item中的数据line = json.dumps(dict(item), ensure_ascii=False) + "\n"#写入文件self.file.write(line)#返回itemreturn item#该方法在spider被开启时被调用。def open_spider(self, spider):pass#该方法在spider被关闭时被调用。def close_spider(self, spider):pass
注册Pipeline
找到settings.py文件,这个文件时爬虫的配置文件,在其中添加
ITEM_PIPELINES = {'scrapytest.MyPipelines.MyPipeline': 300,
}
上面的代码用于注册Pipeline,其中scrapytest.MyPipelines.MyPipeline为你要注册的类,右侧的’300’为该Pipeline的优先级,范围1~1000,越小越先执行。(ps:这个并没有详细了解)
4. 运行demo
在Myspider.py的同级下执行cmd控制台,运行一下命令。
scrapy crawl MySpider
5. 运行结果
这是一个json的文件,json文件的输出结构更改在Myspider.py中,我改成这种通过逗号来连接每一条弹幕时是为了之后方便分词。大家也可以把代码改了改成另一种展示方式
(便于分词的展示方式)
(另一种方式)
到此python爬取B站弹幕demo结束,接下来我们通过拿到的json文件去R语言中进行分词。
三、R语言分词实例
环境说明
window8.1 x64+R3.4.2+jiebaR插件+rJson插件+RStudio编辑器+wordcloud2插件
R语言官网
Rstudio下载地址
R语言中文分司包jiabaR
R和json的傻瓜式编程
R语言w3c教程
jiebaR中午分词文档
wordcloud2 gtihub
R语言︱文本挖掘——词云wordcloud2包
步骤说明
- 安装R、Rstudio、jiebaR、rJSON
- 引入JSON文件
- 分词处理
- 停止词处理
- 过滤数字及字母
- 产生数据
- 调用wordcloud2绘制词云
关于jiebaR
分词基本是按照R语言中文分司包jiabaR这个博客的demo来进行的。该博文中对于jiebaR
的各种函数介绍的非常全面,因此下面demo将不对代码内容进行详细介绍。demo中的各种路径请自行更改。
demo说明
只有一个jiebaR.R文件即完成了分词和绘制词云,代码如下:
#调入分词的库
library(“jiebaR”)
library(“rjson”)
#这里读取的`python`爬取的`json`文件,拿道了对象中`content`键的值,该值是一长串字符串,在爬虫输出的时候通过逗号来连接字符串,因此分词时是通过逗号进行的分词
myfile<-fromJSON(file = "F:/gitlab/py/scrapytest/scrapytest/spiders/data.json")$content#预处理,这步可以将读入的文本转换为可以分词的字符,本demo通过逗号进行分词myfile.res<-myfile[myfile!=","]#调用分词引擎worker函数 stop_word为停止词设置
wk = worker(stop_word ='F:/R/stopw.txt')#segment为分词结果
segment = wk[myfile.res]#对于分词结果进行正则过滤,去掉数字及字母
segment = gsub("[a-zA-Z\\/\\.0-9]+","",segment)#计算词频,该data即为传入词云的数据
data <- freq(segment)#引入wordcloud2,在引入之前请先安装library(wordcloud2) #调用wordcloud2函数绘制词云,该函数参数在github已有介绍wordcloud2(data,size = 1, fontFamily = "微软雅黑",color = "random-light"")
(计算词频后的结果)
(我一开始万万没有想到我分出来会这么丑)
问题说明
1.计算词频
由于弹幕的条数比较多,分词过滤后的词频很多,没有细查找如何再进一步的排序过滤筛选词,所以导致词云的结果并不是很好
2. 关键词提取
个人认为通过关键字提取出的词云会更好一旦,jiabaR提供了关键字提取的方法及提取的结果,结果上面是词语出现频率。
#提取150个关键字keys = worker("keywords",topn=150)
#关键字结果re = vector_keywords(segment,keys)
(提取出的关键字结果)
从图上可以看出这个关键词比较适合用来做词云,但是这里遇到了问题,关键字的结果时vector类型,并不能直接作为wordcloud的参数,从测试结果上来看wordcloud的参数接收data.frame类型,且要有词的内容和词频,当我通过如下代码将vector类型转换为data.frame时,并将结果输出到了csv的文件后发现,输出的内容并没有词频。没有词频就无法通过wordcloud来进行绘制!!!,求指教如何将关键词放入wordcloud进行绘制!!!
#re为调用vector_keywords产生的结果
data.frame(re);
#将结果输出到文件中
write.csv(data.frame(re),"F:/R/2345.csv",row.names = T)
(通过调用关键词函数vector_keywords产生的结果)
3. 提出出的词语如何能文字更多
在做词库处理时,我这边用了搜狗的词库替换了jiabaR的原来词库,因此可以出现类似于神罗天征这样的四字词语,在原来的词库里,连宇智波都是被分开的!但是如何把很短的一句话也提取出来呢,从最开始的弹幕可以看到,原文件中是有大量的重复的一句话,除了自己在搜狗词包之外设置固定的词语短句,不知道还有没有别的方法,欢迎指导。
最后的那个图被我做的太丑了,简直影响观看,我如果一开始能预料到分出来会这么丑……我万万不会去分的,而且现在做云文字的网站都自带分词好像是,所以……所以我也不知道我这是在干嘛……。如有错误还请指教!
四、代码结构截图
项目代码结构截图
spiders文件夹截图
萌新学习Python爬取B站弹幕+R语言分词demo说明
代码地址如下:
http://www.demodashi.com/demo/11578.html注:本文著作权归作者,由demo大师发表,拒绝转载,转载需要作者授权
萌新学习Python爬取B站弹幕+R语言分词demo说明相关推荐
- Python爬取B站弹幕方法介绍
Python爬取B站弹幕方法介绍 文章目录 Python爬取B站弹幕方法介绍 前言 寻找弹幕数据 编写爬虫 B站弹幕数量 新技术介绍 参考文章 前言 最近同学要做东西,需要用 B 站的视频对应的弹幕数 ...
- python接收弹幕_闲着没事,尝试一下用Python爬取B站弹幕呀~
原标题:闲着没事,尝试一下用Python爬取B站弹幕呀~ 前言 最近同学要做东西,需要用 B 站的视频对应的弹幕数据做分析,于是请我帮忙爬取 B 站视频的弹幕数据. 对于爬虫而言,我们需要找到对应数据 ...
- python爬取b站弹幕并进行数据可视化
python爬取b站弹幕并进行数据可视化 1.第一步,爬取b站弹幕 我们随便打开一个b站视频 打开开发者模式,在network下搜索list,可以找到该视频的弹幕文件 打开之后是这个样子的 结构还是比 ...
- 用Python爬取B站弹幕并做成词云
用Python爬取B站弹幕并做成词云 一.获取视频的cid号 1.进入想爬的视频,打开浏览器设置里的"开发者工具": 进入NetWork后等待requests刷出,数据够了后可随意 ...
- python爬取b站弹幕分析_B站弹幕爬取原理解析(python)
感谢 原理 概念 cid : 爬取弹幕需要的id号,可以由BV号通过API接口获得 步骤BV转cid 浏览器输入:https://api.bilibili.com/x/player/pagelist? ...
- Python爬取B站弹幕+Gephi梳理主线剧情
作者 | 皖渝 出品 | 凹凸数据(ID:alltodata) 头图 | CSDN 下载自东方IC 爬取介绍 利用 Chrome 浏览器抓包可知,B站的弹幕文件以 XML 文档式进行储存,如下所示( ...
- 用Python爬取b站弹幕,看大家还会接受《爱情公寓5》吗?
尽管抄袭傍身,也没能阻挡<爱情公寓5>进击的脚步. 最近爱情公寓电视剧微博发布了长达8分钟的揭幕视频,官宣新季将在2020正式开播. 几位主演纷纷转发宣传,将#爱情公寓5揭幕#的话题送上了 ...
- python爬取b站弹幕_如何爬取B站弹幕
前言 主要记录自己完成爬虫的思路:从how to do到what to do这是一个拿 python 练手的项目,虽说是入门级,但其余爬虫也万变不离其宗 ̄へ ̄ [源代码地址 Github:bili-d ...
- python爬取b站弹幕分析_如何爬取b站弹幕文件
我们知道编写一个爬虫之前最重要的是进行网页结构的分析,确定你要抓取的部分是属于网页结构的哪一部分.以"你绝对没听过的梁朝伟唱歌 一开口就苏了 可惜被梁家辉开腔了"为例子,打开谷歌浏 ...
最新文章
- [转]PHP用mysql数据库存储session
- dialog对话框初始化 mfc_MFC中Dialog初始化顺序
- Codeforces 1322D Reality Show (DP)
- Delphi 从PaintBox拷贝一部分内容到TBitmap
- HTTP和HTTPS总结
- 如何在运行时打印出 SAP Spartacus 配置(config)信息
- 计算机网络客户服务器应用,计算机网络工程教学资料-项目九 Internet服务器应用.pptx...
- 蓝桥杯 ADV-187 算法提高 勾股数
- 小结SpringMVC(一)
- H3C题库HCNE的 最新
- 基于日志处理的ElasticSearch的学(gen)习(feng)
- ios分屏_【iOS越狱】越狱源+插件整理更新
- python批量图片转pdf,将TIFF图像批量转换为PDF ImageMagick Python
- webp格式是什么?webp格式怎么打开?webp格式怎么转换gif/jpg/png等?
- 云服务器ECS的基本概念
- SIM不识卡简单分析流程
- xshell、CRT上使用vbscript更高效连接定位到服务器以及目录、数据库
- 在windows7上搭建STF
- 经过半年的摸爬滚打,入门机器学习如此简单
- 【python爬虫专项(28)】链家二手房源数据采集1(分页信息采集)
热门文章
- 如何自动填充网页表单_流量型称重型充绒机充棉机如何选择,教你轻松辨别全自动填充机器...
- C++ 单例模式中处理在类中声明一个指向一个自己的指针,在编译时显示定义的指针未定义的处理办法
- leetcode java输入输出方法,有关IntelliJ IDEA中LeetCode插件配置问题
- HDVPSS模块介绍及使用
- java pecs_Java 泛型: 什么是PECS(Producer Extends, Consumer Super)
- linux系统认不到设备,linux中/dev/找不到设备
- 【高校宿舍管理系统】第八章 学生管理和楼宇管理以及寝室管理
- NGINX---一次阿里云宝塔开发flask经历
- QT中使用全局变量在多个源程序中传递变量
- SpringCloud入门之Maven系统安装及配置