QQ登录

只需要一步,快速开始

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

    7 S. y$ W! y; |0 l用Python把B站视频弹幕爬下来,绘制词云图看看大家最关心什么!
    ! L1 C. o+ D% Y% Q* Q& e% O" J今天带大家做点好玩的,把B站热门视频弹幕爬下来制作词云图!
    3 J) l# X0 n" r# R6 L康康大家都怎么说!0 B2 `. `; M3 l; e* x
    8 n1 Y! x7 ~+ n" W4 k

    6 e1 O( _" C, [7 B$ W
      Z5 \) h; F8 Q% \6 {) O
      I, h5 ?% Y6 u7 i4 M+ ^0 b7 N
    开始之前先给大家啰嗦几句,可能有些兄弟不会安装模块,我大概讲一下。
      Y; N- Z0 I1 J, O& y
    # |8 C4 {# b$ f
    0 y0 V* o* h; k1 t/ Z
    如何安装模块:7 v0 B, t: V6 V) r7 h# ?6 {
    # B: L; n/ r8 ]* ]
    + \) Q: v* w: l* J
    win(键盘左下角ctrl 和 Alt 中间那个键) + R 输入 cmd 输入安装命令: pip install 模块名 回车
    : Y. Z1 Z. D6 s% e$ ?pycharm里面安装 terminal 输入安装命令: pip install 模块名 回车+ I' |2 t& S# s7 x
    如果模块安装失败了,可能是这些问题:
    : d2 f2 q9 L7 N6 s/ K. d3 @9 u7 p" _! ?2 W. w
    ' l2 y9 F8 k$ y1 l/ E2 I
    提示:pip 不是内部命令$ ^0 F" P, {. _# B$ J  u
    你python环境变量可能没有设置好
    5 o$ r& {2 K' N5 g4 p% |) S8 Z有安装进度条显示,但是安装到一半出现报错了
    8 i2 `4 M# z2 `3 A' [- w因为python安装模块都是在国外的网址进行下载安装的, 国内请求国外 网速很慢,下载速度大概只有 几KB
    $ U" C2 d& h4 j; S. O) C1 L4 J/ }read time out 网络连接超时 你可以切换为国内的镜像源% t! g! W! K" e8 j! T: @, K
    明明在cmd里面安装好了,但是在pycharm 提示我没有这个模块
    9 t7 g: v* g; b' z* H你pycharm里面python解释器没有设置,你在pycharm设置里面重新设置一下" W1 [7 q% `0 D: b
    可能安装了多个python版本* @1 w& g, K) P) I4 v
    安装一个版本即可. t' X4 |* `1 H! I9 y+ [  L( v
    Python做爬虫到底可以做些什么呢?0 v% m  `) g0 [6 O9 Q! l
    . @$ H( y+ \; D* [

    ! p" W+ g  F8 s' W" x常规: 爬取网上的数据 / 我可以批量下载图片/文字/音频 视频…
    : b! R% w: O7 g4 H5 @; L12306抢票 / 京东商城电商网站抢购脚本 / 朋友圈刷票 / 一些问卷调查自动填写… / 文章刷阅读量 / 音频 视频 播放量
    0 b$ r. u+ G$ D1 w" p1 O/ A可以刷课 可以刷网课 自动 还能自动批量注册账号3 S$ V7 e3 n9 B3 a
    模拟点击 >>> 游戏辅助 >>> 修改游戏内存(单机) …
    : j+ n( D4 W. u* {5 d普通B站视频可以爬 番剧是需要会员的
    " ?8 t+ A9 u- K5 n, D4 S9 H7 ~, \. k0 v0 b

    , g& t) E* b1 Z' {3 c. |& Z* a爬虫都是通过开发者工具进行抓包分析 查询数据来源 ( 静态页面 / 动态页面 ajax异步加载)' J* k+ o& W6 G: u: ]( G

    # H, {" D; F! J. o/ z! c( K2 g

    ( Z) e, u: D* P5 a$ Z1. 确定目标需求 (弹幕数据 那个视频弹幕)6 n% z* y4 [7 ]8 k1 ]6 p
        确定了9 q% z0 \! Q/ O5 E( I
    2. 找数据 (数据的来源分析)! t7 ^; Q, ^, A5 o1 t
        简简单单 找到了" T+ X8 @, E" T  u
    3. 对于数据来源的url地址 发送请求 (请求方式 / 请求头)9 F  y4 {( O6 m; x+ N+ S
        请求方式: get / post% e) R7 P6 R, i( Q3 K
        请求头:
    * A4 H1 m% y: ]. G8 e0 K+ ]    https://api.bilibili.com/x/v1/dm/list.so?oid=376200196  L+ n0 A6 I) v. c' X
        (通过开发者工具去看一下数据的具体来源,是否是来自有这个网站)
    5 J) k  V( R4 I6 H5 |" V4. 获取数据
    & s: K/ m) S/ t' r9 e- G    文本数据 response.text 获取网页源代码; [, f( ?: h- E/ A
        json字典数据 response.json() 通常一般情况是 动态网页  ajax异步加载 用的比较多
    0 i% V8 S' W6 z( H! ?% Z    二进制数据   response.content  保存图片 音频 视频 或者 特定格式文件 ! J# G) W/ ~8 _
    5. 解析数据
    8 |! W  N; m* \8 G# r# g    正则表达式 .*? 解决一切  遇事不决 .*? 通配符 可以匹配任意字符
    7 f) l8 Q7 ~9 v0 D2 R$ N) w6. 保存数据  C/ |' K/ G- o* J
    11 o8 \( `8 I! w0 ?# `/ p
    2" ?9 V" P& S" c/ w- M2 ~  A: j. E# {
    3/ j* [2 n  ^5 X/ c
    4
    0 K8 l. m+ x( S- {' z; L5$ y: M4 B" G# W
    67 b2 ~+ k( J& b* Y9 Q
    72 b# p  [4 p, m% o' s
    8% K  j1 K: O1 Y
    9
    / H$ [2 E6 I; r, C& o1 A& @" F. i( \3 F10
    ; ?& `5 ~' b  U, w116 b  g0 s- T0 Q8 a
    12
    * C4 Q! R$ f- L. H# _) m. s% d13
      H9 H8 Q- A1 i2 v7 v5 a14
    2 b4 i9 b" b7 Q# Q$ [15
    ' H, h; p  ?; I/ y8 v; }16
    1 i8 m# f# K3 t, H  q: f- ~/ g+ ^python除了做爬虫数据采集,还可以做什么?
    7 o9 S) P/ q* U兴趣学习 还是 通过python技术赚钱 (就业找工作 / 外包)
    2 n4 Y7 h  @) m
    4 C* ]% H) ^0 P. v+ F
    2 u* N! b; H) J) B
    网站开发(就业/外包) >>> 我们课程是教授的全栈开发 薪资 13K-15K6 r; c" }- Z9 Z3 j% I4 |- s; n
    比如: python开发网站: Youtobe / 豆瓣 / 知乎(以前版本) / Facebook / 美团 ;
    - V2 ]9 W" B+ A我可以做到这样么?" Q4 E& d  A' h, P' g4 o
    0基础 初学者 从零开始学习,上线 通过 域名 服务器 数据交互,4个左右的时间 就可以独立开发这个项目 类似知乎的网站;
    * C4 S* l' [2 z如果你做去外包(团队): python开发就业 大多数也是进入外包公司 一个 10-20K左右;
      j8 z' g) o# U! ?2 U1 P- n% |9 H4 q# D* u7 S9 Z2 ?
    2 M: T& l& D; \4 ^8 Y+ T0 q. h, X! a9 V
    爬虫开发(脚本)(就业/外包) 可见即可爬
    ) b. g, W9 `$ R# _6 W8 W2 m虽然爬虫什么都可以爬,但是获取用户的个人隐私(信息 电话 身份 贩卖 )、国家信息、商业机密(未公开数据,或侵犯版权)、色情等违法信息用来盈利,就基本上人无了!
    + h& g9 l7 `# c; d+ j: Q很多兄弟问我,可以帮我淘宝用户数据吗? 我都是告诉他们,这个我还想多活几年,这玩意涉及隐私,个人信息,你可以自己学了悄悄爬,爬完记得删了,用来实践问题不大,但是别用来盈利!!!7 f8 b# U' R  n) d$ D
    之前有个兄弟爬取微博上面军事武器航母图片买给国外, 然后就进去了!所以奉劝大家,切记切记,别乱来!
    1 R$ e2 s0 S4 j( ?" d- {( m8 x, s$ F: A
    ; D  T. b9 @/ ], [* o# i% H
    数据分析(就业/外包)
    : D! K4 I7 d6 ]  c- y* k$ K: j1 t# w" q4 P

    5 r% N" F6 ?1 m2 P; s自动化(脚本)$ [& d) i; a9 q; b9 r

    ! x7 Q# `; S+ o( x

    8 g" [2 |: g; z4 A6 Y游戏开发/辅助(脚本)- m* E( \$ i8 ?& Z' V

    # ?* E% r2 n4 Q. S' M2 T4 ?/ k
    ) F! Z# Q, a0 w9 s8 ~
    人工智能(研究生以上学历 要求很高). d) {0 X- y; l2 _8 F; n2 F

    2 b3 s0 s8 r* F. w5 V
    - V3 p" J1 q# p
    等等方向还有很多,我就不一 一述说了,那些方向对于一般人来说作用不大。3 Z5 b, L  H! a- R
    , U7 e9 p: A5 D9 i2 o1 z
    * h" c0 L2 Y* W2 C
    我们开始正题吧
    . C$ D, y# ^0 c! X- r0 L, v/ _* f4 s, A4 Y+ _. h

    % f$ U% b( p' y2 z% M爬虫部分:4 n& i& U; Y/ ?* q) {( ^5 D
    发送请求 第三方模块 需要pip install requests# d6 t" q$ [" C
    ; j- {6 C& c& W3 J
    , F4 C* Q6 B0 H* o; W
    import requests2 V, k7 }) I  O% {& C$ I
    import re  # 内置模块
    : {" y2 b0 I0 G; ]
    5 b6 [% ], \' q
    2 _4 P3 t8 k- Y; \' }% s
    url = 'https://api.bilibili.com/x/v1/dm/list.so?oid=376200196'& t% X9 d1 p) k
    1. `' ?. S! V8 N8 j9 ]3 z% V( k
    25 n+ {4 J! ~! M6 E, C0 T' z
    3" I: ^/ S- L5 B
    4) b8 x5 b8 ]7 [6 p6 b2 `' I* w
    请求头的作用就是伪装5 p8 A) B$ Q6 C- {! A* c, x

      s  f: v4 g' a  b

    5 C0 p* ^* r4 V( i) Z5 Aheaders = {
    $ D; D4 q: |; L9 g2 p    '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 s8 h+ o- T0 |+ ]8 @
    }
    8 t- R( S# c+ M# z1
    7 _0 [3 u% M' |# b* M& g2
    ; Y2 _# e: y+ T$ T. `& x3- N: X% X( D$ z, K
    模拟浏览器对服务器发送请求, 服务器接收到请求之后,确定你没问题 然后会给你返回 response响应体数据/ T+ ]# g0 J5 V9 F* V
    函数传参) V" ?' ]# C" [
    3 e! Y8 D. R5 E. k% _+ v* h
    , I/ H2 P" p; R0 h
    response = requests.get(url=url, headers=headers)
    3 R, a7 h& Y1 y, Y3 `% J8 s$ i# k1
    % h. l: p$ W. `<> 对象 对象意味着你可以调用里面的方法或者属性
    : z# M/ @$ J4 @* G200 状态码 请求成功
    3 X9 N1 D" O0 y6 S' X获取数据 文本数据
    . j$ u: k6 F" D7 K$ V+ Y6 P0 b# G/ b% p自动识别编码' S0 z! m0 b) h, u5 }$ F

    8 V. r  h+ A1 _% j- i6 E" t/ @  X& g
    1 k- K' U( L! F  ^# `5 I  N
    response.encoding = response.apparent_encoding( Q  O/ g% b0 _9 g; h6 N
    html_data = re.findall('<d p=".*?">(.*?)</d>', response.text)* S5 U9 L2 w5 U0 n- W
    19 l- |! @1 _1 M% A* E2 S+ m6 u/ p" y6 l
    2
    7 z# O/ a: `6 }3 x  u$ W# j! ]+ Jcontent_str = ‘\n’.join(html_data)( Y# X; A/ |! K& K+ V4 R2 ~

    / x( ?0 a2 }7 C; g2 e
    % {: ^, i1 k& n6 H3 x. n
    要列表转成字符串 ‘’.join()! w; ~- |9 o( `1 V9 k6 m
    for 遍历, P8 z# d: \" q  \, {
    保存数据 保存字符串* x8 G% T+ W, @" L, E
    for content in html_data:
    " b- R6 M2 i+ w- q% K) v' P    # mode 保存方式 w 写入会覆盖 a 追加写入
    * I7 t( r. C( e2 w/ Y$ z    with open('弹幕1.txt', mode='a', encoding='utf-8') as f:
    $ w; r; r, o/ d( f, }. w+ v        f.write(content)
    , _0 K' w; k1 v, ]! K        f.write('\n')
    & J7 o0 |3 x. n  K: S8 E) b  k5 H1 D. ?; u& |
    - L4 U2 w, m5 t4 p4 j
    # print(content_str)1 M$ o  J- }6 C
    18 T9 J% u" ~* w
    2
    , t+ k: c6 ~. f) r& p% F4 L- l3
    * l+ Q6 ~9 b+ `# y& E1 v; g4
    : ^. p  b- r8 [. G0 }5. c5 h1 g3 P3 V, q) {! _
    6  P: o* ?! r- F: q  Z
    7  K$ Q1 a9 c8 _7 A: k0 L, Y
    爬取结果2 E1 `0 }9 r: v4 L# ?5 `
    : p8 u8 S. E4 {# `/ K: n8 |

    ( O- V" Y# y6 x" @( g$ r3 c% Z, m4 |! d; m8 U
    6 m& L: \/ n0 u) x% t
    然后我们再来实现制作词云图部分
    $ e0 r3 e5 ~, h
    ( c6 w7 K* `9 a

    4 v; y/ t9 W" [: ]. @% h首先要安装这两个模块, {+ i6 s/ Q. |( q

    8 l: z* E8 h5 v
    ' F( _6 r) U  M; P& l4 P
    import jieba
    % X# U. c  P: O, e2 mimport wordcloud
    0 I$ Q* ~" B" m* n, {1. ]! w4 S$ l0 L% \, u  Y4 ]* j8 j
    2
    , P4 ^- D# A3 e0 e' O% r& X一个相对路径 一个绝对路径,保存好的txt文本名字要注意看一下,不对的话,记得改一下保持一致。
    % e3 S' P  l, J8 Z6 d7 w  I6 k; R# u3 ?/ j

    ' D# v0 I2 Z8 Q- J+ Z, C' p0 O8 Gf = open('弹幕.txt', mode='r', encoding='utf-8')
    2 a' y1 e" s$ ~+ P  G) Ttext = f.read()
    9 ]7 @* _* v7 C) G3 w) b# Mtxt_list = jieba.lcut(text)) G/ F* E( P- a% t. X
    # print(txt_list)
    # s. C3 ~  n2 j' z1
    % W7 s8 z( A7 |7 j2
    2 t! s4 j+ K" T, _! a3' `; e( A& ~% w
    4
    8 P" x, X; v- Z5 |$ `, h/ g列表整合成一个字符串
    ; t0 q$ g1 [: A. E4 I7 c6 q. O# s0 b0 y& h- u4 `( |

    " F! O2 V1 Y+ P* ~& |1 q' X# L% Q9 Astring = ' '.join(txt_list)6 B& s# c; y$ ?7 d/ x% e
    print(string)
    1 x+ G7 \9 x, d4 kprint('---'*50)- n7 [0 s3 I6 T3 r/ k
    print(str(txt_list))
    ; g8 `; O3 |' T1
    4 s+ `7 ]* B. x: ]" U" u0 ]2' }3 G8 `: W/ F! y8 b2 k! Q4 o8 {
    3" o2 B& }9 S- v: x6 Q8 }9 l$ r
    4
    , G2 Y2 h4 C; r. o词云图设置/ G- ?  b/ G% i1 s2 j/ ~" Z
    9 K* d& a+ s; ^4 _
    & b4 m, v5 ~* @9 \9 ~) b% o
    wc = wordcloud.WordCloud(: V2 M& g  P$ x# p9 y
            width=1000,         # 图片的宽  f+ _; f6 u. M* T! r; z& Z& {
            height=700,         # 图片的高
    " b  r" z$ P8 @& i& v- l. j/ X        background_color='white',   # 图片背景颜色* q+ _* M; r# N0 ^
            font_path='msyh.ttc',    # 词云字体$ T/ ~" d+ y) }0 h3 S6 [
            # mask=py,     # 所使用的词云图片
    * P9 x$ c8 B8 m! q% ~        scale=15,! W6 ^0 {* K- w, ~+ ?3 U4 }
            # stopwords={words},         # 停用词# X+ W8 M' n5 D9 T: l
            # contour_width=5,' m0 k) F/ [: }8 T7 G
            # contour_color='red'  # 轮廓颜色9 p, }& Y  m- {  \
    )6 s$ O+ u( v! d2 n( b
    1
    . o3 U) E: I( ?  j! c2, b& g$ K! ?- c: C7 W% L, v' n
    3% t# V* V1 Z0 X7 k  u
    4( A* f7 h3 p4 a. `, u7 @. F6 M
    59 @$ f% d+ O* C/ M
    6( y9 M5 Q1 f/ o
    7
    ( I, u8 J8 E( S2 g7 l/ h% Z7 p# m8
    9 z& G( D: F9 k' O9
    4 _6 R% e: z& ?0 J- z104 a  K5 w, A1 Z* \# m
    11
    " o# \' A: h$ I6 e: A& A给词云输入文字
    2 V& L  H1 }9 f# O5 x; f. c% D0 O0 \' i' c; ]6 A& B5 E  y3 ^9 L
    , \$ y" Q, v0 z2 A
    wc.generate(string)
    ' J' m8 ?8 N5 {% P7 w1, {, ^6 M# m5 O  L" `: n+ }
    词云图保存图片地址
    3 r& S* k5 i9 Y3 S3 q1 D8 q# a) J+ m; S+ m9 b9 d% ]1 g

    : F' A2 b$ w( h7 n0 l: ?wc.to_file('output1.png')
    ( L6 i- C! x6 d) i8 Y4 X17 q3 H( F" c7 k7 ^! q1 P) |
    词云图的过程中有点慢,大家不要心急
    3 ]! J/ ]" l4 A6 }
    $ {9 m+ Q& o1 @% q- h
    6 l, @6 ^6 {1 ]5 f2 Q# l
    这是最后的结果* I  A, y2 L" P) k  r) t0 H
    # i- S0 M- g. q+ E5 r0 S

      o# S) h' w4 a8 x/ X8 m' H没有加停用词,所以一些无用的词比较多# e& f0 _: y+ Q  }' m+ x
    2 |7 h. o+ e2 c0 E. H. r

    " @6 x+ L. W! Y# u' u* T" d. ^) X3 }0 Cstopwords={'了', '啊'}. t) |& V/ w+ }; {! K6 {) ?
    1
    1 b9 F9 P6 |5 N7 O. l) J把这个部分的代码加入要屏蔽的词就OK了!比如我现在把 了 跟 啊 这两个字屏蔽了。
    ; y7 j8 ^% s8 B" R我们再来看下
    8 u% y; }: ~! i$ e% w1 S- A" j% ^& Y, L* v6 ]3 }' k

    * A0 k2 j) g9 A5 `不知名网友:666666 牛批 老哥我要学!!!
    + h  p# |& |, F& j! O! e9 r& u' |1 X8 R' z4 X' ~$ M
      I4 C4 [; j+ s7 x# Q6 g' V! }

    6 x7 a% [/ z. I, B0 K: f6 s

      S) D# W* y, _# q) y! i————————————————3 T; @  ?# z1 ?5 z4 P4 e# H
    版权声明:本文为CSDN博主「编程界的泥石流」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    $ [" V1 k; h8 E: t8 F6 }原文链接:https://blog.csdn.net/ooowwq/article/details/119211907
    , R8 ~5 W. e6 G4 K0 d+ q& L+ r* p: s4 c! A& R3 H( b

    8 r0 r5 v$ w: O/ P( J0 Z  p. q* b
    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, 2025-6-23 18:53 , Processed in 0.373971 second(s), 51 queries .

    回顶部