QQ登录

只需要一步,快速开始

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

    8 }/ n, Z( Y" Q6 `& [# p1 i用Python把B站视频弹幕爬下来,绘制词云图看看大家最关心什么!
    % p! u- T2 y* [7 V" U4 k今天带大家做点好玩的,把B站热门视频弹幕爬下来制作词云图!9 i- P3 E, v7 m4 P
    康康大家都怎么说!  {( T& ?7 h. U) i! l
    ) g1 E! D8 k; ^
    + s, i* `7 W6 [0 D

    5 U9 B0 R3 S) s' g# W

    , H2 H5 G$ N+ ]+ l! _2 \' S开始之前先给大家啰嗦几句,可能有些兄弟不会安装模块,我大概讲一下。4 X& I; d) R, l& ^( Y

    - L( z0 [- _- _. \4 K! P2 L
    ; Z8 {4 h: {; _+ n1 T+ |: x# z
    如何安装模块:$ P) R. V' t. W; y2 R8 E# j2 [# {- h
    # u8 k5 J2 Z: J
    2 P: ^2 O/ m* B0 w! o. ?
    win(键盘左下角ctrl 和 Alt 中间那个键) + R 输入 cmd 输入安装命令: pip install 模块名 回车
    ; ?2 z' Z; K, h# ^pycharm里面安装 terminal 输入安装命令: pip install 模块名 回车
    ' I0 m( U' a" O如果模块安装失败了,可能是这些问题:
    & u5 q; N8 ~" F' Y7 }: \) J
    4 v/ T4 w5 b' p0 G1 Y- S+ ]
    7 E- G1 O" t  y& W0 U) S
    提示:pip 不是内部命令
    , b+ z; X# L! u% H+ w) o* L# f你python环境变量可能没有设置好- n, L$ `' L/ m# t; o
    有安装进度条显示,但是安装到一半出现报错了5 t& A" _) W  G' ^
    因为python安装模块都是在国外的网址进行下载安装的, 国内请求国外 网速很慢,下载速度大概只有 几KB
    & \2 ]( O  U0 S: U; d  K: Y/ ~- Tread time out 网络连接超时 你可以切换为国内的镜像源7 u; O3 z) I: F
    明明在cmd里面安装好了,但是在pycharm 提示我没有这个模块* ^4 `6 z" Q1 ]' `* n! D) i" m
    你pycharm里面python解释器没有设置,你在pycharm设置里面重新设置一下
    9 [9 B; M3 r6 Q" n( m. G2 L可能安装了多个python版本8 |" D' O3 P+ D5 z+ M
    安装一个版本即可8 W) q  g0 l) z% q3 T; L
    Python做爬虫到底可以做些什么呢?& h2 }5 O, r& [0 ]# k- @8 u
    $ v9 D# }. z/ r$ t4 B; v4 d% W

    ! E( v3 V7 H! J+ `$ k常规: 爬取网上的数据 / 我可以批量下载图片/文字/音频 视频…
    5 y' G# _- k! Q, W- y12306抢票 / 京东商城电商网站抢购脚本 / 朋友圈刷票 / 一些问卷调查自动填写… / 文章刷阅读量 / 音频 视频 播放量; X; A& g5 D+ s+ v6 d* [# Y9 \8 ?
    可以刷课 可以刷网课 自动 还能自动批量注册账号) N( Z5 |4 G9 M1 ^
    模拟点击 >>> 游戏辅助 >>> 修改游戏内存(单机) …
    $ g7 u4 K! _: K- h1 u普通B站视频可以爬 番剧是需要会员的) A$ }. [2 i6 E$ r2 N9 u+ \
    3 t' h+ o9 }; f

    ; E$ Y4 j: L2 Q9 h: G% d/ A爬虫都是通过开发者工具进行抓包分析 查询数据来源 ( 静态页面 / 动态页面 ajax异步加载)
    4 j. V  \+ e& m) s/ A& L; I0 U, \8 J0 K+ {
    $ n6 `  g5 s4 O$ `7 ^
    1. 确定目标需求 (弹幕数据 那个视频弹幕)# m! }  ^2 }% p# \5 g( R+ ?! P
        确定了
    * f/ H  e6 C; |5 P. W" X: H: }2. 找数据 (数据的来源分析), v! s* [! x; Q: h& v; H7 J
        简简单单 找到了% T) X) F: p7 W+ Z+ w
    3. 对于数据来源的url地址 发送请求 (请求方式 / 请求头): E) U6 ~9 Z2 S0 {
        请求方式: get / post
    2 S" |. l5 M7 J" X' x9 H; Q9 Z    请求头:
    2 `3 v9 p# z4 p; C    https://api.bilibili.com/x/v1/dm/list.so?oid=376200196. G2 b" `; x: r" |$ d) O, x6 M
        (通过开发者工具去看一下数据的具体来源,是否是来自有这个网站)- X4 o& C1 Q$ c5 r1 ]
    4. 获取数据
    9 D! M7 p& w# b2 X    文本数据 response.text 获取网页源代码+ v/ D) o5 V& u. @* y9 c9 R
        json字典数据 response.json() 通常一般情况是 动态网页  ajax异步加载 用的比较多# m4 A0 a) Y6 T, ^% u0 }
        二进制数据   response.content  保存图片 音频 视频 或者 特定格式文件 / q* V3 R, O! t& w) v
    5. 解析数据8 t# `+ Q! T1 l# J( k
        正则表达式 .*? 解决一切  遇事不决 .*? 通配符 可以匹配任意字符 : J0 ]. ^8 B3 ^& W2 k5 D
    6. 保存数据
    " V8 d; ?1 ^) F+ P: Z1
    3 ^, e( ]# u/ r* c( q( v6 Q$ ]2. ~, Y4 O9 q/ d* s
    3
    $ q- Y4 T0 m- e* Q) i49 L# _9 x- ]5 ?6 g
    5* W1 M/ R+ ]8 m) Q
    6  `& V& d. U* ~* W! J, M: I
    7
    # s2 c# x2 S2 v: K) p" p8
    & k1 d+ R. p5 x8 ~8 o0 m9
    * s! m5 a' w& d2 {/ b10$ C; L; O$ z: j
    11
    ; K  y1 G  h. c5 h8 _12% [; \3 @3 y' r- A
    13& W* x8 ], q% h+ j. q9 N: `
    14/ B1 X5 L5 }( d, P
    15! a! b% A- U3 ^4 E5 E
    16
    ' B% J0 r- u9 P" J& @python除了做爬虫数据采集,还可以做什么?; H3 j& l& a: H2 k) p
    兴趣学习 还是 通过python技术赚钱 (就业找工作 / 外包)
    8 f& h3 y" B, B, w& p5 F* f: i/ |2 t+ e. S/ m
    , y+ g0 W, @2 z2 K; T) N/ B" g
    网站开发(就业/外包) >>> 我们课程是教授的全栈开发 薪资 13K-15K% z$ B* c8 _" r
    比如: python开发网站: Youtobe / 豆瓣 / 知乎(以前版本) / Facebook / 美团 ;
    ' c- }' H( k( x我可以做到这样么?
    $ @% Q8 l) `/ S2 g( P1 f4 m0基础 初学者 从零开始学习,上线 通过 域名 服务器 数据交互,4个左右的时间 就可以独立开发这个项目 类似知乎的网站;5 a9 v" K2 C5 b: }9 |1 ~
    如果你做去外包(团队): python开发就业 大多数也是进入外包公司 一个 10-20K左右;
    3 l( V. K) Y- H% t, t4 @, _+ l3 f9 T5 I
    ( j3 P+ q' i6 B/ F
    爬虫开发(脚本)(就业/外包) 可见即可爬
    . L4 B# O, y$ `. w- c* ?5 t虽然爬虫什么都可以爬,但是获取用户的个人隐私(信息 电话 身份 贩卖 )、国家信息、商业机密(未公开数据,或侵犯版权)、色情等违法信息用来盈利,就基本上人无了!
    7 O4 P0 S! y  t; V2 R很多兄弟问我,可以帮我淘宝用户数据吗? 我都是告诉他们,这个我还想多活几年,这玩意涉及隐私,个人信息,你可以自己学了悄悄爬,爬完记得删了,用来实践问题不大,但是别用来盈利!!!
    2 x' s; a. t. w5 _/ f6 R' T/ L) M之前有个兄弟爬取微博上面军事武器航母图片买给国外, 然后就进去了!所以奉劝大家,切记切记,别乱来!
    4 f/ {2 V6 A5 `; e! D
    ) o! E" k) P) y* F# F
      {% i: C- c- p. \4 h
    数据分析(就业/外包)
    & _4 N8 w, l* d. b* s+ q( z( B- ?) \+ f" E, g

    - W# i! q# E( Y( }1 h# d/ q自动化(脚本)
    ! [6 X# h3 V. u+ K; J
    1 @" A+ b: K9 ]( M
    8 T, J& o- a2 ~. R) o! j" ?
    游戏开发/辅助(脚本)
    $ S" [: R- X" z5 j8 g! i0 H" i- A
    7 F: x4 u2 q* \$ n5 C

    0 ^" V) Q" t& `7 g9 E8 R: ^人工智能(研究生以上学历 要求很高)
    / p, ~( v* a3 m1 }9 M# _" s  Y
    7 g: j7 M0 ?) F0 N1 P
    " S# l3 E$ B. M' h% d' s6 [1 q
    等等方向还有很多,我就不一 一述说了,那些方向对于一般人来说作用不大。! l+ S. c0 r# N) B+ t8 D  |

    * G" D# e1 u- E) u  r

    ) |- _. ]3 ?! A8 K. l; o我们开始正题吧
    / s% H/ m: _- ]( o; `5 u. c  i) {! |/ P6 Y/ W

    * Y% f/ R2 f' C! O2 G2 G爬虫部分:. O1 o7 B7 ~6 T" B9 R
    发送请求 第三方模块 需要pip install requests1 Z; y. r" u" ?# n* j: Z$ w

    7 h# [5 {  v+ d. C' _  A( i
    , j2 O% X, @; C7 o
    import requests+ T# i% P, ~7 N2 Y1 d4 x% m
    import re  # 内置模块
    4 h" r; _1 ~; _$ \
    ! a( Z0 F6 x4 L! M9 b( g
    + m# }1 U! X- u/ d
    url = 'https://api.bilibili.com/x/v1/dm/list.so?oid=376200196'
    3 G& O/ S. k/ A4 e! z( h3 J1
    ! q4 B$ o" G0 I# C2' i5 k" {  ~4 n9 O# {
    3
    . F1 Z; C) P- o  W- o* Q4
    * V2 u$ I: G  V6 f请求头的作用就是伪装
    9 Z& p% G1 s" z7 m3 M1 l, [
    7 i" j7 h. |; t/ c( W7 @7 K+ ~
    - u  A) U2 h7 P
    headers = {
    0 G  U% F7 K: P. z2 N    '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'( m" l  t+ `" Q; p+ ^9 L, Q6 p
    }# O' p; y4 V% D
    1+ [8 w: ~4 v7 Y1 H# m' \
    2
    4 @# n) D" |6 H) E* Y4 i32 T+ r: h- [+ ~
    模拟浏览器对服务器发送请求, 服务器接收到请求之后,确定你没问题 然后会给你返回 response响应体数据
    . N: I" g/ j% L' n0 x函数传参" \  j& `3 O3 e

    1 a+ v( J$ W& [1 I& L

    ( v$ G- |5 ^0 J3 Q8 d! ?, c1 yresponse = requests.get(url=url, headers=headers): ?9 q8 {# k8 |7 q
    1* N0 d, R% k, N! W1 y: a7 O! H, p
    <> 对象 对象意味着你可以调用里面的方法或者属性
    - r* ]/ w" O9 W9 J200 状态码 请求成功8 B' z) q& l. ^. w
    获取数据 文本数据
    + s+ z! Q4 k- a3 a. x& D8 A自动识别编码) S/ C" ^8 c2 H( v
    - R- x& G  f2 s9 h
    & @0 l& ~* }  a' u- j
    response.encoding = response.apparent_encoding3 z' Z6 P! }* ]
    html_data = re.findall('<d p=".*?">(.*?)</d>', response.text)' G& q$ o# T- c2 m5 |) a5 d
    1/ `% s* |8 L. E! Q
    2$ h4 F+ H" ^4 A5 V9 P8 T# w0 k
    content_str = ‘\n’.join(html_data)
    ( f0 R0 F, l. ^* D( y# ]$ Y- n8 ~) t  H& [( S! i

    3 I& V/ d1 z& z! I- P+ G; B: o要列表转成字符串 ‘’.join()
    1 E, i0 S5 [9 o; Rfor 遍历( W# z: g6 T) S# x8 C( R6 }# X
    保存数据 保存字符串
    ! o: q0 n! b+ Ofor content in html_data:# G3 F9 T6 K7 V: D" p) k
        # mode 保存方式 w 写入会覆盖 a 追加写入
    7 z" U, [' _; }* x: Q. v5 t+ C! D    with open('弹幕1.txt', mode='a', encoding='utf-8') as f:
    # g: ~" m' Y$ `7 `- P7 o        f.write(content)
    ' r) ?" A+ V% |& U' w7 N) L        f.write('\n')5 E2 B  V/ [7 S* g
    % g! d: |5 V; v; F% B. X

    0 ^# ~# h  ?, ?8 J* V8 [" }# print(content_str)* D0 i0 q) J+ _& Z9 I
    1; h  c) E" n: E) W! V( w3 o9 h
    25 T& W4 ~5 t4 m; ^% T3 c
    3
    : W7 h/ ~* U! X4
    ) F/ N% w6 w  i9 k+ n* G5
    4 P, d3 z$ p, N* m: }6, y4 v' f  l+ @) \$ C
    7
    9 b4 R: o' m: K' G爬取结果& m- V$ |) x$ k* Y& R& x# l! ^  \
    ( Y! I$ O3 w+ x/ q8 T5 s

    0 O' O  `0 f# O# A  \( t0 n  W
    " R" U# R1 b, i$ W& m% Z

      r! r. d1 {7 C% O  }8 ~# l然后我们再来实现制作词云图部分3 q2 Z* ~" l. K
    + @/ T- A5 X/ C/ T

    ; h/ O7 y; o  I8 e1 X4 x首先要安装这两个模块8 h4 `8 S* y7 U4 B9 k! W, q
    9 r9 `- X7 _- t6 A4 t$ w
    % |9 c6 q4 u% Y% u% I' W
    import jieba
    " J- X$ m* P' B: f4 v/ X7 mimport wordcloud9 G* k$ q+ H; M, K, H
    18 n0 W: q) R" u- x5 O5 w# S& Y
    20 l) {3 V- A- O* L9 v
    一个相对路径 一个绝对路径,保存好的txt文本名字要注意看一下,不对的话,记得改一下保持一致。
    0 x# R( a- m3 @5 p; z8 Y  v  j
    4 z) h# l7 F6 ~# Y( A' V: L

    9 R) K, [& u: s' Z& W5 z" wf = open('弹幕.txt', mode='r', encoding='utf-8')
    6 K* m0 n! o3 ptext = f.read()2 Y) S+ i1 B5 O! i& _+ n6 E
    txt_list = jieba.lcut(text)
    # ~, x/ ], A( i# print(txt_list)
    0 F9 U, Z& f! J4 ~1. j5 V/ n7 j( I( V- n" G
    2
    ( B/ \6 u4 t9 T4 p5 u3
    7 i6 r4 T% Y' ]" o3 v4; p- C/ k- P8 G8 G+ `
    列表整合成一个字符串
    6 \, b& c% P* z  X3 ]+ G2 M: h4 g: u; D/ ]9 t2 j
    ! }& ~9 L+ q9 b
    string = ' '.join(txt_list)+ z% V" r4 w, ~0 N5 m2 v  q! V
    print(string)/ }$ B$ v$ x& c& @0 k! y! F4 H; t
    print('---'*50)
    , v; a3 U# a; j, }print(str(txt_list))" z- W( y7 s; D# ^# g2 v; S. }1 G9 a
    12 C5 w( k' s- I$ i
    25 k+ v2 s, @# q8 ~5 f
    3
    : `6 c% Z* y6 f+ ?; t! p4
    : H- x7 }8 I9 p' V' k1 e* M* h. j词云图设置
    # |% L& g6 R& O9 {6 v) U9 P! X0 F' E; S4 O- s
    5 Y% i0 y+ v, Q! ~9 {0 x" |3 ]
    wc = wordcloud.WordCloud() L4 d% _% `8 S! n: U/ v% L+ G2 H
            width=1000,         # 图片的宽
    2 i8 ]& H0 Y. v! ?        height=700,         # 图片的高
    / h8 I6 s1 ]8 g/ Y) H        background_color='white',   # 图片背景颜色
    * R7 z# k6 C* P6 \2 d7 _  s$ Y( M7 z        font_path='msyh.ttc',    # 词云字体) N# }# I8 L6 s& W: P$ N
            # mask=py,     # 所使用的词云图片
    3 q' K# u8 P$ ?- u, g  D/ U2 ]        scale=15,
    2 Y  o  \# i) Z- z5 ]4 Y        # stopwords={words},         # 停用词# j  |; @1 M1 b, A  |  B2 X
            # contour_width=5,, m4 e  q$ U: Q$ U) T% ^8 K
            # contour_color='red'  # 轮廓颜色
    9 @( X( N5 w1 C* m8 n0 M1 y$ y- \, g5 Y)# O, `# b7 h1 f) ]: w; a- ^8 ?/ q: r
    1
    & s3 _9 N& R1 r. W8 L2
    7 |; A$ V4 ]% l) G! d6 g) N6 F( n3
    2 w8 {9 s8 o2 S2 U$ C4
    - c! u7 V7 T0 m# j* m5 q$ X5
    - Z" `* f& d9 A62 |/ G3 J! s* `" @  J7 g' z5 B
    7
    8 b6 C3 D- M0 @1 {0 b, ?: a8
    ) @& f+ V; P1 v97 A7 ^: d+ G  O/ U4 ~) N. y
    10
    . _+ ?% |& i7 j11. F5 F6 S' u- X# r1 [# D* k
    给词云输入文字' i' c; @" R- s) l, W
    / C* a8 u3 S+ h7 t
    ) _% H% ?1 [) G
    wc.generate(string)' [& B" x6 c! x. h
    1
    3 B+ j; n0 Y  b: y词云图保存图片地址
    / ]) q( [* X  O" \- ]- x6 ~- A# U) M' }: v7 X2 N0 c: [
    3 T) o) V3 T8 m
    wc.to_file('output1.png')  C1 k  u+ {" F0 w
    16 R2 y$ \2 m; M& R2 M5 K
    词云图的过程中有点慢,大家不要心急
    4 _& Q6 w$ J1 Q: X4 ~& |4 f# }" ^3 K5 ~1 B' D6 u
    # G/ U2 t) ^! _1 u( v) U+ d
    这是最后的结果
    5 S7 L$ E' j) w( z0 N/ v6 W" \2 H, l) R/ @  _$ ]& ]" o
    % Y/ Y" H- c, F, n; j
    没有加停用词,所以一些无用的词比较多' G5 u* b" M1 z4 X

    " I# M& t4 h2 T$ w: L4 L

    - t$ A9 i- W: S1 h: c5 Hstopwords={'了', '啊'}4 t2 a0 l  v7 J% Z+ @' u! ?- [3 C
    1
    & H) P% D; o! Q3 s# k4 ^5 B, B# ?把这个部分的代码加入要屏蔽的词就OK了!比如我现在把 了 跟 啊 这两个字屏蔽了。
    - j- S4 G, g0 E! v1 `我们再来看下
    : J$ g8 a/ P, }9 N3 i! N! a* s6 E, |" A. O. q% V

    & a$ U( Z; k" a, _: G不知名网友:666666 牛批 老哥我要学!!!
    / J. D0 p7 v5 u) j/ y
    $ I9 g" p* V* B4 H6 I1 m+ b
    % F- q/ q' J2 c9 ^
    6 ?7 S1 E3 f" V! d' x' a

    ! p2 B5 _8 f. n6 n9 [————————————————
    1 u  c" k* o/ Q* f. v; Z& m版权声明:本文为CSDN博主「编程界的泥石流」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    % v  S/ H0 b& D( J原文链接:https://blog.csdn.net/ooowwq/article/details/119211907
    8 Z: f1 d, E) R+ v5 M* m: {) \3 m8 G

    ) s- g" x5 U! f4 |
    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-8-1 10:09 , Processed in 0.676137 second(s), 50 queries .

    回顶部