QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3126|回复: 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
    9 l0 \' U+ |" Y/ S7 M
    用Python把B站视频弹幕爬下来,绘制词云图看看大家最关心什么!
    ! p6 v* Z, Z6 @今天带大家做点好玩的,把B站热门视频弹幕爬下来制作词云图!
    / Y9 V- r& c3 w康康大家都怎么说!
    - A- @8 {# B! W1 Q: E' [5 Y
    ( c6 A6 G: {& @& l5 j

    7 T# |  p: \+ n* v* Y: {' i, j& ?3 u
    . G1 s7 P( G# c, n
    开始之前先给大家啰嗦几句,可能有些兄弟不会安装模块,我大概讲一下。
    ! Z. L3 q* R7 ^6 _  G, t
    4 N. ?" s3 `0 _% T: c* F5 v  A1 N

    # u! Q8 C# r  D如何安装模块:
    " x7 W& g& j9 h2 \& ]0 `
    ' A2 |1 P: h$ c" A* ?1 o' `! C' _

    4 M8 {/ n$ Z! R$ d3 K0 uwin(键盘左下角ctrl 和 Alt 中间那个键) + R 输入 cmd 输入安装命令: pip install 模块名 回车% A( x, T; S* ^9 L
    pycharm里面安装 terminal 输入安装命令: pip install 模块名 回车+ F0 ?; A5 V9 x" h0 }3 ?. \
    如果模块安装失败了,可能是这些问题:2 i$ F- m6 n- b+ \# l  h  {

    $ m. ~7 ~) B! ?# _
    + ]& ~$ O! ]7 }% h% u" ^- }$ ?
    提示:pip 不是内部命令" D. |- o( q! x3 ^! R- R
    你python环境变量可能没有设置好
    0 f3 O. s" _: ]1 G  w6 T* a有安装进度条显示,但是安装到一半出现报错了3 \3 s: \% Q! _# N+ L2 J2 U
    因为python安装模块都是在国外的网址进行下载安装的, 国内请求国外 网速很慢,下载速度大概只有 几KB
    $ {. Y% m% q+ [& S) V. `; ?: }4 {% pread time out 网络连接超时 你可以切换为国内的镜像源0 `4 N3 V2 n/ y4 \6 Q0 Q
    明明在cmd里面安装好了,但是在pycharm 提示我没有这个模块( Y6 U  ?6 M$ J' f" r; `9 z& X
    你pycharm里面python解释器没有设置,你在pycharm设置里面重新设置一下3 I  W# W1 D) q- d% ?7 ~* [0 B
    可能安装了多个python版本1 ]. G5 }4 W8 i7 I2 w8 @
    安装一个版本即可
    5 T, ~$ w2 ]" k4 ?Python做爬虫到底可以做些什么呢?& Q% O# e: n! o; f& n1 v

    + u2 p; H# Z# e. ]3 s% t) o
    1 u6 @+ @; _( C0 ~( I; ~
    常规: 爬取网上的数据 / 我可以批量下载图片/文字/音频 视频…; f1 i( Q! p- N9 S+ P
    12306抢票 / 京东商城电商网站抢购脚本 / 朋友圈刷票 / 一些问卷调查自动填写… / 文章刷阅读量 / 音频 视频 播放量
    2 N; r' S6 U3 n3 J9 v! r可以刷课 可以刷网课 自动 还能自动批量注册账号5 x9 }0 c, ]: I& M8 F! |9 K7 r
    模拟点击 >>> 游戏辅助 >>> 修改游戏内存(单机) …
    ( T7 R6 R: _: O& Z6 H& S& J普通B站视频可以爬 番剧是需要会员的) V' W% [: z# m% N3 m1 O. F
    5 o9 u: I* [, X& s/ j2 L

    ( g- E2 N( b, }爬虫都是通过开发者工具进行抓包分析 查询数据来源 ( 静态页面 / 动态页面 ajax异步加载)
    / Y2 l. Z- J" E& F9 c9 u8 N- [' t% Z4 }  ^3 M0 A$ F

      [) h% x" \$ D4 o3 \) y1. 确定目标需求 (弹幕数据 那个视频弹幕)
    : b  F% q9 _7 ]) ~    确定了
      R* |6 o3 O% J' y2. 找数据 (数据的来源分析)
    ! J/ n2 B1 H- ~8 S* J    简简单单 找到了" g0 D" G: w: I5 X+ ?
    3. 对于数据来源的url地址 发送请求 (请求方式 / 请求头)
    " u* R) p$ u# ~# S' i$ i' G    请求方式: get / post' o8 B2 y, k( P9 K/ C
        请求头:
    & r( B" a& E$ {5 C5 b    https://api.bilibili.com/x/v1/dm/list.so?oid=376200196
    4 @1 t- p" k* S  [" o8 y, ~    (通过开发者工具去看一下数据的具体来源,是否是来自有这个网站)2 C* J8 x  ?( }- J6 S! {1 S
    4. 获取数据 3 h' l; q, \" W# P1 Q5 e
        文本数据 response.text 获取网页源代码4 f5 ]! v( ]5 S% I
        json字典数据 response.json() 通常一般情况是 动态网页  ajax异步加载 用的比较多
    ' G& |) m7 O6 C- Q    二进制数据   response.content  保存图片 音频 视频 或者 特定格式文件
    & J4 J9 b6 c4 D8 f) ]) h5. 解析数据
    1 {/ _* |- i- O1 S: {! ~    正则表达式 .*? 解决一切  遇事不决 .*? 通配符 可以匹配任意字符
    " y& l! l4 k! G3 \6. 保存数据
    1 Y; ~6 K4 `/ i% i) h  C16 M" d- j8 z( E/ U
    2
    ! A! }% X; w' F3
    & s/ f5 b- `/ [% |4# U: o. ~/ n! r2 q. m: J
    50 |% ~6 r4 z( O2 k) r
    63 D: j5 N# o0 f1 k
    77 J, Y5 Y4 U) N9 }% n
    8
    0 F) a% ~9 O) B' W9
    ( K1 Y7 f: j7 X4 B10
    3 P1 ?4 v+ a' T3 y" b* n11" d/ J) |5 f( K3 C+ S6 S
    12: @) v8 G$ I' n
    132 Y5 ~+ m) N. ^, A* D$ w, `8 [
    14
    6 \/ Z9 H; r8 O" T. @2 R- n15
      \* i4 ^: _5 k7 W16& T4 P7 y* `( C" ^2 |4 ]
    python除了做爬虫数据采集,还可以做什么?
    * F) H" l6 _+ A兴趣学习 还是 通过python技术赚钱 (就业找工作 / 外包)
    0 j- I  h3 ]/ n9 c1 O! `; r1 o. M3 w' |* |: u2 M4 e

    ! h1 h) a9 J1 f/ G5 u网站开发(就业/外包) >>> 我们课程是教授的全栈开发 薪资 13K-15K# }7 ~9 s9 N7 q+ ?- F% h' o, |
    比如: python开发网站: Youtobe / 豆瓣 / 知乎(以前版本) / Facebook / 美团 ;
    1 T' ]& r2 R1 Z# `% Q. Q" ^我可以做到这样么?
    9 ^+ F: P9 t5 K+ F0基础 初学者 从零开始学习,上线 通过 域名 服务器 数据交互,4个左右的时间 就可以独立开发这个项目 类似知乎的网站;) R3 O2 w0 T; Z
    如果你做去外包(团队): python开发就业 大多数也是进入外包公司 一个 10-20K左右;
    ; Q  T5 X' N) p7 i4 h( @9 [0 p0 j& m0 @, e
    - M& s1 K: I  c
    爬虫开发(脚本)(就业/外包) 可见即可爬
    ( D* X! g* Q4 S8 ^: ]" {* p虽然爬虫什么都可以爬,但是获取用户的个人隐私(信息 电话 身份 贩卖 )、国家信息、商业机密(未公开数据,或侵犯版权)、色情等违法信息用来盈利,就基本上人无了!* _9 H- C& @, r- W! n
    很多兄弟问我,可以帮我淘宝用户数据吗? 我都是告诉他们,这个我还想多活几年,这玩意涉及隐私,个人信息,你可以自己学了悄悄爬,爬完记得删了,用来实践问题不大,但是别用来盈利!!!
    9 A* V3 r9 w) N  o$ d之前有个兄弟爬取微博上面军事武器航母图片买给国外, 然后就进去了!所以奉劝大家,切记切记,别乱来!
    ) y3 ~) M8 v1 k: }! p, B. c2 s5 d6 E0 L
    : u) k/ V: q  Q( Y
    数据分析(就业/外包)
    , j* g, \, S; Q% \) \3 d( w
    6 `2 i+ L5 g, R! B; s
    ' U+ Z0 L* ?8 H: A$ c0 p  n/ k5 I) `
    自动化(脚本)+ D9 O: Y3 g( T9 T/ F+ C

    7 M# T3 k0 \. w4 Y$ L

    % M1 Z/ v  j' a7 l5 U0 F( C游戏开发/辅助(脚本)
    0 Z' @. N& M: f/ Q0 y! |+ g4 A, y0 K
    ( B( Y: L! i1 w7 M- j

    * m' n5 t3 a1 }; V3 i, c人工智能(研究生以上学历 要求很高), A' E% A/ @3 s9 M
    . y* Z8 [( R: s1 `9 |# Z( ^' F9 w& ]

    $ D# o4 d  t  L$ ]2 C8 g等等方向还有很多,我就不一 一述说了,那些方向对于一般人来说作用不大。
    6 W/ N4 G) B9 @, h+ ^7 j* W
    ; a0 w% K2 P: a0 u! I  o

    $ G; ?% \2 F2 t; q" h8 A' _我们开始正题吧
    - q  q# E! C% D7 ]& Y/ Y
    " B. ~. z; `" O, e/ `8 N3 c
    8 c# N( {  O5 f% W
    爬虫部分:
    4 d3 h4 C5 i  j$ ~发送请求 第三方模块 需要pip install requests
    $ I' y4 w4 Z, p" I) ?6 e( U: q) Y8 L5 |

    : ~9 G0 T7 C8 l( x0 N8 \7 J- Uimport requests
    2 j$ i7 c( A, V+ A* B4 v" }import re  # 内置模块9 G" S: {4 s* C7 c

    % |5 e+ h- v7 e! e4 J+ M% y

    - d3 G: ^) ]  Uurl = 'https://api.bilibili.com/x/v1/dm/list.so?oid=376200196'3 P! n2 k. Q: H
    11 h2 ?5 e. Z/ Y5 f' ~
    24 n1 |2 s& M& g+ w
    37 O& x2 i9 K0 [
    47 p! p" n% ~; b* o" U) q" Q
    请求头的作用就是伪装
    7 Z  f6 _$ o* z; U9 E" e
    ( i, E- u- x9 P0 ~( L5 j$ b# h

    0 Y6 t; k1 u; l$ s3 V3 @, eheaders = {* m) u  ?; U# d+ c  I
        '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'! p# K' c* `% s3 L' i8 U1 \2 d
    }. _! m% w8 F2 O: S1 t8 E, s
    1
    4 b2 S6 {* n9 `2
    6 H2 l! p# i/ K$ k3- k1 c- E/ n1 L4 {  m* |
    模拟浏览器对服务器发送请求, 服务器接收到请求之后,确定你没问题 然后会给你返回 response响应体数据
    & d9 q# Y5 q7 w9 a& b函数传参
    ; u3 l7 W0 [* L, }9 L; f5 z% |# X+ m% X

    + k0 |) f. S8 h6 Xresponse = requests.get(url=url, headers=headers)8 B- e6 l0 X8 V+ R
    1
    + P9 O6 Q2 q5 ]. r* W* W<> 对象 对象意味着你可以调用里面的方法或者属性
    . J3 n$ N: @) P! v; ?' G200 状态码 请求成功# ]$ B* ]* r7 y1 [9 \
    获取数据 文本数据
    # T/ g5 x2 c; j/ V5 S2 g自动识别编码
    # u# }9 w9 t( C8 X: s/ W( G* r5 P7 Z* I; Q/ O1 k5 c
    , b& _) b% W. z  E
    response.encoding = response.apparent_encoding
    / p% F7 u* c, V6 p- z6 Rhtml_data = re.findall('<d p=".*?">(.*?)</d>', response.text)
    ( u& A3 N( M- l" o1
    & w' q* ?* I$ J6 U/ r26 M4 b- r4 M  E0 ]$ H, |# Y
    content_str = ‘\n’.join(html_data)7 S8 O4 {  s9 X

    ) {0 a1 t" J, u8 S2 ]& a9 E
    4 D9 M5 t9 S, S" P: @9 s. `& o6 D
    要列表转成字符串 ‘’.join(): q4 I/ t! K' M& K- ~9 N. Z+ B0 h; s
    for 遍历
    9 _7 h" \3 n. O9 a$ T- j, V保存数据 保存字符串$ L+ C, E" m9 G- S
    for content in html_data:1 ^( g. E& N. s5 }5 B; f
        # mode 保存方式 w 写入会覆盖 a 追加写入
    " b4 ?9 _& Z3 x    with open('弹幕1.txt', mode='a', encoding='utf-8') as f:
    5 k$ S/ G' Z% e6 m( D; ]        f.write(content)# D7 k' a0 K3 x
            f.write('\n')
    5 I2 |! o- i9 l. z. S6 W/ H1 L0 J0 p4 z& q
    # C( O3 x4 u! h1 R) K
    # print(content_str)
    * X+ O( I4 ~4 Y" {: V8 `9 @1$ e2 I8 Q" z2 s' X: a3 S* j
    20 v: I% a+ T* _/ A6 Z& P
    3
    4 z+ u- ]" ~* u- Y1 E+ C' D4$ J  n0 `# D! R' Y
    5/ s  N( s) J+ Q7 u+ {
    6% I) T1 x% f6 G/ A: E$ u
    7# [2 q/ O' a9 m. _" L$ |: R
    爬取结果& k2 {0 D4 y8 X6 R$ y& z
    # I- P+ L' S: r- x
    4 T: {, U8 L9 `2 o1 ?

    : g" Y' k7 U3 R5 `6 c( l9 f" ?+ c

      T: a" u. r8 Z8 @! ~然后我们再来实现制作词云图部分! M3 X1 X: d3 Q  [: n' \
    ) \3 U# r) m8 Y, c& U! q+ u8 j

    , M' {# i  J  [" j$ ?6 b) c% W首先要安装这两个模块
    , [6 t# Z; ?4 w- I: j8 D. c) ~
    " p8 q) U# P  _! F
    , M8 M+ r% l) a4 u4 L* f  P: W
    import jieba
    2 D2 |- l) `) |3 e$ g* _import wordcloud6 h# m) q0 I* R" P8 U
    1( q0 |+ m" b+ N- o/ R
    2
    7 ~  [5 E0 `+ L9 A1 |  X2 w一个相对路径 一个绝对路径,保存好的txt文本名字要注意看一下,不对的话,记得改一下保持一致。- s" |5 E1 {0 b( B

    6 ^; _; B! F. x, O. |( ~
    " k$ n, c$ ^( q/ Q: r, u7 R
    f = open('弹幕.txt', mode='r', encoding='utf-8')
    7 i2 z, Q8 w; Z7 z+ b; dtext = f.read()+ K/ v9 W: d1 o) h; }
    txt_list = jieba.lcut(text)
    . a8 k! a, |- I# print(txt_list)
    ( y: @$ V$ b* m1
    2 T! c  F5 t) v% e" g( b0 t3 M2
    3 p3 O) t! g9 z3 o, J3 K. t' `3
    ; g5 s# k- W( J. Z( `5 b' ~4
    6 X* k! o$ e6 T! w6 O- }8 H( y/ L( {列表整合成一个字符串
    ( v1 {6 c1 s6 V& S9 }1 R2 d1 Y' I, x  e. ~3 X/ v7 J+ x4 F
    ( `1 w2 W" |5 o
    string = ' '.join(txt_list)
    + z3 B9 z' {* A# u4 [& uprint(string)
    7 {2 x+ B) D7 z9 h2 W* P1 y9 Iprint('---'*50)& z: x! a3 P( U0 b# C
    print(str(txt_list))' r8 r9 Y) [1 F3 Z: N
    1
    5 ~" y2 u0 X" n2
    ; g, ^" _. S1 r3
      A+ u0 n2 s* e+ l& z1 b7 O" q4
    4 _4 U2 V/ g( k% w词云图设置0 r; P* \& z' t. G2 f" C

    1 {# ?. }0 Y, Q& a5 c5 e
    0 S6 O8 i3 d0 ^8 D# H+ v' C% H' |
    wc = wordcloud.WordCloud(; t8 Z0 Y# q+ Y6 H% }
            width=1000,         # 图片的宽
    0 E0 K. A% i6 i. O! [        height=700,         # 图片的高5 Z: U. t% L5 ~
            background_color='white',   # 图片背景颜色
    1 n5 r4 U. [( Q) u8 X        font_path='msyh.ttc',    # 词云字体
    ; n. `: N- ]" x/ N/ V        # mask=py,     # 所使用的词云图片3 ~" w1 S# G6 S% b3 l5 m; `
            scale=15,
    ' q8 n, H! H" v5 Q1 ]( r: h/ A9 g        # stopwords={words},         # 停用词+ V$ R9 \* j8 e0 J0 q) c
            # contour_width=5,# s$ U2 x8 u1 n) q
            # contour_color='red'  # 轮廓颜色
    + B' A2 ~9 t/ v2 ^3 D' G' c); u# b0 j# @2 W2 o( e) _; ?& W! t
    1
    ) h4 S" P; E' ~  \& z0 {26 s8 U0 l& Y- v* \
    3
    ; W/ v+ P, m. y+ c* ]$ J6 Z7 H4
    9 `% _7 O$ m0 I1 A$ G" w5
    - n# c% U& _1 e: {+ y! L68 Q, |7 y. {, P/ i6 C( b
    7
    4 e' `# c1 U; v9 R5 v4 V8
    % i" @* @- K+ n. ~9 R+ S9
    / e" Z1 ?) O* ]  c$ p# Y- ^10
    2 Z! o: K4 |% c9 _3 `* z2 g! N9 y11
    1 S, L7 ^1 b5 e; e7 @- q$ u给词云输入文字6 M6 |, f& B' q! O6 p

    2 H$ W; B: y3 N- u

    1 v# b9 p( q4 Y  P, `0 v0 Xwc.generate(string)
    " S8 _% a% P! _2 ~: E1) y' R/ g# Y) C* e/ z" F3 S
    词云图保存图片地址( v( `8 D! s6 G3 f: h! f5 G
    - D! D, h$ |5 U4 V( T- i

    2 l. `0 c/ K3 ^4 U, D# I1 R$ Jwc.to_file('output1.png')
    ' o! g- w8 p/ p$ k/ B1 Q1
      B! _& B- O0 S( y& v词云图的过程中有点慢,大家不要心急, w4 E) Q+ l* N4 A  z

    7 r- Y: ~1 h0 J. _% z

    1 O. R. A- [' D: t这是最后的结果
    ) n3 Q6 t5 E' B# d1 u
    # M* a3 {) [- V2 ~

    9 a/ e3 T$ H* _# {2 W- v没有加停用词,所以一些无用的词比较多
    , \  `3 M0 N7 y
    " y9 L9 t5 t4 j& Z- R% h2 k
    * G( P- k9 ?6 d. ^: F
    stopwords={'了', '啊'}- Q1 ?1 k( q/ J7 d' ]# {2 R6 a
    1
    ! ~* p$ n& h5 t5 X8 q  H9 q) l1 a把这个部分的代码加入要屏蔽的词就OK了!比如我现在把 了 跟 啊 这两个字屏蔽了。
    4 E$ o- F: U5 e0 l3 T4 U我们再来看下* f- {0 F5 u. F+ t  Z: b2 q# k

    2 A& L. ]: ~7 t/ s

    ' D: j: N5 X% R" Z不知名网友:666666 牛批 老哥我要学!!!
    + \1 U5 \% l7 t: R' q( X& e8 [1 [% R( G; f3 a0 M

    $ r5 V1 D: X$ T* l' T* J6 k1 B2 i. @8 ?
    9 h6 Q/ c1 E: d0 q( k
    ————————————————
    9 W: _6 B$ t' I( F  |3 k/ Y) e版权声明:本文为CSDN博主「编程界的泥石流」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。: z# q4 M7 _7 Y! z4 e, W1 x
    原文链接:https://blog.csdn.net/ooowwq/article/details/119211907! z# V* Z' A/ e# }% E# e

    6 F' z! S& {& b8 p8 l) w$ Z% n4 }; t
    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 15:14 , Processed in 0.431896 second(s), 51 queries .

    回顶部