QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3176|回复: 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

    . o) Z* ^& |/ I+ c2 B  D$ f用Python把B站视频弹幕爬下来,绘制词云图看看大家最关心什么!# h: w+ ]# k' Y) \$ }5 K" B
    今天带大家做点好玩的,把B站热门视频弹幕爬下来制作词云图!, b2 ^  B4 p* q) [/ ?" g4 Y- ?
    康康大家都怎么说!
    2 S  }* d  v; h9 f- p0 i, R2 B6 n$ x8 C. \' W
    ( z! ^4 r; [! N% H0 U3 B

    $ ~" t1 Q" K/ P+ A% j, j0 Q# k
    & a* V& ?3 C! y  _3 N) J
    开始之前先给大家啰嗦几句,可能有些兄弟不会安装模块,我大概讲一下。, j, q2 W  Y  i. {, W" ^5 j

    . @) J- q6 K- g/ D2 P& R, U
    & w( n: P. x7 h  L; z4 a
    如何安装模块:
    6 E. Z' ^+ T4 U) I, l( f' D% X
    6 Q) l* j. |. v2 z( h, R, Y" t
    / t3 g( ^# Q  P5 F
    win(键盘左下角ctrl 和 Alt 中间那个键) + R 输入 cmd 输入安装命令: pip install 模块名 回车
    2 L) R) p' e) @+ M" |, |: P) upycharm里面安装 terminal 输入安装命令: pip install 模块名 回车; g. f$ \) z* m
    如果模块安装失败了,可能是这些问题:
    * W& H4 n: s( u. u0 G- Z
    9 z7 \2 H: s: p3 {6 i' u
    ! a9 s/ w  t2 f
    提示:pip 不是内部命令  b4 }5 E0 O1 Z- S; m
    你python环境变量可能没有设置好
    6 I% F2 {1 r& K" t: m有安装进度条显示,但是安装到一半出现报错了
    9 }* H9 m6 }8 [5 r& ^因为python安装模块都是在国外的网址进行下载安装的, 国内请求国外 网速很慢,下载速度大概只有 几KB, B. z2 [2 O* H0 x) N5 U, q$ B
    read time out 网络连接超时 你可以切换为国内的镜像源9 m6 O% N9 x6 [& Y( \
    明明在cmd里面安装好了,但是在pycharm 提示我没有这个模块
    8 i" @; X6 |6 n9 k" @$ e你pycharm里面python解释器没有设置,你在pycharm设置里面重新设置一下
    - g4 \2 H( n6 K( P! R% |可能安装了多个python版本
    - z+ ?( m5 s8 p* A2 q5 T  }6 F安装一个版本即可
    7 D. n0 ^- Z9 {- P# LPython做爬虫到底可以做些什么呢?5 x6 c( W" l0 f6 u& \

    ( Z( q* c! h( @- X) X+ F% t
    ) F6 Q- T, e, Z+ o$ ^: [
    常规: 爬取网上的数据 / 我可以批量下载图片/文字/音频 视频…
    ) U  R% v- x- x12306抢票 / 京东商城电商网站抢购脚本 / 朋友圈刷票 / 一些问卷调查自动填写… / 文章刷阅读量 / 音频 视频 播放量' Z; z- f9 y# H
    可以刷课 可以刷网课 自动 还能自动批量注册账号
    ( @" {# S  W2 ]4 p& D" T模拟点击 >>> 游戏辅助 >>> 修改游戏内存(单机) …: b, r" [% b5 r) Q1 c: Z0 M
    普通B站视频可以爬 番剧是需要会员的
    / c5 V; Z, I2 t: p6 n1 B& d. q! l
    8 @# |/ U# _6 m, J# }% T1 h
    爬虫都是通过开发者工具进行抓包分析 查询数据来源 ( 静态页面 / 动态页面 ajax异步加载)' o; q8 M# z* e- j( ^

    . h4 e3 I7 Y1 \$ E
    2 q% g/ d$ N7 N, ]" A# X- H, b
    1. 确定目标需求 (弹幕数据 那个视频弹幕)
    . J' h4 E% e5 F+ }    确定了
    + q9 q% G) i2 x, H2. 找数据 (数据的来源分析)6 t- \+ w$ }+ ^- }' l
        简简单单 找到了
    7 p7 M1 _4 W5 k. q$ O& D- c: X3 y5 k3. 对于数据来源的url地址 发送请求 (请求方式 / 请求头)
    6 {% o: }& i7 r# }2 h    请求方式: get / post6 m+ d' m$ `. H) I  ]5 E/ X2 }
        请求头:
    ; w, _# y4 H  q/ ]! [# d0 w    https://api.bilibili.com/x/v1/dm/list.so?oid=376200196
    $ L, ?7 t9 d, Y  x2 S- C; `3 e+ S    (通过开发者工具去看一下数据的具体来源,是否是来自有这个网站)
    / ?" [* f7 u3 O( Y" q3 I# u' o4 n* O4. 获取数据 , z/ L- Q( z% Y! w, z  p
        文本数据 response.text 获取网页源代码
    * o" T$ E- W, h% e9 Z    json字典数据 response.json() 通常一般情况是 动态网页  ajax异步加载 用的比较多
    ) C3 X/ ^* T( Y" O4 P0 y/ o$ a' V- D    二进制数据   response.content  保存图片 音频 视频 或者 特定格式文件 ( g4 l2 a6 O& |4 ~& h0 x4 S
    5. 解析数据
    6 s# `4 W7 |- y2 T3 T" [8 e+ r7 r    正则表达式 .*? 解决一切  遇事不决 .*? 通配符 可以匹配任意字符 2 j3 V/ T4 X: S+ z
    6. 保存数据) p! w) I1 H: `, L! \$ p
    16 ]; y0 ~) ~  C- }- q; Y2 w( Z# }- Y
    2
    4 u9 l# }" X; L4 E, X36 h1 B6 O" a) f( D& l
    4
    7 _* e% K  r0 e# `1 {  x0 v9 A! _& T5
    ( h; b" Y( L# ?2 o# a. q2 @& @; ~6
    # Y& v% S2 B0 [  L( G- T+ N9 j. E7
    / X  ]! o2 g( ]# ^/ s8. ~8 R) @$ n4 o
    9
    / Q0 S7 s/ j0 Z' [& n4 }10
    0 ^4 Z: I3 p  G' Y# Q, F11: G* n4 \6 n! P3 q9 T
    120 i7 K& X3 Q4 L4 Q6 D) T% o
    13, H' Q; O3 o7 s( s0 _* L& g
    14# G: q/ u/ L5 P: ]6 y6 h; N8 @, s
    159 N# b2 P2 Y) n$ F0 ]
    16! a: b  g& U6 m9 ?- ~6 ^
    python除了做爬虫数据采集,还可以做什么?  u/ r5 p. L. q
    兴趣学习 还是 通过python技术赚钱 (就业找工作 / 外包)
    6 _+ X* M+ k% N7 [' e
    ; ?0 b  C7 a  n; N4 ~  u' Q
    6 r0 |) e$ ~: [+ o0 k: T' q0 U
    网站开发(就业/外包) >>> 我们课程是教授的全栈开发 薪资 13K-15K
    # E% z7 d7 u4 J9 V( Q比如: python开发网站: Youtobe / 豆瓣 / 知乎(以前版本) / Facebook / 美团 ;/ S+ v: l- s: T
    我可以做到这样么?
      h' e0 |; k8 L( e- p" }9 t' c$ j3 M0基础 初学者 从零开始学习,上线 通过 域名 服务器 数据交互,4个左右的时间 就可以独立开发这个项目 类似知乎的网站;
    : o+ \. F; H* ^/ M  e如果你做去外包(团队): python开发就业 大多数也是进入外包公司 一个 10-20K左右;
    4 X4 _! M" t1 Q9 U
    ; V9 h; F! S4 y; N; g
    ! E; h$ V( I- e9 i. s4 d! ~9 v
    爬虫开发(脚本)(就业/外包) 可见即可爬
    ! V' v/ `! a1 O- D+ [3 k虽然爬虫什么都可以爬,但是获取用户的个人隐私(信息 电话 身份 贩卖 )、国家信息、商业机密(未公开数据,或侵犯版权)、色情等违法信息用来盈利,就基本上人无了!
    ( F' w9 M! N+ |4 q很多兄弟问我,可以帮我淘宝用户数据吗? 我都是告诉他们,这个我还想多活几年,这玩意涉及隐私,个人信息,你可以自己学了悄悄爬,爬完记得删了,用来实践问题不大,但是别用来盈利!!!
    7 |5 d. ?" ^8 L$ Z) b3 N$ ~; m2 ^之前有个兄弟爬取微博上面军事武器航母图片买给国外, 然后就进去了!所以奉劝大家,切记切记,别乱来!
    , h; m' t8 [  p& D( y4 b4 p: n  B1 D& W3 ~

    . l" L( L8 o8 G1 w3 W  g. a5 w数据分析(就业/外包)5 S; z4 h, U8 X/ e- N4 O( j; D4 T
    ! R" {( i' L( _& b
    $ _' \# G4 p) |, H7 l
    自动化(脚本)$ }8 f* H4 l  m% D5 O

    ' ?  Z" |0 F: L* x; {
    % k2 j# z- ^! w1 a6 {
    游戏开发/辅助(脚本)
    # p: k( Q* V6 k9 o
    + g1 u5 V9 [2 k

    . e& b. c) G. H人工智能(研究生以上学历 要求很高)
    8 M, C5 J) }5 _, y- H( E7 w* B0 `% v& R
    4 O. D+ }2 C  B  w! }0 g3 \
    等等方向还有很多,我就不一 一述说了,那些方向对于一般人来说作用不大。
    : q6 u6 |. t# v% w7 |4 {5 M6 a+ F, h; e% N3 W( |2 J* v# x7 ~; b, L  W
    + J0 o. K2 o3 d3 K$ \* [
    我们开始正题吧" M: r! K8 u! [2 R- S
    ! u1 C) k4 Z5 J+ B3 d, j7 N5 P

    ) k( m" V/ S8 v爬虫部分:
    # o% ?! [/ z" b5 A发送请求 第三方模块 需要pip install requests) U2 }( y' Z7 D1 M$ L3 O& T1 p
    9 w0 w- g9 {; v/ v% q9 C/ _! s3 ~8 o

    8 p5 \7 Y. v: j' e  `" Eimport requests7 ^% q1 I" R: q! V
    import re  # 内置模块& P) S2 `9 q1 Z; A0 T0 M9 H7 h( m
    & w8 j6 [9 p( w; j8 r% j& r
    ) @- T" ]/ p2 R0 Q  z6 w/ p
    url = 'https://api.bilibili.com/x/v1/dm/list.so?oid=376200196'
    + P& {. b- J) H" j/ w" ]8 j19 p" H4 v2 L- G5 N5 d
    2
    ! Y5 \0 q! u; \. `- E3
    / G# M4 G; f, M+ a$ c4
    ) O; d2 J0 F) p$ }% C请求头的作用就是伪装9 v( h- e9 W5 t& M+ `/ l. S
    8 n0 S, ~& v9 ]0 m) N+ a

    8 l. q7 T/ R! F) S1 ^headers = {
    ( T' i; U# G9 B- ^6 H    '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'
    + Z0 d0 ^/ x6 N, ~. k! G- m* W}" ?9 A0 L4 H- n( |) E3 f7 v
    1) ]; }5 Z  @0 r$ P
    2$ @1 v8 y0 K- o6 w
    3( j$ `0 ^, N! e5 I$ Y# B% r
    模拟浏览器对服务器发送请求, 服务器接收到请求之后,确定你没问题 然后会给你返回 response响应体数据
    " S# `8 {3 f. {! H. M  B函数传参
    ' n9 h1 u: a- s8 u  {' r
      ]+ O; W8 q1 P+ ^  j" c, y

    7 O! `; f1 g7 u" Dresponse = requests.get(url=url, headers=headers)- R6 W7 H: _7 [# s
    1+ W) \5 q+ R2 o: l5 a$ [: T
    <> 对象 对象意味着你可以调用里面的方法或者属性6 V! S8 k; ~" S
    200 状态码 请求成功: K9 N- f  J7 _9 Q6 s
    获取数据 文本数据
    * g& L' Q1 X+ K, L4 _) G8 `自动识别编码
    + y' K$ Z( q) Z  f& T. Z: t
    & g4 J0 Y, j0 {" M8 t0 g$ P- s  \/ X

    3 |0 C) C# T+ Rresponse.encoding = response.apparent_encoding2 f+ o' D! _9 @) Q8 I' _% W9 x
    html_data = re.findall('<d p=".*?">(.*?)</d>', response.text)& T( Q0 C1 q: Z8 H; i" I4 u
    19 {: e2 G- q2 V
    2
    , H8 v0 d2 k; F3 X. t# p% _content_str = ‘\n’.join(html_data)6 b; o/ U5 r* q* v$ e+ I) W
    $ r6 g$ I, O/ k& y2 T
    9 k. j8 v, o$ V) E
    要列表转成字符串 ‘’.join(); O" i4 @% M& k" u- J! }5 |8 v
    for 遍历
    9 b4 _& o6 }( v0 A3 D保存数据 保存字符串
      |. L, J$ K1 K/ z4 dfor content in html_data:# x5 d0 A$ u6 e0 h$ s
        # mode 保存方式 w 写入会覆盖 a 追加写入
    ' y& |+ w0 {. t  r, A9 R! }9 _) a    with open('弹幕1.txt', mode='a', encoding='utf-8') as f:
    : K* J- L, u, j6 c        f.write(content)
    # J+ |6 f3 D/ y1 Y, p# i/ S        f.write('\n')
    8 N7 R3 K% }  o- H' Q# }' O. }* j/ @0 s6 r3 B
    & e- f) L% B6 X/ ^* O% {0 ]
    # print(content_str)
    , {. M6 M% _( G) D& s+ f1" N2 t& e+ y: D
    29 h+ v& V3 @/ W
    3
      m+ c# _8 X) f4 `, R8 ?( c4
    1 Y: q9 i5 U5 U/ i59 H5 W2 x1 u8 C* R9 {
    6
    1 \$ i6 u7 X# |5 w4 d8 D, w1 Z7
    * z  o( [- ]( r% |6 J爬取结果0 L- F! ?" w8 _/ p, e' X
    - b% Q$ ~! e. q* O9 O2 Y

    , O7 H9 y8 i* s: M. l! i5 N5 A, A, {
    , w) q: ~" j3 \# m+ m
    然后我们再来实现制作词云图部分' t: r: q- w4 e' t& D7 e0 w

    2 ?- ^2 U7 @  ?; q, `- E

    8 B/ |- y0 m, l3 o/ G! P首先要安装这两个模块
    # }9 w# z3 W0 k7 i0 \$ A/ W2 v3 M) A! y) h, x
    ( l" X8 ?: y6 }4 R' F0 k
    import jieba
    : ~3 R& d$ o4 z, E7 L% {9 D8 n1 M+ |import wordcloud
    / }! K: @8 ~& l% O3 i1
    ) V6 y: g  F/ }8 A. P! A# q- p2" M- `' [) q- j" @
    一个相对路径 一个绝对路径,保存好的txt文本名字要注意看一下,不对的话,记得改一下保持一致。
    ; B, v% P. s5 \& T9 k' f
    1 b( A: S8 ^, G, [

    : C. T/ x* L; I( O7 vf = open('弹幕.txt', mode='r', encoding='utf-8')! U! g: P  f# K2 l2 E1 U5 g4 e3 ~
    text = f.read()
    1 |% S! I4 u: Z) M- i: a! etxt_list = jieba.lcut(text)
    ! F' b% i7 ~. X9 u1 o# print(txt_list)
    * o; O! s" @+ d; {2 ?& e/ b3 ~1
    * l/ r* ]* B# d28 U- @4 x! |) e- V
    3- b, h" j$ f: L( z. l9 u
    4
    " v2 s/ q3 ]0 l) C% d列表整合成一个字符串' `/ _- y8 D' i* }% K* ^
    % a! K+ G7 y# |1 e$ c+ M& d

    % M* {$ |4 V) _string = ' '.join(txt_list)( f' g+ q3 L% r. H5 v8 }9 E
    print(string)
    7 I8 F1 g( x1 q. c3 J5 C0 {print('---'*50)* c) n6 A+ D- J/ [7 a# o  n6 [2 W
    print(str(txt_list))& Y( p7 p, y: x4 S; @4 u0 }
    1
    / v) ~0 j8 Y, T* G3 Q' y) W/ i2/ v+ M: E% n  S; _5 E7 W% b. h
    3
    6 Y/ ?2 M+ D. X4
    4 ]# `; O2 v$ R" W2 J9 D词云图设置
    * }0 R9 f& R; g+ T! [9 A0 L* \$ O7 E2 E+ K$ U
    $ V: l$ y( D( ^
    wc = wordcloud.WordCloud(5 r& P& N! c8 Y/ X
            width=1000,         # 图片的宽  ^7 m4 ]* f: y- w5 r
            height=700,         # 图片的高# f' G! a5 F" W! E/ @
            background_color='white',   # 图片背景颜色! i  e' d  Z' z
            font_path='msyh.ttc',    # 词云字体; k4 c2 r' R1 O9 I+ n  h, Z
            # mask=py,     # 所使用的词云图片
    ; }& y- l- J2 o6 n2 V1 e        scale=15,6 |0 A5 L+ P8 O# S2 ]
            # stopwords={words},         # 停用词) `& n7 `0 e; q2 |+ b6 n
            # contour_width=5,
    % s0 E" F+ d- K. ~8 N        # contour_color='red'  # 轮廓颜色
    7 q0 C( D4 v1 @; v0 I. L* B+ g)3 l0 p" X) @2 k, Q$ N
    1
    % p3 f5 _9 D) J9 F" X' p2) ^% h' n& F# l1 |
    3
    0 I! |" `* k  w5 c" a* l+ `' E4# `3 t3 E+ i4 }
    5
    ; `$ s' k. v4 ?6
    * D$ m4 j1 ^: D2 x2 Z7+ a" ^% D) @; A
    8
    4 o4 u, r! g- E3 G3 z" @96 J$ T: L4 E) a
    10: A) q8 f8 L/ x) B" A. N4 U7 |
    11: |/ y. f5 ^( A5 F& }0 J" H6 V+ p
    给词云输入文字" v& q8 ~, k9 X. p" V

    + t3 l: x  p2 d- U) V4 N

    7 d' n9 k1 H( ^2 p8 m( p+ vwc.generate(string)
    , F& S  s& P2 ^, n# }19 v) \% N! r9 X3 L7 W
    词云图保存图片地址
    9 b& ]( ~' x; a+ \1 r* ]. }3 ^& ~& J5 X3 O+ J7 a/ I" a7 o

    4 [5 B: H6 {1 wwc.to_file('output1.png')
    2 Y: x2 A3 W6 X  }1
    0 X2 Q5 s) N6 g, p+ a* }词云图的过程中有点慢,大家不要心急' A( D% `' U3 X

    2 E+ q: |2 g0 Z' t
    ) w5 W5 u9 [( C, C+ }8 T/ _
    这是最后的结果! w! V. e7 n: c0 z# v

    + T0 d7 ~+ S' F3 b$ V, p6 h) w
    % l4 g) H2 T0 q& _
    没有加停用词,所以一些无用的词比较多) `% c) O  N$ P6 y3 Z/ J6 o

    # `! u$ W3 \/ `; f: w7 g7 e$ f0 B1 B

    ) P& N& Q7 [* S: F4 k# N) cstopwords={'了', '啊'}
    ' Q: `% i9 `5 v6 z1
    * ?: N+ @+ }- H/ _# Z$ F: ]3 G) t把这个部分的代码加入要屏蔽的词就OK了!比如我现在把 了 跟 啊 这两个字屏蔽了。
    % @1 Z$ J2 d1 ^  }& `6 L$ ]我们再来看下0 N, T- F( X3 [8 W4 R+ r2 Q
    ( _) w" N1 C% ?1 S8 z- Y& o" M

    ' s8 U- t! v1 |/ E& g% _# l9 C% m不知名网友:666666 牛批 老哥我要学!!!
    / W( s- l8 M. B8 v$ [9 v2 {4 Z
    ( u( j5 ~; b0 n; P+ B! b9 ~
    ' J: W5 |/ u& w) p% @: R: Y

    8 U# `7 O9 M# E" h

      ]8 W: t/ }3 G( n7 S( y————————————————2 q4 P. ]6 m5 K* R
    版权声明:本文为CSDN博主「编程界的泥石流」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    . v* |8 R6 M4 z% O: h* E原文链接:https://blog.csdn.net/ooowwq/article/details/1192119076 {0 ]6 {3 e, I! z/ p8 M+ m  y- M

    8 D) ?, Q: d4 X+ t9 H; j6 S! H- o( j( d5 F1 L, D
    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-9-22 16:05 , Processed in 1.067715 second(s), 51 queries .

    回顶部