代码地址如下:
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 CourseItem class Myspider(scrapy.Spider):
#设置name
name = "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 json class 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)
#返回item
return 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说明的更多相关文章

  1. Java爬取B站弹幕 —— Python云图Wordcloud生成弹幕词云

    一 . Java爬取B站弹幕 弹幕的存储位置 如何通过B站视频AV号找到弹幕对应的xml文件号 首先爬取视频网页,将对应视频网页源码获得 就可以找到该视频的av号aid=8678034 还有弹幕序号, ...

  2. Python爬取b站任意up主所有视频弹幕

    爬取b站弹幕并不困难.要得到up主所有视频弹幕,我们首先进入up主视频页面,即https://space.bilibili.com/id号/video这个页面.按F12打开开发者菜单,刷新一下,在ne ...

  3. python爬取某站新闻,并分析最近新闻关键词

    在爬取某站时并做简单分析时,遇到如下问题和大家分享,避免犯错: 一丶网站的path为 /info/1013/13930.htm ,其中13930为不同新闻的 ID 值,但是这个数虽然为升序,但是没有任 ...

  4. Python爬取B站视频信息

    该文内容已失效,现已实现scrapy+scrapy-splash来爬取该网站视频及用户信息,由于B站的反爬封IP,以及网上的免费代理IP绝大部分失效,无法实现一个可靠的IP代理池,免费代理网站又是各种 ...

  5. python爬取b站排行榜

    爬取b站排行榜并存到mysql中 目的 b站是我平时看得最多的一个网站,最近接到了一个爬虫的课设.首先要选择一个网站,并对其进行爬取,最后将该网站的数据存储并使其可视化. 网站的结构 目标网站:bil ...

  6. 使用python爬取P站图片

    刚开学时有一段时间周末没事,于是经常在P站的特辑里收图,但是P站加载图片的速度比较感人,觉得自己身为计算机专业,怎么可以做一张张图慢慢下这么low的事,而且这样效率的确也太低了,于是就想写个程序来帮我 ...

  7. python爬取某站上海租房图片

    前言 对于一个net开发这爬虫真真的以前没有写过.这段时间开始学习python爬虫,今天周末无聊写了一段代码爬取上海租房图片,其实很简短就是利用爬虫的第三方库Requests与BeautifulSou ...

  8. python爬取某站磁力链

    不同磁力链网站网页内容都不同,需要定制 1,并发爬取 并发爬取后,好像一会就被封了 import requests from lxml import etree import re from conc ...

  9. python 爬取bilibili 视频弹幕

    # -*- coding: utf-8 -*- # @author: Tele # @Time : 2019/04/09 下午 4:50 # 爬取弹幕 import requests import j ...

随机推荐

  1. ACM: FZU 2110 Star - 数学几何 - 水题

     FZU 2110  Star Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u  Pr ...

  2. 关于Maven的一些记录

    Eclipse-Mars4.5自带Maven插件,自己重新下载之后将不兼容. 可以在图中位置设置jar包路径. 可以在Eclipse新建Dynamic Web Project项目,然后在项目上右键=& ...

  3. 360极速浏览器UA怪异以及如何用js判断360浏览器

    本文最后一次更新于7个月前,文章内容可能略有出入.若发现文章中有错误之处,可以留言评论告诉作者. 1.360极速浏览器UA因域名不同而异 今天在写一个判断浏览器.浏览器版本.操作系统.操作系统版本.浏 ...

  4. iOS 开发 - 改善APP的流畅度 (绘制股票行情)

    这几天做了一个查看股票行情的app. 完成之后,当k线比较多的时候,app 对于捏合.拖动手势的反应不太流畅, 主要原因是drawRect: 干的活太多, 竟然需要40ms+, fps 自然不高 最后 ...

  5. 浅谈iOS网络编程之一入门

    计算机网络,基本上可以抽象是端的通信.实际在通讯中会用到不同的设备,不同的硬件中,为了能友好的传输信息,那么建立一套规范就十分必要了.先来了解一些基本概念 了解网络中传输的都是二进制数据流.  2.了 ...

  6. HttpApplication处理对象与HttpModule处理模块 (第三篇)

    一.HttpApplication对象简述 在HttpRuntime创建了HttpContext对象之后,HttpRuntime将随后创建一个用于处理请求的对象,这个对象的类型为HttpApplica ...

  7. kubernetes之flannel

    kubernetes网络通信 容器间的通信   pod内的容器通信(lo) Pod之间的通信   pod IP <-----> pod IP Pod与Service之间的通信 podIP ...

  8. 本地windows下搭建git的本地服务器

    本地windows下搭建git的本地服务器 准备工作: 本地安装java环境,配置环境变量(略) 下载gitblit文件,百度一大堆 开始第一步: 减压gitblit压缩包到某个目录下,比如我在:H: ...

  9. 006-Python函数

    Python函数(def) 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段.Python提供了许多内建函数,比如print().但你也可以自己创建函数,这被叫做用户自定义函数.函数能 ...

  10. zabbix安装(Ubuntu)

    zabbix的安装 Zabbix监控架构至少需要server,agent,web模块.mysql.web部分和server安装在同一台机器上. Zabbix安装前服务器要做时间同步(ntp) 1.创建 ...