QQ登录

只需要一步,快速开始

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

    $ @0 z- V4 M/ o# [# \& V用Python把B站视频弹幕爬下来,绘制词云图看看大家最关心什么!, B( k; s/ S% J9 h! ~$ E
    今天带大家做点好玩的,把B站热门视频弹幕爬下来制作词云图!
    # }. Q1 O2 G- D- g8 w  A康康大家都怎么说!3 `/ N8 n9 V: }3 |: Z4 Z

    6 H/ |6 m  j3 c! Q; |' o; C, i

      t" @; C  `2 N% |( n0 }* F4 z7 w! M* j0 p* T  A- p
    2 T+ j: a* k) E/ o
    开始之前先给大家啰嗦几句,可能有些兄弟不会安装模块,我大概讲一下。
    + `* C, f2 z' P& C/ d9 O
    * U$ O  H) L8 P: p
    - ^5 }* Y" L9 f& N/ C, f1 u
    如何安装模块:
    - d# F1 L( ?) f+ n, K  Y
    " L9 u1 a6 i, N2 m+ W; q$ j, n
    ! [- \/ a: L$ w; \: ?" o' Z6 x$ U7 S
    win(键盘左下角ctrl 和 Alt 中间那个键) + R 输入 cmd 输入安装命令: pip install 模块名 回车" `! ^# D8 j) m8 G" j: _/ h
    pycharm里面安装 terminal 输入安装命令: pip install 模块名 回车
    9 \2 X) m5 K5 @7 o, z' [+ b! y( b8 d3 ?如果模块安装失败了,可能是这些问题:) v# m! U& g9 H% a1 u# p

    4 l. K, d' H0 ~5 k3 I
    + P- U- X  Y1 a9 L% V9 Q
    提示:pip 不是内部命令
    * ~/ F$ ?$ o$ [4 S6 i! g7 f1 ^+ l你python环境变量可能没有设置好
    9 X3 u, S' r$ t  X有安装进度条显示,但是安装到一半出现报错了- u4 C0 j% }0 O0 d. s" ]
    因为python安装模块都是在国外的网址进行下载安装的, 国内请求国外 网速很慢,下载速度大概只有 几KB
      l8 c: m) I# r+ R: j$ t; Oread time out 网络连接超时 你可以切换为国内的镜像源
    & Q2 \, w6 j& W+ t, A3 b明明在cmd里面安装好了,但是在pycharm 提示我没有这个模块. O  W& R* a9 N3 i8 w: J) U
    你pycharm里面python解释器没有设置,你在pycharm设置里面重新设置一下
    * a2 R/ o$ b' }. g可能安装了多个python版本
    % y- ?0 t8 B% X6 C# W安装一个版本即可% }; y; N6 i* v# e! ~' J
    Python做爬虫到底可以做些什么呢?
    ' r0 m# K+ p/ P. s6 G+ g) \- k6 }
    % b' \! }6 I- o, I% V6 |' u
    常规: 爬取网上的数据 / 我可以批量下载图片/文字/音频 视频…* y( F+ u- d$ g: n
    12306抢票 / 京东商城电商网站抢购脚本 / 朋友圈刷票 / 一些问卷调查自动填写… / 文章刷阅读量 / 音频 视频 播放量; [. T1 C# I7 G/ n5 t
    可以刷课 可以刷网课 自动 还能自动批量注册账号1 R6 s/ Z: p' O* l7 P2 f2 d
    模拟点击 >>> 游戏辅助 >>> 修改游戏内存(单机) …
    0 m, t# Y( X  S  D普通B站视频可以爬 番剧是需要会员的# t8 t, k' q# o7 G" _7 O

      G- y  L9 [8 r

    " e  h, _4 @8 L1 F1 v* P爬虫都是通过开发者工具进行抓包分析 查询数据来源 ( 静态页面 / 动态页面 ajax异步加载)
    ( ]4 R7 E& |+ U5 Z- H6 i6 J+ l+ I; @; p% \6 v; P7 [. r

    7 q0 v; \: v7 @" x0 d" o$ H: R: J1 D1. 确定目标需求 (弹幕数据 那个视频弹幕)
    6 N4 l6 {3 D1 V* \6 J0 o- p0 R    确定了3 P, j8 q; r+ d  |0 f% l  F; I- k
    2. 找数据 (数据的来源分析)
    * q7 M" w7 u) H7 ]4 \; Q    简简单单 找到了6 t/ v& j8 t5 G  I5 I
    3. 对于数据来源的url地址 发送请求 (请求方式 / 请求头)
    5 A/ l4 K$ Y% M: b+ J5 u- X    请求方式: get / post6 i" s3 D1 }# J: f. W' H$ B
        请求头:
    3 W+ B  s- y& r/ Y9 \    https://api.bilibili.com/x/v1/dm/list.so?oid=3762001960 Y. F/ Z) s% w" q4 Y' L
        (通过开发者工具去看一下数据的具体来源,是否是来自有这个网站)
    , U4 Y' U. }8 i7 I* ]7 Y4 m4. 获取数据 / b; x$ W9 O8 R
        文本数据 response.text 获取网页源代码/ x( {0 l1 }/ D3 G; m- K% C; G
        json字典数据 response.json() 通常一般情况是 动态网页  ajax异步加载 用的比较多
    - v2 ~& W. g, o6 Q5 s    二进制数据   response.content  保存图片 音频 视频 或者 特定格式文件
    8 D( D1 {1 g+ l) v' E3 B; m5. 解析数据
    0 Z: x5 q; b% s3 Z/ ^. S    正则表达式 .*? 解决一切  遇事不决 .*? 通配符 可以匹配任意字符 3 ]' z1 d2 q7 w, A4 s; [* h
    6. 保存数据- J) m5 D2 j) C! B9 {/ Y3 |, N' n
    1
    2 x3 w+ T$ G! U' ~; G3 \( Q2
    6 m( l# |+ q+ d1 [0 P3
    * m( e; @  M1 j. Z& Y+ j7 l45 \3 o1 ]) e9 Q0 h5 ^/ r9 g6 G  }  f
    55 `$ ?% S+ T" e( o! r$ N  w
    6
    2 B3 y, Z5 H% j5 Z. G0 k  d( |  o7, m) [' U0 V1 L. n" \  n0 r
    8% @$ }/ v: m1 ^& E$ j5 Y$ K# L
    9+ C2 ^9 L3 s0 u& s1 D6 r
    10: `. X4 c' d8 f5 \$ F
    11% J0 Q7 i" h5 d
    12
    6 j. B! s4 @0 w; Y! g& n2 x13% b! L; ?9 y" P
    14
    8 K* u9 I8 @9 C  g9 C15
    & e5 M+ x# Z2 e5 v. n3 [3 c+ ?4 [16' S2 F3 K, i4 t- O
    python除了做爬虫数据采集,还可以做什么?6 G" z- B: d8 K
    兴趣学习 还是 通过python技术赚钱 (就业找工作 / 外包)
      B. V: m" D; x5 A) `  d
    ( S7 f0 s% @7 h$ r# T# u, P

    9 j- a+ T6 Q4 q& t网站开发(就业/外包) >>> 我们课程是教授的全栈开发 薪资 13K-15K
    7 Y+ I$ W' h4 {, a. N比如: python开发网站: Youtobe / 豆瓣 / 知乎(以前版本) / Facebook / 美团 ;
    3 D' {2 \/ i. s- {/ ]我可以做到这样么?
    5 Q/ D& F( W5 _% j; s0基础 初学者 从零开始学习,上线 通过 域名 服务器 数据交互,4个左右的时间 就可以独立开发这个项目 类似知乎的网站;5 U& L$ G7 }3 ^% m1 B
    如果你做去外包(团队): python开发就业 大多数也是进入外包公司 一个 10-20K左右;: J8 ^- L) P- m) E* h1 I

      o) L# J% \7 L' Z1 q2 B3 N4 |4 O$ }

    * w0 X4 u0 C+ x; j' m爬虫开发(脚本)(就业/外包) 可见即可爬  u: }7 B: Y7 q; u
    虽然爬虫什么都可以爬,但是获取用户的个人隐私(信息 电话 身份 贩卖 )、国家信息、商业机密(未公开数据,或侵犯版权)、色情等违法信息用来盈利,就基本上人无了!' u7 h9 f4 b! @* l3 Q) [0 x
    很多兄弟问我,可以帮我淘宝用户数据吗? 我都是告诉他们,这个我还想多活几年,这玩意涉及隐私,个人信息,你可以自己学了悄悄爬,爬完记得删了,用来实践问题不大,但是别用来盈利!!!
    % I- t# s7 k# u* M/ s0 o之前有个兄弟爬取微博上面军事武器航母图片买给国外, 然后就进去了!所以奉劝大家,切记切记,别乱来!
    " P; }9 @7 z) o
    # J- S. u; l6 }2 I

    5 z3 R8 c5 z* k) L% B数据分析(就业/外包)
    4 @( {& S8 X5 @& z4 P% u7 j1 t( z" e+ b0 A

    . ^0 N7 o5 |3 Y自动化(脚本)
    / E' X- [9 Y* a
    . d. Q. ?- B9 s) s6 A
    $ ~. I% n+ W) w# |/ \3 N6 T( X
    游戏开发/辅助(脚本)
    - n9 U: i8 |! h
    4 y- C* J# v+ n! e! R4 p
    & L/ v6 c) }: w; Q; _, J' M% ?% i
    人工智能(研究生以上学历 要求很高)
    / V( O! s( E6 J; m! y. P6 G8 ?% H/ o! X, t* i9 w
      P0 |, b/ R1 f# K
    等等方向还有很多,我就不一 一述说了,那些方向对于一般人来说作用不大。
    % _2 s4 J; Y( Y6 W2 A# _
    4 ]; c$ u+ S& M9 k0 a5 Y* |/ ]

    # L0 J, B+ T- J  V) a. y3 Y" z" U我们开始正题吧
    : h/ q- W$ I2 Z% e# p
    " v9 z- k# d) s5 d1 ^: D
    9 Z4 u# v. U- N* e
    爬虫部分:
    / w- O1 e' i) o6 @2 L+ F发送请求 第三方模块 需要pip install requests
    1 I! x* {- v( A; j5 M  V3 q, [( {- y

    9 T# Q8 ], m) aimport requests( o* _9 n( ^4 c% ]* x. s
    import re  # 内置模块* B) f* b! ^6 ~, f1 H6 H

    ) [- I/ C) K1 X& ?4 s( }

    3 R3 ?! J$ ~( f* Q- R7 h7 h# E! lurl = 'https://api.bilibili.com/x/v1/dm/list.so?oid=376200196'# w8 m7 T1 |, c3 N
    1
    $ }4 M9 N  D% L& N  W' X& E5 @2# }- `! i. n5 T0 P
    35 t1 C3 J  a$ W9 s3 T
    43 Y; l* `: O6 o/ x9 X! o  `$ W
    请求头的作用就是伪装! x% p1 ?1 p& V

    4 s" o% {. H, `5 \# R4 c

    9 M7 {9 R3 h) }4 U0 Z0 t; \headers = {$ j8 w; j/ t* j7 j; [
        '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'
    # D0 A" ^, G& ?7 @}7 L' L2 S+ v7 M+ m# K$ D7 C
    1
    / Y3 F0 f9 ?/ a: W  B2 g29 ]" x0 |) G' [( ?: N
    3
    0 ]( ^. Z/ S! Z. v/ I, g- W模拟浏览器对服务器发送请求, 服务器接收到请求之后,确定你没问题 然后会给你返回 response响应体数据8 Z6 T* r% B5 t" f
    函数传参, l5 D3 ^0 |+ U1 h/ d+ O$ |  v" D% Z
    / J& O- f" |; _: m6 F8 j4 A( K$ J' \
    ( O6 n& G3 b5 f# E: w
    response = requests.get(url=url, headers=headers)
    ) N! J! Y( F5 F' t8 U1
    # X9 l; j; ~  g6 J2 k, Z8 k3 M& g<> 对象 对象意味着你可以调用里面的方法或者属性% P6 {1 ]; U' t- P0 v2 I- @) {
    200 状态码 请求成功
    & g. S0 Q# j( {2 p( r3 e获取数据 文本数据
    . I: s' n" E7 }! Z( }; b$ A& h自动识别编码
    5 p3 H: h( Y, V: o6 d6 |# n/ Y& R$ u
    4 v! S0 U6 U$ Z& @
    5 S1 b% O! D) c2 Z/ I. N$ V
    response.encoding = response.apparent_encoding
    , S8 P: v! w, e% c& chtml_data = re.findall('<d p=".*?">(.*?)</d>', response.text)$ i/ x. {; ]2 @1 ~
    1& [* {5 D2 T* `: T
    2
    ) S9 M3 ]- m* z2 R* Scontent_str = ‘\n’.join(html_data)
    8 B8 E% X, K* E3 I7 H+ }0 A! W6 x5 u1 `" f. R1 M2 ^

    2 m7 @# q. h# @- V; {: Y要列表转成字符串 ‘’.join()
    ) }! V2 p3 L. d5 W0 L$ T4 j$ wfor 遍历
    6 L! Z  j' S' a0 n% R# l保存数据 保存字符串
    , D6 t( R: X* @4 Bfor content in html_data:
    1 f( L8 B) z+ K: d+ E    # mode 保存方式 w 写入会覆盖 a 追加写入
    ' X( ?8 z: D9 G, y$ c7 O0 M    with open('弹幕1.txt', mode='a', encoding='utf-8') as f:4 ^8 W( b, K: S* D4 s7 ^
            f.write(content)' Q& f5 @* i: W
            f.write('\n'): A9 W% U, O  G. f( t

    & k  B, z( s/ [, y" A# e9 ?9 C' ~
    " I, o6 I( ]  @, Q7 K9 D9 Z; K
    # print(content_str)
    ( y4 I% _" V% U4 o  m2 g1
    ; [4 T3 L: w4 J9 F  o& r* s2
    1 J0 G6 s5 f& J7 A4 ~& B3
    : N! u. E& s$ t: m! ~4
    # n2 X6 H) H! Q5 }) \5 _5 o; x5
    4 Y' `3 s* n- }5 I5 B6' Q3 \( n& m. S* {
    7! F1 g2 G0 l) r
    爬取结果
    : j# f( c! C) f9 S7 ]3 B8 i
    & e( U! Q3 Q8 C  C4 v* q1 H& L9 U, k6 O

    2 R# ?. _; e4 J; A+ ^2 A  V* c8 C; |7 x( l+ F2 s' X

    & W1 i. ~' w1 V' d然后我们再来实现制作词云图部分$ [/ [7 _' ]' f) }. Y  [! U' G

    4 \4 V% u* I3 g5 Y) @/ l( [
    3 P7 ^8 I5 R0 f7 A  |
    首先要安装这两个模块. y, T3 d" V  e. y, a! d( {6 B, `
    / F0 f7 C  b  |

    1 T5 ~* {' B) c* z, eimport jieba$ ~; F& G2 ]4 N4 }' k0 t0 K+ B% @
    import wordcloud# F( C; P2 P8 ]' t# c
    15 A5 n# m# L: f. `8 u/ J; \% }
    20 @* l- w- R5 [
    一个相对路径 一个绝对路径,保存好的txt文本名字要注意看一下,不对的话,记得改一下保持一致。$ P+ D: C) `6 H( z$ j; u$ d
    / p7 ^" I+ E0 y( x/ ~

    ( K* d, o* I+ E$ J& Jf = open('弹幕.txt', mode='r', encoding='utf-8')
    * q* f" y" o$ h6 ytext = f.read()
    + Q0 @+ s$ u& D; L0 _txt_list = jieba.lcut(text)
    ) {  h; J( u( J" o( |' {- u# print(txt_list)
    ) i* [2 e4 v6 h8 k! [+ L4 K1
    ( t7 z" L, j' A: T* G; Q1 {+ Z+ e! q2. I% O0 v" C2 E; `7 ~2 l
    3
    * B3 u( U) ]3 E49 l4 y; H& n. h
    列表整合成一个字符串
    % ~4 |$ I. V7 ]* l, K- C
    ' ]! y& J  M4 I+ ?, F/ w! J
    7 ], Q) _  D6 ^& d
    string = ' '.join(txt_list)4 d: Y& O- p1 f
    print(string)' _  x& i+ `. k) b
    print('---'*50)
    , U' a/ o, R1 V/ i! _9 C; Qprint(str(txt_list))2 J/ v. [9 Z( l: |' @4 J
    1
    / \3 T# L" m- k% B2  H" g/ h/ V- ^. s: g3 P
    3
    : J+ y4 H* w: \  S  R9 v  _42 @) U: }3 o7 K1 x" T
    词云图设置- I% n9 Z7 |! B1 h

    - Z! i" j3 \" i9 N

    ; S4 h" b# w9 X1 L* y1 m; }wc = wordcloud.WordCloud(1 C; m" ^  e; c% D; H) Y6 ?
            width=1000,         # 图片的宽
    4 l# ?& z! _  ?0 v7 ~% g        height=700,         # 图片的高
    . g$ w/ u" w2 U$ K4 h% r* R/ H        background_color='white',   # 图片背景颜色
    , j5 Q- i9 P9 R        font_path='msyh.ttc',    # 词云字体
    " I/ J$ a7 e% b- S2 F; r1 h        # mask=py,     # 所使用的词云图片$ v  x, K% @) }5 U3 B
            scale=15,# P$ E# R) s" A8 T
            # stopwords={words},         # 停用词. |1 G7 `; H6 i1 v3 Z8 z
            # contour_width=5,
    , l3 r6 Q% \" g; W5 d5 a& `        # contour_color='red'  # 轮廓颜色
    - [# T! C# r) o% T)
    4 q' \& Q* O  j0 @, ?0 _1
    ( W9 E: h1 K; S1 L$ i4 G; f, I2# _" c7 f& Q+ o  U; f
    3# g$ ], U7 U1 G5 S4 ^3 L
    4# ]( k9 t2 z6 U; Z
    56 o- V, o4 m: u) J! |
    6
    , Q, i& a6 r  u3 M& L  A7
    " `: A& n8 K4 M9 e- [7 J4 ]  V& l- f2 {89 r. {5 E/ `4 r7 b( q/ G: p4 |' N/ y6 h4 J
    9
    ! q4 _' v9 {/ ]" L7 p5 I10
    : }7 a" U1 Q- r+ f0 L11
    8 @+ b, M4 C5 ~! H给词云输入文字
    0 A0 U) g& C4 t! j0 }1 `
    * o0 D) p* k/ z, `! b2 p. F

    ; M: [& r+ O) Lwc.generate(string)% R2 _8 M: T" D2 \
    11 u: O& O& G% w7 v
    词云图保存图片地址
    " D) ]: Z* n' ]$ C
    , g, U- m6 N6 W: F8 A8 ?
    9 z  P& I3 b1 n& A1 I! K
    wc.to_file('output1.png'): v& r4 u$ N* Z) }9 S, ?9 n
    17 I9 G% q* D$ s, t
    词云图的过程中有点慢,大家不要心急
    & F8 h  \3 s! N1 j' V- |$ _  F, j9 Z/ e" K' @- u: M# t; |
    # ?$ L$ ^- w1 V- U4 {9 p
    这是最后的结果
    5 t+ z/ b4 [$ e; K2 V! {0 T) `& I+ e/ _4 K! M. R; F8 A
    1 U. \8 ^8 @9 s, r/ U, W- l5 I% p
    没有加停用词,所以一些无用的词比较多+ w7 C8 D6 N* }, y# w: H
    + L) D1 @% w7 r, s% r" W8 k
      {0 v: P  X- \8 Y( n
    stopwords={'了', '啊'}- [) e5 B3 `. r% W2 G3 v
    1
    5 c3 ~: l& e6 V& S1 M! b0 M9 U把这个部分的代码加入要屏蔽的词就OK了!比如我现在把 了 跟 啊 这两个字屏蔽了。
    7 [+ I! _/ B* I: H1 u我们再来看下
    9 O% V* Z6 C8 C% Z1 l. E, k8 A+ s( K; S' \# K* i+ q

      V% ^4 g$ C) _不知名网友:666666 牛批 老哥我要学!!!; l9 @0 d+ R# t! A+ ]. J+ w$ Q

    5 {2 @6 F8 @. ]- w( s

    ' X; v0 X8 l6 v5 ]- K+ t3 q7 R. R- |1 m: ^3 y

    + w" X; q4 g# p; r: ~" w————————————————4 J5 G9 I* d; w
    版权声明:本文为CSDN博主「编程界的泥石流」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。. G- x% N1 o# s! R6 _6 ?2 U
    原文链接:https://blog.csdn.net/ooowwq/article/details/119211907! F" A1 a' e- Y/ T/ U! d1 m
    3 J. A- p9 Q; y# z

    6 `7 b' x. s! J! g6 ]
    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-7-28 22:01 , Processed in 0.368552 second(s), 51 queries .

    回顶部