草庐IT

萌新学习Python爬取B站弹幕+R语言分词demo说明

进击的程序茗 2023-10-07 原文

写在前面

之前在简书首页看到了Python爬虫的介绍,于是就想着爬取B站弹幕并绘制词云,因此有了这样一个简单的尝试,从搭建环境到跑通demo,不懂语法,不知含义,装好环境,查到API,跑通Demo,就是目标!纯零基础萌新!
demo地址(只有python的demo,R的没有上传)

关于环境的安装及调试过程中遇到的问题记录请移步

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多条弹幕,建议大家换个少的进行测试。
cid查找方法
  • 弹幕的xml文件结构非常简单,所以通过Xpath简单解析即可
弹幕的xml文件结构
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爬取end

到此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的原来词库,因此可以出现类似于神罗天征这样的四字词语,在原来的词库里,连宇智波都是被分开的!但是如何把很短的一句话也提取出来呢,从最开始的弹幕可以看到,原文件中是有大量的重复的一句话,除了自己在搜狗词包之外设置固定的词语短句,不知道还有没有别的方法,欢迎指导。

R语言分词end

最后的那个图被我做的太丑了,简直影响观看,我如果一开始能预料到分出来会这么丑……我万万不会去分的,而且现在做云文字的网站都自带分词好像是,所以……所以我也不知道我这是在干嘛……。如有错误还请指教!

有关萌新学习Python爬取B站弹幕+R语言分词demo说明的更多相关文章

  1. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

  2. ruby - 如何将脚本文件的末尾读取为数据文件(Perl 或任何其他语言) - 2

    我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚

  3. ruby - 寻找通过阅读代码确定编程语言的ruby gem? - 2

    几个月前,我读了一篇关于ruby​​gem的博客文章,它可以通过阅读代码本身来确定编程语言。对于我的生活,我不记得博客或gem的名称。谷歌搜索“ruby编程语言猜测”及其变体也无济于事。有人碰巧知道相关gem的名称吗? 最佳答案 是这个吗:http://github.com/chrislo/sourceclassifier/tree/master 关于ruby-寻找通过阅读代码确定编程语言的rubygem?,我们在StackOverflow上找到一个类似的问题:

  4. Python 相当于 Perl/Ruby ||= - 2

    这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:Pythonconditionalassignmentoperator对于这样一个简单的问题表示歉意,但是谷歌搜索||=并不是很有帮助;)Python中是否有与Ruby和Perl中的||=语句等效的语句?例如:foo="hey"foo||="what"#assignfooifit'sundefined#fooisstill"hey"bar||="yeah"#baris"yeah"另外,类似这样的东西的通用术语是什么?条件分配是我的第一个猜测,但Wikipediapage跟我想的不太一样。

  5. java - 什么相当于 ruby​​ 的 rack 或 python 的 Java wsgi? - 2

    什么是ruby​​的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht

  6. 华为OD机试用Python实现 -【明明的随机数】 2023Q1A - 2

    华为OD机试题本篇题目:明明的随机数题目输入描述输出描述:示例1输入输出说明代码编写思路最近更新的博客华为od2023|什么是华为od,od薪资待遇,od机试题清单华为OD机试真题大全,用Python解华为机试题|机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为o

  7. Unity 热更新技术 | (三) Lua语言基本介绍及下载安装 - 2

    ?博客主页:https://xiaoy.blog.csdn.net?本文由呆呆敲代码的小Y原创,首发于CSDN??学习专栏推荐:Unity系统学习专栏?游戏制作专栏推荐:游戏制作?Unity实战100例专栏推荐:Unity实战100例教程?欢迎点赞?收藏⭐留言?如有错误敬请指正!?未来很长,值得我们全力奔赴更美好的生活✨------------------❤️分割线❤️-------------------------

  8. 7个大一C语言必学的程序 / C语言经典代码大全 - 2

    嗨~大家好,这里是可莉!今天给大家带来的是7个C语言的经典基础代码~那一起往下看下去把【程序一】打印100到200之间的素数#includeintmain(){ inti; for(i=100;i 【程序二】输出乘法口诀表#includeintmain(){inti;for(i=1;i 【程序三】判断1000年---2000年之间的闰年#includeintmain(){intyear;for(year=1000;year 【程序四】给定两个整形变量的值,将两个值的内容进行交换。这里提供两种方法来进行交换,第一种为创建临时变量来进行交换,第二种是不创建临时变量而直接进行交换。1.创建临时变量来

  9. python - 如何读取 MIDI 文件、更改其乐器并将其写回? - 2

    我想解析一个已经存在的.mid文件,改变它的乐器,例如从“acousticgrandpiano”到“violin”,然后将它保存回去或作为另一个.mid文件。根据我在文档中看到的内容,该乐器通过program_change或patch_change指令进行了更改,但我找不到任何在已经存在的MIDI文件中执行此操作的库.他们似乎都只支持从头开始创建的MIDI文件。 最佳答案 MIDIpackage会为您完成此操作,但具体方法取决于midi文件的原始内容。一个MIDI文件由一个或多个音轨组成,每个音轨是十六个channel中任何一个上的

  10. 「Python|Selenium|场景案例」如何定位iframe中的元素? - 2

    本文主要介绍在使用Selenium进行自动化测试或者任务时,对于使用了iframe的页面,如何定位iframe中的元素文章目录场景描述解决方案具体代码场景描述当我们在使用Selenium进行自动化测试的时候,可能会遇到一些界面或者窗体是使用HTML的iframe标签进行承载的。对于iframe中的标签,如果直接查找是无法找到的,会抛出没有找到元素的异常。比如近在咫尺的例子就是,CSDN的登录窗体就是使用的iframe,大家可以尝试通过F12开发者模式查看到的tag_name,class_name,id或者xpath来定位中的页面元素,会抛出NoSuchElementException异常。解决

随机推荐