QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3129|回复: 0
打印 上一主题 下一主题

用Python把B站视频弹幕爬下来,绘制词云图看看大家最关心什么!

[复制链接]
字体大小: 正常 放大
杨利霞        

5273

主题

82

听众

17万

积分

  • TA的每日心情
    开心
    2021-8-11 17:59
  • 签到天数: 17 天

    [LV.4]偶尔看看III

    网络挑战赛参赛者

    网络挑战赛参赛者

    自我介绍
    本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。

    群组2018美赛大象算法课程

    群组2018美赛护航培训课程

    群组2019年 数学中国站长建

    群组2019年数据分析师课程

    群组2018年大象老师国赛优

    跳转到指定楼层
    1#
    发表于 2021-7-30 16:25 |只看该作者 |正序浏览
    |招呼Ta 关注Ta

    & m3 ^' _) W% X8 f- F; x用Python把B站视频弹幕爬下来,绘制词云图看看大家最关心什么!% p# V& J5 }* y1 {
    今天带大家做点好玩的,把B站热门视频弹幕爬下来制作词云图!
    * q3 C. t5 n: @6 d: J  B: L, @0 i, k康康大家都怎么说!
    + Z7 p4 A+ j7 f) p; U* ], {
    5 \" [% O$ G: n! z% C5 m

    5 P6 h7 L5 I5 ?9 y$ p- e
    ' `0 m) s5 K# _# f; n1 `% C, o

    3 b. E5 V" L5 K6 g开始之前先给大家啰嗦几句,可能有些兄弟不会安装模块,我大概讲一下。! l$ Z- b# g5 r% o" z: W1 g& M6 _
    : S) S; l6 [  M( h: X1 j8 g  Q
    0 D4 k7 p' K" z
    如何安装模块:! c4 a! q3 Q# ~( Z

    5 q- _3 W+ ?' k* S2 Q2 k, j

    9 n! v! P0 _! N; H7 _3 ]4 pwin(键盘左下角ctrl 和 Alt 中间那个键) + R 输入 cmd 输入安装命令: pip install 模块名 回车( w; `" O7 E+ h* B6 w# N6 H
    pycharm里面安装 terminal 输入安装命令: pip install 模块名 回车
    2 g1 q. ]. P7 S$ }* E如果模块安装失败了,可能是这些问题:1 [  D! g" H) ~$ {6 C

    : j* ~: O9 \, t4 q/ n5 J( x
    ; f; G0 d3 a1 X7 T& I
    提示:pip 不是内部命令1 L# Y0 V0 k. Z0 t* O
    你python环境变量可能没有设置好/ P9 s* d6 f7 e7 P) j
    有安装进度条显示,但是安装到一半出现报错了* Z+ i+ Z8 i$ q
    因为python安装模块都是在国外的网址进行下载安装的, 国内请求国外 网速很慢,下载速度大概只有 几KB' ]6 i, R8 V! R: X- O/ e; r
    read time out 网络连接超时 你可以切换为国内的镜像源
    % o& H8 ^/ S' V4 f- j  i! `% E明明在cmd里面安装好了,但是在pycharm 提示我没有这个模块  D. s; ^, c) g) n
    你pycharm里面python解释器没有设置,你在pycharm设置里面重新设置一下
    " }' [* }; W0 s5 g; l" d可能安装了多个python版本# s# M+ \5 F, ~( G6 C, _
    安装一个版本即可9 Q9 k" b( ~/ h
    Python做爬虫到底可以做些什么呢?0 |) i, _8 R! @- o; a

    - p  A, y* r( k  x9 U5 d1 A1 e3 U0 I
    & Z8 P- `* w+ d0 P& Z% `
    常规: 爬取网上的数据 / 我可以批量下载图片/文字/音频 视频…$ @1 y$ T! V/ e/ [* G" w+ k7 [
    12306抢票 / 京东商城电商网站抢购脚本 / 朋友圈刷票 / 一些问卷调查自动填写… / 文章刷阅读量 / 音频 视频 播放量
    0 d; o8 v- u& x可以刷课 可以刷网课 自动 还能自动批量注册账号& p5 h. q! m  T
    模拟点击 >>> 游戏辅助 >>> 修改游戏内存(单机) …
    ) v. J" E- y* O普通B站视频可以爬 番剧是需要会员的
    / j$ d2 J1 F4 ^; |$ z0 \$ a/ ]% ?
    8 e8 e& W; G% \6 A' l8 Y
    + ~: s% ?3 U, w% y
    爬虫都是通过开发者工具进行抓包分析 查询数据来源 ( 静态页面 / 动态页面 ajax异步加载)" V0 l* O! w2 k% E& D. }; e  R% X# l
    # o) ], B8 j4 }. u* Q% f
    ' i2 X: K6 q+ I! {% f
    1. 确定目标需求 (弹幕数据 那个视频弹幕)
    ) m. |# i- ]' G6 d9 ^    确定了
    + k2 {# Q2 Z2 {9 d& L2. 找数据 (数据的来源分析)2 j2 q8 Z" Q. r) r" \) D
        简简单单 找到了
    ; p/ o  K/ Q3 {5 ]3. 对于数据来源的url地址 发送请求 (请求方式 / 请求头)2 b2 g7 d" O, v& X
        请求方式: get / post1 v- G" [' W4 h3 d. v# q$ e! \2 P
        请求头:
    : d" ]/ p# L- |6 V4 ^    https://api.bilibili.com/x/v1/dm/list.so?oid=376200196
    / G; c; V) P# T- X/ _; t    (通过开发者工具去看一下数据的具体来源,是否是来自有这个网站), J* c1 i! Q, ?# K0 t/ ?
    4. 获取数据 : W& c! r1 X$ x/ D  g& M! I
        文本数据 response.text 获取网页源代码( s% B: H" o/ @. A/ r
        json字典数据 response.json() 通常一般情况是 动态网页  ajax异步加载 用的比较多
    3 D+ B, |' @' Z) o( B    二进制数据   response.content  保存图片 音频 视频 或者 特定格式文件
    ! ~, U* b  @% F6 R+ _2 I$ S5. 解析数据
    1 X' W( P8 o) x0 w    正则表达式 .*? 解决一切  遇事不决 .*? 通配符 可以匹配任意字符 5 P% E  C# s0 _
    6. 保存数据
    ; Z9 _# [; W/ n0 I% t" D- {( |& X, D1% r% d0 O2 W) R8 d
    2, e( Z9 e+ P( j# G0 W2 b4 n
    3
    - h; C- N: }! o4
    3 \8 Y* a! Y3 u5/ |5 E. x: w0 o. `# C
    65 ^* u# w& {2 h  a( T  E
    7
    $ K$ {" |$ c% T" X$ e/ a8 o' }$ E8% H* j0 @/ D* W# j8 k
    9
    8 n  Y/ P2 `8 P+ M6 W$ w, ~2 n10) D% m; L* x  x9 C6 c
    11
    8 N" J; B0 g3 r; b& ~0 o. o! `  U12% Q( C% I/ j7 `' r
    13
    : X3 B& H6 g0 z! b0 n( z0 e% B$ V14' I0 r. i  q! L6 V$ ?: ~
    15- B# c" y% e( Y1 m% X) g; |
    16) J/ ^. f6 V/ U# g7 w
    python除了做爬虫数据采集,还可以做什么?! b, O7 E6 t0 T0 @7 ~  D
    兴趣学习 还是 通过python技术赚钱 (就业找工作 / 外包)9 a& u8 r( M( q! g7 m' g( M

    5 v9 W7 s$ l& Y" i) K- ]+ S6 r6 G

    ( f) b# F; G/ t5 N3 F1 f7 {. C+ m网站开发(就业/外包) >>> 我们课程是教授的全栈开发 薪资 13K-15K* T3 O' d. f, m- U* f+ C
    比如: python开发网站: Youtobe / 豆瓣 / 知乎(以前版本) / Facebook / 美团 ;
      @  g7 U5 ~( ?1 t1 p# d- ~# D& V我可以做到这样么?
    + X* l: t) P6 ]& G0基础 初学者 从零开始学习,上线 通过 域名 服务器 数据交互,4个左右的时间 就可以独立开发这个项目 类似知乎的网站;9 h: X3 z) {) Q, Y0 R  p
    如果你做去外包(团队): python开发就业 大多数也是进入外包公司 一个 10-20K左右;8 ^; l8 d7 c6 |7 C- M9 J: g6 `; R
    + y' _3 X* x& W% h' w
    ) \/ }$ k0 u0 F4 c' j  x/ A
    爬虫开发(脚本)(就业/外包) 可见即可爬
    $ D  b0 y1 F  Q, r9 T虽然爬虫什么都可以爬,但是获取用户的个人隐私(信息 电话 身份 贩卖 )、国家信息、商业机密(未公开数据,或侵犯版权)、色情等违法信息用来盈利,就基本上人无了!
    + a* U0 d# }/ l/ T# T很多兄弟问我,可以帮我淘宝用户数据吗? 我都是告诉他们,这个我还想多活几年,这玩意涉及隐私,个人信息,你可以自己学了悄悄爬,爬完记得删了,用来实践问题不大,但是别用来盈利!!!
    6 C& S, N4 M" S% P; D6 F, a之前有个兄弟爬取微博上面军事武器航母图片买给国外, 然后就进去了!所以奉劝大家,切记切记,别乱来!0 F7 c8 W0 {. j, n1 Y

    , T/ W0 V( l1 T0 }3 `+ i" l: B

    - G( S. I' Y! I5 G6 J数据分析(就业/外包)
    , Q- B2 g. W  T
    ' Y* \' s. U* Q) ?( b

    % Z0 M6 `: A2 k. d8 P自动化(脚本)" a6 O1 ~+ T6 E4 J' x
    1 N+ y; p8 u" T6 W
    & g9 G$ x( m  h3 K% W1 ^  M9 y' L4 Y
    游戏开发/辅助(脚本)! |. Q: T/ D- ^+ ~

    - [9 T( Z4 J  U- ~, Y
      o* O- D  i* @) @% _3 V$ P
    人工智能(研究生以上学历 要求很高)
    ; p& Q2 ]8 i; c' Z$ }
      |6 X6 \+ g5 m) W! d
    8 q" F! W* X4 O. l9 E, O
    等等方向还有很多,我就不一 一述说了,那些方向对于一般人来说作用不大。
    2 h3 K& k0 p, c5 {9 o
    5 u" w+ \, u9 y4 H( B6 V
    0 C, n2 ?' @4 ^" m
    我们开始正题吧
    . e. @" E( l; j4 q- i( r5 x: s/ |9 I% W0 M2 C/ g; h3 `, @
    . _$ q, p4 z* j/ h/ n( Y! h
    爬虫部分:
    ; t1 _8 k; `" W( t( ]$ ?发送请求 第三方模块 需要pip install requests
    0 Z& _, J) l5 [" J
    % B2 b/ G, m. O1 z" Q9 Z5 x; e
    1 d2 M% S, a; a, m2 m
    import requests$ q2 r4 O/ Q! C1 |+ r* d
    import re  # 内置模块
    " f7 o1 q4 B( H7 D4 n) d( h+ g$ V9 B% h4 s, C5 s, ?
    % r. G( Y2 ~+ y+ N+ Q
    url = 'https://api.bilibili.com/x/v1/dm/list.so?oid=376200196'
    , N: M: V2 q# P! E1
    7 p! e1 F1 I! c8 @# K! x- X2 c27 a5 I+ P) D: p  x0 @& Y$ M7 q
    3
    $ s! Q. h8 F* \5 m* _4
    , b; C/ L' Z6 g6 z2 |请求头的作用就是伪装' H3 T3 m4 P( \6 K! q
    # R" R! l! i8 D5 V0 r$ Z3 d' B
    2 q6 a4 l8 E$ J5 A0 c2 B
    headers = {& D, R2 r5 B1 i! a3 i/ z8 u
        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36'
    9 X& k: r7 X/ b}
    $ J2 b( y* p) U! v( S1! E. r6 ?5 D2 R5 V( r  n
    2! }/ f9 C0 s1 ]1 S
    3
    3 Y; J. M) m0 H0 _模拟浏览器对服务器发送请求, 服务器接收到请求之后,确定你没问题 然后会给你返回 response响应体数据
    , U$ C' T* u; w- b3 @7 i函数传参
    ! v/ [" g! F- [9 Z! I2 f+ W9 S& ^0 b

    4 b5 m" j' J6 Z1 N* U; A2 k/ Nresponse = requests.get(url=url, headers=headers)1 p; O8 N4 G! t- `& U6 P4 ?, [
    18 ~2 x1 t$ G- ~5 z8 X  l  K
    <> 对象 对象意味着你可以调用里面的方法或者属性
    0 p- C% U' f2 @: \# t0 p* F# P200 状态码 请求成功2 V$ O1 F' P. b9 D8 E5 ?
    获取数据 文本数据+ ?1 ?! Q  U( a; T$ A5 t/ p
    自动识别编码
    , G  ^2 Q- w$ P) Y: I4 |7 i: a* \/ M( R
      ^, J6 g; f& ]6 E1 D
    response.encoding = response.apparent_encoding' V2 Z! \+ o: ?6 j' H* v0 y5 P
    html_data = re.findall('<d p=".*?">(.*?)</d>', response.text); q( T# p% Q4 T- d8 ?' x
    1' t! ~) s+ i6 S1 a# ?
    2
    4 F/ h& w( G) U' |content_str = ‘\n’.join(html_data)
      i6 A- W: t& ]1 |1 j  R' _$ B: y; ]+ B1 L. P
    . o% X6 ]  z* f
    要列表转成字符串 ‘’.join()) W% A  b% g5 Y/ e, E7 U3 q7 q1 l  \+ k/ b- Q
    for 遍历) u) ^- ^  ~$ B; a2 C' `* h' w
    保存数据 保存字符串8 m9 Q% q9 ^: a: Q) b( v3 z8 B
    for content in html_data:
    " U1 Z, J! v  K5 r0 ]( O/ t1 n    # mode 保存方式 w 写入会覆盖 a 追加写入
    & Z8 u/ h! [( c* X; e0 Q7 r    with open('弹幕1.txt', mode='a', encoding='utf-8') as f:1 X7 F# W. D2 P9 Y1 d! I0 [6 W
            f.write(content)- |! |# U: E" F5 E; a' M' ?% H  c0 m
            f.write('\n')
    , `, ]4 e" g0 C; |+ q! o! U. N# Y, t2 w: G  `3 i. L! D) W6 O

    7 v5 J2 P, w3 ]6 \$ u# print(content_str)
    9 ?# {1 `% Q& ~1 C# f4 O1" b. C$ D1 K5 Z9 b
    2
    . t& o) H9 ~1 G3 C7 G. A* G8 F, N3
    ' x* @( G& ^) {* a41 c7 f& Z0 T; k3 ^/ R# z
    5( @3 G- O- M  Y' y/ a8 y8 Y
    65 g4 b; _* `7 J/ D8 v- N! a
    7
    " |# l& x4 i3 h% r, _" `$ p. q爬取结果
    0 p0 z# m; P* x+ O8 L; ]& J) s# Q4 L& n' y* E; V: |) h1 `

    ) I9 X4 M# O+ r4 N2 b' K% i- d/ @+ h  a3 S: r% z: s8 z) A$ F
    ! i" F4 k5 i" ?* N5 x' y0 S
    然后我们再来实现制作词云图部分; t' [, B5 [5 F9 j
    : s& `( N+ [$ ~8 y! \5 s3 y
    ; I) I7 x0 }% U. W2 \1 [
    首先要安装这两个模块$ Q- G" ]: i& ?; Z; X$ ]- U- L

    & R# {6 s; H2 S- P' Q- h; p+ i1 L

    ( H+ T/ @% ?5 D+ M( f0 ?5 ?9 _import jieba
    ! w; @5 V" @7 S% n$ |8 Z. C3 i8 qimport wordcloud3 Y  _: @9 f8 p& {& I( P
    1
    # E6 V$ i% b6 B! w! f5 m2! s" N$ H  {$ Q2 D3 i# E4 S2 L
    一个相对路径 一个绝对路径,保存好的txt文本名字要注意看一下,不对的话,记得改一下保持一致。3 j$ y& l! x$ n  ^0 G" {& m! c* K' r* b
    4 ^4 H  d( A. z0 e% j" p
    4 V& `; T7 _" U% [* y/ Y5 O
    f = open('弹幕.txt', mode='r', encoding='utf-8')$ r7 u3 `: u1 d! T' a+ s4 C4 D7 n
    text = f.read()
    2 Q3 ?: I4 i5 S# K+ Ftxt_list = jieba.lcut(text)
    / e: d$ S- Z! s# print(txt_list)
    / t8 X1 Z& p& S5 i1
    + e' y% A( r; U. A2. o. I* i" R, J& \! j
    3% c* ?' H9 Q; k" [$ J
    43 m8 y6 P, d# N1 `+ K
    列表整合成一个字符串0 v5 R5 u- H, V2 \
    . y3 z/ z$ o$ A* e" s
    + ^8 n3 M# |5 ]# r8 a$ f
    string = ' '.join(txt_list)
    / r% [" F% b& M" Q- B- y. C* z6 u) T" _print(string)7 @3 w: x' M/ ~# R/ \+ c2 y
    print('---'*50)& m) M/ }7 f) j6 x4 M
    print(str(txt_list))9 X( p4 \  Y+ N
    1
    . i/ E9 c' o2 S( W2
    " H: y" O! O5 \( G+ w: {3
    5 Y. k4 P+ C+ `3 E$ e- j42 o8 S' m: U- D
    词云图设置
    . H0 k7 r2 h: f
    4 i- f$ ^  H9 M9 g
    ' p6 N& V+ \0 ]* E( F
    wc = wordcloud.WordCloud(
    ) V2 A, B% _, }+ \4 s        width=1000,         # 图片的宽
    7 M! Q2 _! H$ w        height=700,         # 图片的高
    4 [; j% E+ l$ r5 @/ }  \% p        background_color='white',   # 图片背景颜色1 @% ^/ a' b# X
            font_path='msyh.ttc',    # 词云字体
    & p/ a4 S$ y, x3 q; V( ]/ w        # mask=py,     # 所使用的词云图片
    # X  U5 W( F# o$ I& p        scale=15,
    1 ?  g0 n6 l2 L        # stopwords={words},         # 停用词
    $ a! |3 G! \3 y- L- s        # contour_width=5,, P% c9 G- t6 ]* \
            # contour_color='red'  # 轮廓颜色
    1 ^' W5 s9 p2 z# X9 I) e% U1 M& ^)
    ! B. @1 P. g, C7 D% P! c; B1
    7 n# {& e' X" t4 C20 o* L0 ]; D6 G% a2 O  @+ Z. e
    3+ n9 w! n. R+ Q# I7 x
    4' w$ v5 D8 n  t! z/ O1 a  t+ u
    5. z( k0 l& j+ [/ g0 c' y
    6
    ( ]. x6 c+ b* v; d% t9 T. D6 i. I- r' g0 f7/ M( k' U6 t+ {9 \; C1 U$ D
    8, b" [5 A+ n# e3 i$ ?- [/ R: D4 {
    9& _6 A* u( ^; w3 _& A1 @% \# C; c
    10* A% g; K3 S$ s4 N4 y5 p3 K/ b
    11# v& x9 j' U) M; ~4 r1 ~9 i
    给词云输入文字
    * k, O0 Q% F# ?) D) l
    " e3 I. N1 r( A& H4 S
    % f0 j$ g9 m/ P' x, X! S: }) c+ w
    wc.generate(string)
    - D7 f) D3 X+ f, V2 p7 g9 t14 i  e( s9 z- _6 y' @  W
    词云图保存图片地址: {/ x2 ~, @1 N! @9 X( d

    , J- E- b9 n4 P( K$ o

    : u1 ?' u9 I- ]* ]3 ]wc.to_file('output1.png')
    9 `% K0 E" B( y# u0 x" o1
    8 G( D4 }2 y2 X$ f9 G词云图的过程中有点慢,大家不要心急
    0 D: \* u; q6 A; B: [8 Z$ w, P, P9 A- W: Z$ j

    , u" @* m. b, y: v0 ?% M这是最后的结果
    ! G" E# |' ^/ A" d+ |, k
    8 q  ]1 w9 O' J. \" _1 ~: x, X
    & I% P9 v- R7 Y1 z7 Q4 e* H
    没有加停用词,所以一些无用的词比较多$ `8 k2 y# k# O1 M6 L4 u

    1 F# A8 k! Y% [. n  [
    8 Y4 p, }7 U) G& G
    stopwords={'了', '啊'}' }: ^# c/ J2 ?) w2 s
    14 \  F2 n; U/ |2 h7 C" M
    把这个部分的代码加入要屏蔽的词就OK了!比如我现在把 了 跟 啊 这两个字屏蔽了。) Q* ~2 s- L2 @+ _8 X! ]: e( R1 ?
    我们再来看下0 i8 m/ z7 d7 Q# V
    4 {& ]$ m' a. Y8 B5 ]! p
    9 i& X2 j5 t- U. h! m
    不知名网友:666666 牛批 老哥我要学!!!
    ; z7 {3 n) e) }$ M7 T& b! c
    + Q- O( Q; ^. A% J

    + S" `4 V7 J" I/ b5 @9 h3 l
    5 h, B8 z" |- l' p! n  R- s3 ^. |
    ) B1 V9 _- G" `- @. R2 D
    ————————————————! ?" v" O) J- q& w( X+ l2 k
    版权声明:本文为CSDN博主「编程界的泥石流」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。/ a: p$ q0 I  }' n" J
    原文链接:https://blog.csdn.net/ooowwq/article/details/119211907$ T& r* |" Y& \  ^5 d
    * y% C9 N( v4 k, x4 c* e
    $ y" d6 @" c$ G2 [! V7 k
    zan
    转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
    您需要登录后才可以回帖 登录 | 注册地址

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

    关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

    手机版|Archiver| |繁體中文 手机客户端  

    蒙公网安备 15010502000194号

    Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

    GMT+8, 2026-6-15 21:52 , Processed in 0.403087 second(s), 52 queries .

    回顶部