QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 2772|回复: 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 p$ n3 u, \9 b* d
    用Python把B站视频弹幕爬下来,绘制词云图看看大家最关心什么!
    9 [: L# d' Q; n0 F今天带大家做点好玩的,把B站热门视频弹幕爬下来制作词云图!
    - T6 m- ?. I9 B, C- f( H. N; F康康大家都怎么说!1 D! l, S; r4 d7 ^2 {. J
    : T3 ?. A& W) Z) k

    5 q- I! J& c* J# r4 T9 C$ S
    8 P' u) q2 G3 ~

    1 G9 X# I5 }" ^% j0 J! {! a) v开始之前先给大家啰嗦几句,可能有些兄弟不会安装模块,我大概讲一下。0 [) Q) V4 e4 |' O/ n! j

    $ ^* e. K* `; e) w

    " _' M. c' T( U' L如何安装模块:
    2 J& }- Z; I# j6 J; K! {0 K. C4 k% I0 a( F: w; o
    : O) Q) i& k8 J5 K7 h
    win(键盘左下角ctrl 和 Alt 中间那个键) + R 输入 cmd 输入安装命令: pip install 模块名 回车, F) e4 A9 K+ O4 ?! S  Y
    pycharm里面安装 terminal 输入安装命令: pip install 模块名 回车6 e" I1 |6 F) \; d; i  r* c
    如果模块安装失败了,可能是这些问题:9 N! y6 f! s' u0 P) W1 \

    0 A# F+ w9 p1 P
    ! ^' L9 E0 {9 m$ {& h- V  y
    提示:pip 不是内部命令$ U3 @( M, L3 N
    你python环境变量可能没有设置好
    $ h4 j9 y6 n# H# X  ^有安装进度条显示,但是安装到一半出现报错了$ K7 U) T  i. p8 [$ n2 C$ v
    因为python安装模块都是在国外的网址进行下载安装的, 国内请求国外 网速很慢,下载速度大概只有 几KB
    % \, E; q" x  @" W7 q4 k" y0 e3 fread time out 网络连接超时 你可以切换为国内的镜像源/ f1 v3 a+ L! M
    明明在cmd里面安装好了,但是在pycharm 提示我没有这个模块6 K" S* n/ C/ [$ X7 K# z0 Q
    你pycharm里面python解释器没有设置,你在pycharm设置里面重新设置一下
    ( X1 e4 D, N: [. v# O' O# S可能安装了多个python版本3 Y' X7 B! P) {7 e! x
    安装一个版本即可, }9 p  M0 v3 y6 x7 V
    Python做爬虫到底可以做些什么呢?
    6 G- O( r0 ]5 _
    " J+ r& c0 N. k, p# v" W0 V
    % L3 ]4 x7 f) L
    常规: 爬取网上的数据 / 我可以批量下载图片/文字/音频 视频…2 t6 i' J, ]" l0 Y1 q2 W. ]+ y
    12306抢票 / 京东商城电商网站抢购脚本 / 朋友圈刷票 / 一些问卷调查自动填写… / 文章刷阅读量 / 音频 视频 播放量
    : t1 D( v2 Q9 ]7 x' a可以刷课 可以刷网课 自动 还能自动批量注册账号
    - B5 r$ r( T8 m1 ~" Z- `模拟点击 >>> 游戏辅助 >>> 修改游戏内存(单机) …
    # k7 P) ^& ?6 T普通B站视频可以爬 番剧是需要会员的
    9 L  [+ ]6 D# |5 |# A2 A0 y8 |" w4 A' n/ U) s

    9 s/ W# m; S: Z9 g爬虫都是通过开发者工具进行抓包分析 查询数据来源 ( 静态页面 / 动态页面 ajax异步加载)
    # ?+ E. a, q8 m: M; m( ~6 f6 U) @; F$ [- D
      h9 n7 h- D1 [  Q7 O
    1. 确定目标需求 (弹幕数据 那个视频弹幕)) F8 ?4 }/ b1 z; [9 c+ X
        确定了
    ' H4 o+ f3 S+ m! {2 i2. 找数据 (数据的来源分析)
    ; z% C4 Y" H1 k    简简单单 找到了/ U0 G9 e6 B2 T3 R/ o
    3. 对于数据来源的url地址 发送请求 (请求方式 / 请求头)* F& }/ y* ?& i9 @  O7 V( h, J$ L
        请求方式: get / post* I$ S8 J) V* B+ a/ @# Z
        请求头: ! W/ t$ f% L: i5 }( d, F% g' S! |# v
        https://api.bilibili.com/x/v1/dm/list.so?oid=3762001968 `$ T/ S& l% H* y
        (通过开发者工具去看一下数据的具体来源,是否是来自有这个网站)+ T  \/ R% z6 y* I0 e
    4. 获取数据 " I% \- {1 {- X! v3 Z
        文本数据 response.text 获取网页源代码+ o/ B1 f' x8 v5 w
        json字典数据 response.json() 通常一般情况是 动态网页  ajax异步加载 用的比较多
    ; O: `% @. A2 P( R1 {9 d6 q    二进制数据   response.content  保存图片 音频 视频 或者 特定格式文件
    2 }: B! _* Z2 n. K8 V* Y% X" e3 Q5. 解析数据
    8 n. [; Q3 w+ w" f! M. a+ D9 E2 d    正则表达式 .*? 解决一切  遇事不决 .*? 通配符 可以匹配任意字符 ' h& I+ C+ Q# A/ u, E& ?
    6. 保存数据
    / I" l$ J( C" ^- h' j1
      p/ ^( G2 G9 B4 I1 n9 y2, d0 @7 ?9 J0 `1 W: D  Q- s
    3
    # U- H0 r% S7 Z0 `6 ~9 b, t4
    ) o2 c* h! S) q/ n+ ^3 B5
    4 d9 Q& ?+ b. p' ~9 ~7 n. B9 T% R. i6
    : E8 X! e* v2 Y9 ~; V7 |7
    " _! `; ~- N) H: R* q8- i$ z* {) o5 z) f0 i" }! c
    9
    1 P& @0 p& C& v10. ~8 m1 `4 d* Y! c- k/ H
    11
    " {9 _) N3 c  H: M% h) b129 K" C7 M9 C4 y
    13
    ) S) Z4 z8 ^. x) b, @2 q% w14
    3 R; M4 X4 G3 ^  n2 o( \; M15
    + ^) x! C, k: q* r. d7 |168 V$ g; x# l- e
    python除了做爬虫数据采集,还可以做什么?1 \) p! n6 I8 A; g- W2 Z+ O- s& f5 p6 I
    兴趣学习 还是 通过python技术赚钱 (就业找工作 / 外包)+ Z* ]1 X0 O$ R/ L& P

    + ?) W5 r+ Z  @* r; N

    3 o: H  J( h# @% ]) G; t网站开发(就业/外包) >>> 我们课程是教授的全栈开发 薪资 13K-15K
    5 F1 q4 Q  S1 k  q& [5 j  L) l! }5 O比如: python开发网站: Youtobe / 豆瓣 / 知乎(以前版本) / Facebook / 美团 ;: k! m2 n1 v) ]  n! Y
    我可以做到这样么?! z$ C! l4 C' \. Z+ V4 P
    0基础 初学者 从零开始学习,上线 通过 域名 服务器 数据交互,4个左右的时间 就可以独立开发这个项目 类似知乎的网站;
    # U5 w5 [- s$ V) M如果你做去外包(团队): python开发就业 大多数也是进入外包公司 一个 10-20K左右;$ l5 p1 @7 M" `  n

    - \4 c" q2 e8 I$ ^/ t7 p  g

    - y, K) u6 S4 X* W- @# o* ]爬虫开发(脚本)(就业/外包) 可见即可爬; K3 n! i* v$ H7 T; A! f
    虽然爬虫什么都可以爬,但是获取用户的个人隐私(信息 电话 身份 贩卖 )、国家信息、商业机密(未公开数据,或侵犯版权)、色情等违法信息用来盈利,就基本上人无了!- \$ G: E+ I2 _/ D, d
    很多兄弟问我,可以帮我淘宝用户数据吗? 我都是告诉他们,这个我还想多活几年,这玩意涉及隐私,个人信息,你可以自己学了悄悄爬,爬完记得删了,用来实践问题不大,但是别用来盈利!!!
      K# ]' U) K: c8 x# K% y! D+ D之前有个兄弟爬取微博上面军事武器航母图片买给国外, 然后就进去了!所以奉劝大家,切记切记,别乱来!" F5 u6 _! j# n1 h+ e5 o4 K
    " y1 a$ l4 ~! u& g7 h( h9 `, ?
    9 a3 m1 q6 ~5 J) y8 B) b
    数据分析(就业/外包)) m# h* G- I: `7 W9 Z- r4 P

    2 m# @! X) W  J* J4 \

    / z: }& g. a  C% P& z自动化(脚本)5 i6 y9 V' h" P9 Q5 Z

    6 N- ~# i- p2 `5 \/ {
    " K& i4 e' p) g$ E! M
    游戏开发/辅助(脚本)
    3 J9 B7 L; Y' _1 ?( Z8 f" P
    - x6 t4 h1 l) Z# X# j0 R

    6 K% ~3 s! Z0 p- N人工智能(研究生以上学历 要求很高)
    & C% u% D7 L# I
    ) x6 I. u; L0 h  B

    3 }: }0 S8 h# i2 G) n等等方向还有很多,我就不一 一述说了,那些方向对于一般人来说作用不大。$ L! c2 f/ `* K- y* r

    ) K' R; z+ b: z; F; ]

    ' \* x7 l* r8 v( U$ m% K我们开始正题吧
    - ~$ X2 `: U9 A" J) c, Y" j2 G" T) [8 W- e+ A- Q" P, f) p& {0 S
    7 j0 |% U" h  h  A( M- Y5 i3 c2 P2 q8 n& T! p
    爬虫部分:0 |5 @9 _/ k: n. q! @( G
    发送请求 第三方模块 需要pip install requests
    8 Z3 y7 w  ]% ~5 H& m/ {# p+ V: ^7 d* z
    & e7 u3 Q9 m1 d% z
    import requests5 C" T$ E. m. s$ @0 d( f. N
    import re  # 内置模块; V9 {: {, ]7 S2 |* [" m

    + n: x; U0 t3 |6 [
    / k* Y  z0 t+ ~% z0 W$ d
    url = 'https://api.bilibili.com/x/v1/dm/list.so?oid=376200196'
    + [; p( s& N3 c9 w7 n15 S! I+ ?3 B3 B  n+ ?
    2% K, k9 o" \' r% X' u
    39 P) c% j5 g8 Z% y2 \7 Z
    4. y" n5 w# w1 N
    请求头的作用就是伪装" u  c8 l* A3 b: ^2 Z# w

    % ]2 X$ m# T' w) s/ w, p# W
    . _8 a% y5 a9 O& k9 h5 U/ h
    headers = {! S! ]5 i8 m3 h. G- r1 W! 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'
      a1 C4 @* \( @7 U9 N. S. a}2 k: g; x0 \( V
    1+ z* @, E, a+ S  \2 T2 V
    29 I  w/ b6 K& u9 ]. Y' G7 {
    3" \+ C2 n) I1 S" a* d, _( t7 P, q9 G
    模拟浏览器对服务器发送请求, 服务器接收到请求之后,确定你没问题 然后会给你返回 response响应体数据
    ) R6 L0 g. L3 X" f# d& R1 C! }函数传参
      Q$ f. c) n8 Q' K  |& w+ _% j
    6 ]. n( K) p# m. f1 x
    3 ^$ v- B: S& v: U2 {% m) I/ F
    response = requests.get(url=url, headers=headers)
    3 m2 ^6 `( g, t0 }5 O1
    3 y8 ~5 y6 z( f5 I& ]2 s/ f<> 对象 对象意味着你可以调用里面的方法或者属性0 h2 E+ a  ^! _& f$ Q# k$ E9 O( ~7 l
    200 状态码 请求成功% g# Y2 Q, I4 G/ U9 k- w! M5 l
    获取数据 文本数据
    : Y  s, g: }9 Y/ C9 D% X自动识别编码- }* B) |& b0 R% W
    , O+ ^: U& S1 F  s" i! W, X
    5 W0 L: \3 f  h! X7 p& M, S6 \
    response.encoding = response.apparent_encoding
    ( d; i3 w- M3 q0 |6 zhtml_data = re.findall('<d p=".*?">(.*?)</d>', response.text); a$ _) S; K: D+ J& q
    1
    4 A: ]$ t6 T; ~$ k2- F9 i& Z( G+ @' ]/ s4 T) z
    content_str = ‘\n’.join(html_data)9 \( B1 d# D8 s  O

    8 G+ ^2 c% V3 R7 O" Z0 [- G7 {6 C* P
    ; ^* t  K" m5 @" }& |# O$ J
    要列表转成字符串 ‘’.join(); F3 d, H) B+ f! I3 d
    for 遍历
    5 O. `+ }, |! o, h3 e+ o* k保存数据 保存字符串
    : N. H* _2 [/ a- gfor content in html_data:
    . U( ^9 {9 A! W) n3 h9 X6 v1 j    # mode 保存方式 w 写入会覆盖 a 追加写入  ^; `/ z: w& x# |/ P! K- e
        with open('弹幕1.txt', mode='a', encoding='utf-8') as f:
    $ b" c# W/ o" O4 n; H1 @        f.write(content)9 A9 k1 ?* Q: B; X2 S' Y
            f.write('\n')
    ( K  |5 R8 @& L, ^+ S0 M
    . k" d& P$ A1 M3 Y

    - U3 U( P2 Q$ ~- R4 J) w& x% a- t# print(content_str)
    * E8 z8 U( x( g* J2 u, _: U7 ]18 K/ u% V2 f6 |4 J) K
    2. M! o8 Y' i/ H7 G) K0 {
    3
    5 Q) h- X( q. K0 o2 T4
    9 Q0 ~9 U' _: ]; X; r0 U5+ O3 \5 o$ j- c5 `5 P' L( G  M
    6
    ; X6 Y- W; S4 U3 t* r7$ P1 b  U8 ~0 l- T
    爬取结果. m& H% Z/ p/ k6 d/ k- B

    ' Y% [$ Y1 N' k4 ^; U/ Q
    - M  b& r" t; H1 u; V- l( h

    9 Q. f: W& S% F

    ! {3 L% H! O$ P; ?1 w! e" ?然后我们再来实现制作词云图部分
    7 ~6 X+ N. x# M" I/ g" F8 S; g
    9 C4 I' t; O( X/ D% B! c( _$ e

    3 H3 {; `6 Y! R首先要安装这两个模块/ E+ r7 g. _! {% l9 i
    7 T0 w2 J; T/ r8 N0 `( u  j

    , q) F& g6 @* |import jieba: d0 J& P' `- I8 B* F( w
    import wordcloud% d! y- O. P" j2 G* T
    1
      q9 Q! Y, v7 }$ a. x! j+ ^2
    ; n7 p9 X# Z3 r/ A( d) N, i5 U, t一个相对路径 一个绝对路径,保存好的txt文本名字要注意看一下,不对的话,记得改一下保持一致。
    # k+ y7 c3 `# x( w1 u, [& d7 X; ~% q" _1 d0 }( z' l1 M2 H/ W
    : C7 R2 B$ a+ m" x
    f = open('弹幕.txt', mode='r', encoding='utf-8')
    ! J$ f9 g6 f( L1 e$ l2 [4 w; Ntext = f.read()
    9 W/ E' z5 ?; A6 utxt_list = jieba.lcut(text)
    % b3 X% v2 w" `3 U0 v4 i6 N! o% A# print(txt_list)5 p4 s- w, _0 b3 V: G. D
    1: ?6 F" ^2 U. Y! d3 T! Y. q' ?
    2
      R$ b- B/ K" t3+ v4 ?# V) x8 q2 k# r0 `7 E/ w. r
    4
    / ~3 Z7 U% y0 d1 Z$ O列表整合成一个字符串4 U3 L4 N4 {. y1 D
    2 g6 D* @/ L8 Y& V  P0 E' h
    6 w( b- C' v+ }% a' N' J
    string = ' '.join(txt_list)
    " S, b- U$ X0 fprint(string)4 R& O% I. L' H/ B6 R& g: z" Y
    print('---'*50)9 O0 f1 a9 ^! g) @% ], |
    print(str(txt_list))
    6 N* O: c4 q/ a# l: t9 a9 c1; U3 O; X* ^$ b$ V. p. _3 X5 Q
    2
    ' i( _: c, y. Z1 H. L  Z3) {$ d% p" W8 R! ^9 n. L5 l
    4$ Q! @! U+ n- |4 L
    词云图设置$ x( Z3 X3 X7 s5 t
    " ~8 s  ^1 J: r  L- A- r- ~

    3 B2 g" c% ?3 X/ W8 Rwc = wordcloud.WordCloud(
    1 i' t/ ?! R5 D  w        width=1000,         # 图片的宽
    : E) b' r) I4 c5 z+ ]- Y$ P        height=700,         # 图片的高7 M6 S3 k5 e: S4 R& f7 V
            background_color='white',   # 图片背景颜色
    / g/ R7 s, b4 I9 X        font_path='msyh.ttc',    # 词云字体8 v+ k' g( Z" n! a0 m$ r
            # mask=py,     # 所使用的词云图片8 l! f" {$ Q+ [" ^
            scale=15,5 X0 o' i  Q5 d. `4 `
            # stopwords={words},         # 停用词# I" v2 C$ y2 Z# O$ b
            # contour_width=5,
    . V4 m5 i; q1 U0 G        # contour_color='red'  # 轮廓颜色0 s; S4 a/ g0 }% w* a
    )
    5 P' j) Y3 \, M  `2 {! j/ v1 N1
    + C$ g0 D2 W/ {, ~! M, y2  \% s1 {* J+ x4 X
    3
    * F4 V4 R' K) Z/ u4. L( \  F! G" r2 Z
    5& k# m$ A: }3 n$ B, K
    6  ^, A/ x/ {9 Y5 h
    7
    8 V# C" l1 N( j8
    9 v8 u) q9 y+ t8 R97 P- h. B% S% F" F
    10
    2 M8 j. t( T% [0 b* q11
    6 {+ H0 T- S, r' c' v5 a给词云输入文字7 P# H1 ~! w0 Z6 f) }& u
    ( t/ W% L+ ?; V& ?, _) u; d
    ' \, I) m: c; K! t
    wc.generate(string)1 y3 m7 J: N% G: y
    13 r( S/ w0 d! }+ k+ M+ L7 M4 X
    词云图保存图片地址( R) S9 ]/ p1 e& u0 X8 M$ e8 A
    8 F0 j& I% B; \) [) @

    " C2 g2 \) A. Q* V6 p) A3 cwc.to_file('output1.png')  t6 t; n+ Z# y; m- N( _; R& S- k* Z
    1  y  V" s) Y: j, w( j7 a' G9 h9 q
    词云图的过程中有点慢,大家不要心急
    8 e/ T' I. H$ f5 D2 K! O& i) b8 G8 g" J
    ; p8 e1 K2 @5 k8 K2 j& G
    这是最后的结果% P6 a( _8 \: n! m
    , n. Z# }0 U& b: q
    ' Z$ `$ \) F: g8 C/ X% V; H
    没有加停用词,所以一些无用的词比较多
    ; U# F* x5 o/ s' V$ J
    $ Z* G, |7 z1 J9 {& s: t0 m7 ?) e0 p  n. n

    ; {. K6 k! U' t& d: g" dstopwords={'了', '啊'}6 k5 l# A4 g/ S+ \3 ~/ n' S5 m
    1
    8 x& }- Z& @5 h7 k7 o( [& H把这个部分的代码加入要屏蔽的词就OK了!比如我现在把 了 跟 啊 这两个字屏蔽了。$ Z' f1 D. v, V. T
    我们再来看下! t: I3 e" X$ O' r9 l% w0 v  Z8 q
    * n8 ^0 R' t1 P, V4 X2 Q

    ( V$ j0 R4 D* H- n1 r4 v/ u) N9 l6 J7 |不知名网友:666666 牛批 老哥我要学!!!
    + f, u  X5 q+ \6 Z" y6 y' A: y
    8 Y+ u4 e) Z- h$ \7 f

      o; |- H# v( J: l  K9 a% b0 b; f
    8 {' H+ l9 a  ?$ U. G* H# p& K& `

    ; k% M6 i6 j/ ], x! S* }5 Z————————————————- ^" F- O+ n" l$ r
    版权声明:本文为CSDN博主「编程界的泥石流」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    9 f) M3 `' ^( L原文链接:https://blog.csdn.net/ooowwq/article/details/119211907! O# S) H1 H! j2 d
    9 w& `2 L; u2 {, x: P8 F4 \

    0 m8 q. ]. e, ^9 F  g1 X9 ?
    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-8-28 08:37 , Processed in 0.435179 second(s), 50 queries .

    回顶部