QQ登录

只需要一步,快速开始

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

    : Y- r7 i. P9 d# U. L1 `9 w用Python把B站视频弹幕爬下来,绘制词云图看看大家最关心什么!7 L6 _0 r, O' m. j! y
    今天带大家做点好玩的,把B站热门视频弹幕爬下来制作词云图!2 H& l# f# {) d& O/ c, D: \" g
    康康大家都怎么说!7 ?: r; |) j, e0 z/ S* u
    - z4 v1 o: n, V# V6 g6 o% b$ N5 ]6 T
    5 y2 \& y0 {4 v1 Q
    9 `. A' i5 H- n) O  G2 a; @

    / w. M* T& U' j3 W开始之前先给大家啰嗦几句,可能有些兄弟不会安装模块,我大概讲一下。9 L$ p' U8 C+ @

      t" C1 W  v. `* l7 O& y
    $ _7 s+ w7 {' G' U
    如何安装模块:8 I# H, T' k" g7 P
    % n( v! V9 g6 S( i* Q' M# ^
    7 e9 f5 i  u( x6 K. @/ p# q
    win(键盘左下角ctrl 和 Alt 中间那个键) + R 输入 cmd 输入安装命令: pip install 模块名 回车
    . g- b0 \$ o2 s2 O. npycharm里面安装 terminal 输入安装命令: pip install 模块名 回车
    2 Q% F) p; r% Z! W/ A! d4 z+ @如果模块安装失败了,可能是这些问题:
    ) J9 g. F8 J2 `0 n) A6 X8 @
    4 K, l2 Q8 J  H7 ?2 D0 |
    0 I9 f- y% n9 J
    提示:pip 不是内部命令
    1 B& c7 D) c0 L* J0 G& x. B; M你python环境变量可能没有设置好
    % o0 O9 K- G$ M% R. h有安装进度条显示,但是安装到一半出现报错了+ o- ^0 M, v$ |( }
    因为python安装模块都是在国外的网址进行下载安装的, 国内请求国外 网速很慢,下载速度大概只有 几KB7 G9 R! m. f  U0 w8 L
    read time out 网络连接超时 你可以切换为国内的镜像源/ I: h/ o9 m. j
    明明在cmd里面安装好了,但是在pycharm 提示我没有这个模块
    $ z  e, @2 a; b: G4 g- h3 E你pycharm里面python解释器没有设置,你在pycharm设置里面重新设置一下
    3 s1 Q/ Y# N% {9 O& m可能安装了多个python版本( `1 P6 b9 S* F/ B5 Y' n, g
    安装一个版本即可0 @7 E$ d1 l- k" Z2 |" N
    Python做爬虫到底可以做些什么呢?* P" M3 ~$ m0 S' z' w9 ?
    % h8 Z9 o6 I; q# O  _& o

    ; q2 x4 M# N- n$ `/ q/ a) h常规: 爬取网上的数据 / 我可以批量下载图片/文字/音频 视频…
    ! A" \& e' q3 z$ Z4 O/ P( s% n12306抢票 / 京东商城电商网站抢购脚本 / 朋友圈刷票 / 一些问卷调查自动填写… / 文章刷阅读量 / 音频 视频 播放量* a. d2 i3 H3 M: }
    可以刷课 可以刷网课 自动 还能自动批量注册账号( f/ _0 I8 [# m! a6 @( c: J) F7 q
    模拟点击 >>> 游戏辅助 >>> 修改游戏内存(单机) …
    $ T& i$ P5 m9 K; g0 g  M2 c9 L; C普通B站视频可以爬 番剧是需要会员的7 f- `3 |* M/ [2 B( e

    # n$ X( X: X; D  t) {& G( Y- O- }  N

    % J# i) v; H6 R! e8 _3 F2 i, h爬虫都是通过开发者工具进行抓包分析 查询数据来源 ( 静态页面 / 动态页面 ajax异步加载)
    & [) I% c% k) d# p' Z
    , w, m( c% B; v+ \& p4 ^9 @- k
    , Y# W1 k9 H# s, [
    1. 确定目标需求 (弹幕数据 那个视频弹幕)
    , H; `7 d# n1 D# N# d$ D5 I4 [    确定了3 R* X; X# ?, G+ J" b* u1 }8 D
    2. 找数据 (数据的来源分析)' `' z& l) ]' P" B2 c, V
        简简单单 找到了
    # {3 [5 y% Q3 x6 l3. 对于数据来源的url地址 发送请求 (请求方式 / 请求头)
    ( D5 K- f* l  L    请求方式: get / post
    ; c2 o8 f, L: I5 R1 Z  U& A    请求头:
    ( K, F3 ~0 x6 b1 f7 e! ^    https://api.bilibili.com/x/v1/dm/list.so?oid=3762001963 e( I$ H* M2 [% d% [% k
        (通过开发者工具去看一下数据的具体来源,是否是来自有这个网站)5 a2 e: O0 A$ C+ m+ d6 ^
    4. 获取数据
    8 _/ _4 R4 J; B( e# \2 j) r' r    文本数据 response.text 获取网页源代码4 u$ f7 ]- \2 ^7 S1 X; s- o' z
        json字典数据 response.json() 通常一般情况是 动态网页  ajax异步加载 用的比较多
    ! s2 K0 Y! _9 b5 C/ x- m) {- ^    二进制数据   response.content  保存图片 音频 视频 或者 特定格式文件
    / U1 v0 Y1 M. [- d& j% B5. 解析数据7 n8 a  [$ W3 O: T. m* |
        正则表达式 .*? 解决一切  遇事不决 .*? 通配符 可以匹配任意字符 - m/ b' Q$ |- Q3 F9 O& R
    6. 保存数据. [0 M% P( s6 x4 M  z
    1
    ! H  v6 a' E+ [6 X% o7 u) ?22 ?; d) p) I4 W4 s4 ]
    3
    " U4 {2 U) y% C  R3 e; b4
    ( y" Z5 n6 k9 N2 V7 k+ t7 T5
    5 V2 C7 b- w+ q" |$ o  T6! R6 o3 L' U8 l
    71 I8 _. i4 ^7 l5 Z7 c, p8 B
    85 ?5 M3 x: B5 j: Q4 q' }0 O" W
    9! J' m1 M' N4 y
    10
    9 l& [# g/ e, S& x2 ]" ~7 O. R11* T" q, r6 }& x; o# m! U
    129 h- ^, s) m1 n7 }- u
    13
    ( Y9 D% e% b/ V8 c5 q14
    6 R4 l) d) [* j9 m  d6 s5 M15
    : Z7 @& j* n  J) j161 Z0 I7 f- \" c* P
    python除了做爬虫数据采集,还可以做什么?9 \0 l6 `  }! W6 J& Q* m
    兴趣学习 还是 通过python技术赚钱 (就业找工作 / 外包)9 ?% [$ E4 q; u

    - J0 m; R/ m  [- m; b5 R5 N

    ) H1 J) C' `7 u0 d( |7 h% P! v网站开发(就业/外包) >>> 我们课程是教授的全栈开发 薪资 13K-15K
    8 y0 \7 h) v: w4 K比如: python开发网站: Youtobe / 豆瓣 / 知乎(以前版本) / Facebook / 美团 ;0 ?8 R) V+ I, j
    我可以做到这样么?
    ! @4 _* W4 y* c8 ^& h% b  K1 s: s0基础 初学者 从零开始学习,上线 通过 域名 服务器 数据交互,4个左右的时间 就可以独立开发这个项目 类似知乎的网站;4 m+ ]. D9 ^4 `
    如果你做去外包(团队): python开发就业 大多数也是进入外包公司 一个 10-20K左右;( V: d( r/ G! t- z

      x- a8 b4 w. d3 I
    : q* j% K- ^* T4 z  A
    爬虫开发(脚本)(就业/外包) 可见即可爬
    5 j: D7 Z4 @0 E  h+ P; C虽然爬虫什么都可以爬,但是获取用户的个人隐私(信息 电话 身份 贩卖 )、国家信息、商业机密(未公开数据,或侵犯版权)、色情等违法信息用来盈利,就基本上人无了!
    ' x, z+ c# {- G/ ]8 r$ J7 [很多兄弟问我,可以帮我淘宝用户数据吗? 我都是告诉他们,这个我还想多活几年,这玩意涉及隐私,个人信息,你可以自己学了悄悄爬,爬完记得删了,用来实践问题不大,但是别用来盈利!!!, ]6 U2 i0 I: \0 D+ p0 j0 Q
    之前有个兄弟爬取微博上面军事武器航母图片买给国外, 然后就进去了!所以奉劝大家,切记切记,别乱来!" O! X0 s# g) {8 E$ G+ H, W
    # B! A4 n+ L1 }! }2 v* S/ @
    5 b1 Y8 ~+ i( D" k4 b) Z
    数据分析(就业/外包)
    2 ]& S; P' Q1 d6 @& R  O5 A3 R3 x3 w

    . _3 r& x' I3 |( y& x4 F+ ?自动化(脚本)2 \4 v2 v; h. V% o3 C" |6 x6 b
    : h, U" a) L5 h. k0 d1 n
    $ }* K& r- L. |( N* L( E
    游戏开发/辅助(脚本)
    8 c. ^* P0 C0 t  V
    4 T& M, l; E: i4 h; y! [9 e  J

    0 k+ k  g& {5 X7 y( V人工智能(研究生以上学历 要求很高)
    ! k: W" d0 [; N1 c& y+ q: v
    1 }  r  L. L$ @3 z

    6 A- c; L5 v* b: m: h) k$ E. v* B/ p6 V& y等等方向还有很多,我就不一 一述说了,那些方向对于一般人来说作用不大。
      `3 W' F# ]" t1 w5 z$ V0 }  U& ]1 t5 Y3 \2 U& p" j
    ; I4 D- y# m# }. g& a5 F
    我们开始正题吧6 a  ~9 |0 E, s  ^3 [
    ' E, s& V, N* f7 u) _; m0 d9 y
    0 e6 g, s: S5 m( w. U& A
    爬虫部分:
    / u- B: R5 V! A4 c6 |1 W% T发送请求 第三方模块 需要pip install requests3 K8 E4 \* J; U7 S0 M( @8 J0 l

    5 r6 Z! k1 W3 \1 V6 V$ g0 J
    " p7 k/ w6 A* ^  H; T! P0 V, Z8 o
    import requests& o: ^2 \+ D# J
    import re  # 内置模块! B& x' z, r1 n; U
    6 Y1 L! r3 q$ }) Z2 i) I$ x+ }
    6 v# v2 k7 P+ k" J9 I
    url = 'https://api.bilibili.com/x/v1/dm/list.so?oid=376200196'- g- q3 @$ @, M9 R) u, @9 |
    13 _3 D6 O  |" X9 g4 T
    2
    4 t( c8 W$ c6 i3 e" P* a, a3
      S* d- L* g+ m& o0 N' J! f; w! _44 k4 i& X+ ]# P& y' {1 `
    请求头的作用就是伪装
    ( P9 V! [4 B/ B% Z5 t3 _) p
    $ T0 v: M$ K8 [7 h7 j' L, v3 B

    / D6 B/ n3 W# O" X. I* v; hheaders = {/ I& `, Z" U5 S( S8 V7 z) k  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'3 j7 g, W& ~7 |' K9 \! \
    }7 q( |! Q7 R* [( n5 W, Z
    1
    # n1 _0 S: E2 z2% N  z! ]( I- i+ v: B* j9 I
    37 J" D. l$ B" [: j  [0 v1 }
    模拟浏览器对服务器发送请求, 服务器接收到请求之后,确定你没问题 然后会给你返回 response响应体数据5 z7 u  y1 w; M/ }1 P6 T8 S
    函数传参
    ( j' [+ f1 z& D/ U% k+ H8 Q% [' d5 y$ w, T. n; b- g! ~  f
    / X& x- S4 L! {, ]
    response = requests.get(url=url, headers=headers)4 a- b, ?8 X$ [, s- z$ _
    1
    & T# F( D! Y# g# d0 k  v+ B6 P<> 对象 对象意味着你可以调用里面的方法或者属性3 o# ^+ e' Z" q9 m6 ]3 C5 y7 f
    200 状态码 请求成功! |+ N7 `5 i" q2 O+ g( E# q/ W
    获取数据 文本数据' q- f. Z. `' M
    自动识别编码
    5 T% K# q9 q8 [; {3 }
    # _7 Q6 S4 V0 A- k7 B

    3 S' y/ x- O3 K- C. |/ uresponse.encoding = response.apparent_encoding4 m9 L/ \* S3 `, \6 G6 C
    html_data = re.findall('<d p=".*?">(.*?)</d>', response.text)) R/ O( |2 @) r  Y: c' s1 ^& ?
    1) I' L7 [5 @; Z& P
    2
    # H8 }# A) Q0 o; D. Kcontent_str = ‘\n’.join(html_data)$ f& `% z- n3 `% \
    % D! j  _$ c$ Y: h" b

    + w- Q( ~" @) s& k5 R要列表转成字符串 ‘’.join()
    - r1 Z2 t0 E/ s  M' Rfor 遍历
    , a& }( I1 F1 O3 c4 i: W& C" T保存数据 保存字符串: T/ r, R$ m7 H, {& o! _, |3 ^: M
    for content in html_data:
    - W1 p) O- K/ B9 d4 ]: }    # mode 保存方式 w 写入会覆盖 a 追加写入
    9 I4 ?  O/ |3 R! s. ?& E    with open('弹幕1.txt', mode='a', encoding='utf-8') as f:
      L- }2 p9 O1 z8 Z/ p% P% j; a        f.write(content)
    1 R$ `5 N0 l* H! N7 e& Z        f.write('\n')6 Q; T3 i7 _+ @% H
    9 M. Z& G, [% A. f- Y3 R( r  y
    7 T& q9 m. a- J( p0 m( I7 _- B) u/ Z
    # print(content_str)
    4 f: |' N( G* S1$ ^1 X/ f' K: J5 A1 _
    2
    5 N) ]6 ~& N. @34 Y1 S9 B- O& _
    4) G7 a6 S0 O1 W0 C) X5 `# p' N) m
    52 o& ~' ^- U+ Q
    6
    # t; a5 |/ \9 l' k" o75 w  w) I6 H# d4 @. w! C
    爬取结果7 Z& D% O2 t4 \* z8 m
    : L+ U6 Z2 r# Z. y9 q# H

    ) K+ I2 v: @9 D) w8 ]- r+ h5 R- {4 h4 s8 O0 o3 M) c- p) J
    % J" J- x; i9 O0 |3 Z( b; ^9 ?
    然后我们再来实现制作词云图部分
    / L7 i# B  ~  ^- E# q% v5 v9 {* _0 S
    ' h8 @! S' A) w& C) x
    首先要安装这两个模块
    " U1 l1 C. w5 a+ _* g; x
    ; P' `8 V9 J5 j. i# L" k4 G

    4 d. ]: ]! r# P3 M6 T' Rimport jieba
    $ ~3 k- M! G2 d5 z3 o6 v; Nimport wordcloud
    . @7 \6 `+ Q7 e: m& p: x) Z1
    - b# r. Y1 o8 g+ `( y9 ?" C28 m& e" x! y! C! v, h: @8 O
    一个相对路径 一个绝对路径,保存好的txt文本名字要注意看一下,不对的话,记得改一下保持一致。" p- z# S7 O8 A. K" K& v/ i( Q
    4 z) ^' N8 M; Q3 V; q
    3 Z/ _) X) ?# D/ E' l
    f = open('弹幕.txt', mode='r', encoding='utf-8')2 e# ?( j' \% S: y* _
    text = f.read()/ W$ s2 l% g: L8 h7 o4 D0 N
    txt_list = jieba.lcut(text)
    % i: O" Q3 @! ^: x+ o0 i# print(txt_list)3 I( q( w/ a- Q9 T' H# t- S
    1
    6 m% g+ x2 F* u) \* l. ]/ a; n& F2* }- J" U; g$ t
    3* i+ Z" c% ~, D5 ?
    4
    : H% _% F! ]2 c: P" x0 t2 L3 ]列表整合成一个字符串* r( u* x7 L& K5 V# T8 N3 Q4 b
    # R) \5 G7 `) r6 x- |

    8 S8 {+ q: g( C5 o" Q1 Jstring = ' '.join(txt_list)
    + W. K4 }" o! m7 X! S5 Y0 A  nprint(string)$ U, Y/ v. I6 x$ Y2 e
    print('---'*50)& J# k+ r( R+ `3 J# ]
    print(str(txt_list))$ K$ Y" \5 [# G9 p
    1% w0 E) ~8 l7 K- u% }
    2  w$ c- z! e: v6 h7 t0 h. P/ `4 W
    3; Z/ b, o3 k! q5 w3 Y8 |
    4
    7 s) E  ^; r$ t! L: Y词云图设置. j) y8 Y* T3 L: N- G$ i
    / v9 \) e1 M1 r; o

      V1 x1 x2 D) p; m3 Xwc = wordcloud.WordCloud(7 R' U+ H1 D) Z5 [" C
            width=1000,         # 图片的宽
    1 i  P6 ]4 s# h, V        height=700,         # 图片的高
    . l4 o  b; A' I9 `: B        background_color='white',   # 图片背景颜色5 y9 }' ^% U4 G  ?
            font_path='msyh.ttc',    # 词云字体8 J6 J0 z' c6 ?/ S  ~) K0 L- U; c
            # mask=py,     # 所使用的词云图片! u4 ~6 V; r5 `* }7 a$ Z* h0 h
            scale=15,
    7 Z. F' D. ~3 o$ t1 u# g" \        # stopwords={words},         # 停用词
    % K5 E; K$ m  v1 D2 w; i( |        # contour_width=5,
    8 d8 f; G+ {2 R/ ^: _        # contour_color='red'  # 轮廓颜色
    3 C( s9 a; r0 j- u: o* t% X2 o)
    ) e* W2 ~  `5 H3 L3 g! j( u  A1
    : h# m4 A& n1 k/ ~! N  j5 ]- O2
    " H9 d3 x! f: Q& d$ Z3
      `' R# N% E' q4 v4
    6 V$ r+ N6 U' C% v  ]5
    $ C: c5 E# T( t5 I! A) q: G6; M4 ]! e4 B- I( F
    7
    : H' C  K) w* z  g8! I( N) x7 e3 s9 I/ G
    9! q! F4 t& T. ?" V: v5 y
    103 `. b- D9 S% Y1 N% m! l4 V' Z
    11
    : e- y, Z1 O3 ], p5 S给词云输入文字
    " ^1 n7 w$ B; d, z& W" c; A8 F) o5 Y4 ~
    . m+ O- V# J, j$ o6 m0 N
    wc.generate(string)' C1 ^* Y  Q" l" S  t
    1, K  M$ j9 j7 j4 Q. d
    词云图保存图片地址
    . n9 {1 @2 ^. v8 g& a/ ~  [' l4 k; a7 }2 a  p9 i
    ) R9 p0 t+ ~2 G1 ^2 ?0 ?
    wc.to_file('output1.png')$ n$ V# x! c6 x- H8 G" Y, G
    1
    % J: n7 O6 \3 w5 |8 g2 J) [词云图的过程中有点慢,大家不要心急! f, ~, E1 w) f4 X
    1 Z) ?( ]' @5 t6 h! N& T; g
    # o" r% e! D& L, U; U! B
    这是最后的结果
    2 Q4 A& }2 D6 W4 Y$ R1 |( t4 A
      W2 o2 `% R' s! `* _

    ! w  Z8 t0 Y! J" P没有加停用词,所以一些无用的词比较多$ F! Y; W; Q* |& K2 Z2 k/ t
    ! X" U  H1 M5 A" b& H  q' z' n& E, |( ]7 c

    / i+ g5 R$ [- Z, estopwords={'了', '啊'}
    * s7 A2 h* [& l& T6 h1# J: S* u! |" d. r; s
    把这个部分的代码加入要屏蔽的词就OK了!比如我现在把 了 跟 啊 这两个字屏蔽了。
    ' ]3 |' s8 |. }% U3 w% N我们再来看下# ]. H5 _; d6 |& A; O; y
    + U. W: c, V2 I  c6 d2 y) P
    . l, C; z- ~$ c( _7 D. B& n
    不知名网友:666666 牛批 老哥我要学!!!8 m: U6 w' `/ l, h8 p

    2 H3 \+ ~7 M, ~" ~# \% A

    0 E( p+ ~' j# x! o$ }
    % m8 P# u# a) l  w& A2 u* h7 V* S

    ' ^! H+ j$ i) L: v8 o, V————————————————
    5 Y8 {3 b1 |3 ~9 q0 _7 ~+ e版权声明:本文为CSDN博主「编程界的泥石流」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。( x" ?" E' {4 e
    原文链接:https://blog.csdn.net/ooowwq/article/details/1192119071 F- t) C  b; o$ v9 D, \
    0 x+ n& Q3 |) P: q- j/ o

    5 x. s9 C! t$ t; U' m1 r7 L
    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 18:22 , Processed in 0.418744 second(s), 51 queries .

    回顶部