QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 2971|回复: 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
    ( a% X. ]6 ^' e7 h
    用Python把B站视频弹幕爬下来,绘制词云图看看大家最关心什么!+ N& h5 p( h, s  [6 [
    今天带大家做点好玩的,把B站热门视频弹幕爬下来制作词云图!
    , X9 @3 E6 H; q/ A康康大家都怎么说!5 X$ }" c$ M, D  v5 O9 v% }! n
    7 @: _2 i8 J1 o' u1 j
    4 A1 M9 o- n/ w

    ' w+ j, U6 Z8 b% D3 q2 Z

    9 M! G! g/ a6 p$ c% a! b7 @" o开始之前先给大家啰嗦几句,可能有些兄弟不会安装模块,我大概讲一下。
    3 J2 s& G0 B5 E2 _: w, k0 u( `8 `/ \' u* F) s& _+ n" u8 M/ F
    1 S0 H* g+ A3 R+ I# K' c
    如何安装模块:
    ) N9 \3 o( I* i0 {- I2 m: U: v$ D* I# a
    ! B) H6 S! a" s- c& J9 r
    win(键盘左下角ctrl 和 Alt 中间那个键) + R 输入 cmd 输入安装命令: pip install 模块名 回车
    . p2 H, p* M/ F3 `0 tpycharm里面安装 terminal 输入安装命令: pip install 模块名 回车/ M$ i# c$ i* T* I
    如果模块安装失败了,可能是这些问题:+ X& ?) I2 r' e( L$ _
    2 y' z) Q3 J# e$ b; R, Q6 a
    3 B; ^" M" z- x: D$ b1 O! x( _" v9 U
    提示:pip 不是内部命令
    ) a# h, Y: L+ Y% k" Y( h9 w你python环境变量可能没有设置好
      ^5 T. K# _' s# \有安装进度条显示,但是安装到一半出现报错了
    5 W. x$ [- s- f* |1 i" |因为python安装模块都是在国外的网址进行下载安装的, 国内请求国外 网速很慢,下载速度大概只有 几KB
    " P' }' r$ ^* Jread time out 网络连接超时 你可以切换为国内的镜像源4 N; U6 R, S7 w* `2 o' g, U) C8 N; R" z
    明明在cmd里面安装好了,但是在pycharm 提示我没有这个模块" O1 X1 A$ ?& e6 q3 _
    你pycharm里面python解释器没有设置,你在pycharm设置里面重新设置一下1 c. C4 `3 Q( e" Y
    可能安装了多个python版本9 y5 b5 e' e9 ?8 ^/ b- p/ @
    安装一个版本即可
    # v8 l- i/ @3 M; IPython做爬虫到底可以做些什么呢?; ~6 |, ]! _6 S+ b0 o8 p" g
    1 d( Q: P* O" R3 o! M: ?/ f
    ; g  F# `2 u% {5 I6 t& p
    常规: 爬取网上的数据 / 我可以批量下载图片/文字/音频 视频…: d( o% F( [1 L& K& L
    12306抢票 / 京东商城电商网站抢购脚本 / 朋友圈刷票 / 一些问卷调查自动填写… / 文章刷阅读量 / 音频 视频 播放量
    1 |7 ?+ E$ i2 a1 Q% k+ ?, ^3 y可以刷课 可以刷网课 自动 还能自动批量注册账号
    % @  a2 L$ s( L6 f: C模拟点击 >>> 游戏辅助 >>> 修改游戏内存(单机) …% w1 B+ J. S* K# u
    普通B站视频可以爬 番剧是需要会员的( P* ]! K$ ~) _+ \& y
    . r6 ~) p' y% _7 r

    ; {' B2 V$ A( C1 g7 C7 ]爬虫都是通过开发者工具进行抓包分析 查询数据来源 ( 静态页面 / 动态页面 ajax异步加载)
    % k) b0 ^# `' ^8 f
    5 p7 _2 Z& |( S) Q+ ~* d
    1 p) g; P( \- y( R6 H' b
    1. 确定目标需求 (弹幕数据 那个视频弹幕)
    5 q  \6 ?* w& y  j5 L    确定了
    1 k, u+ \6 M0 d2. 找数据 (数据的来源分析)
    0 T" m: d0 R& W/ u6 {    简简单单 找到了+ G' i" [2 ~' O9 {; u
    3. 对于数据来源的url地址 发送请求 (请求方式 / 请求头)' G$ b( T( v: R9 w% I
        请求方式: get / post! x  e- C6 O: n' Q
        请求头: . i$ |* w6 h( t2 V
        https://api.bilibili.com/x/v1/dm/list.so?oid=376200196
    / s" n3 n" t/ V( N" g    (通过开发者工具去看一下数据的具体来源,是否是来自有这个网站)
    6 S0 O! g' z6 {5 r4 r5 e4. 获取数据
    " u5 Y6 W; E# g, c    文本数据 response.text 获取网页源代码
    4 u# ~( Y& X7 t5 L- a    json字典数据 response.json() 通常一般情况是 动态网页  ajax异步加载 用的比较多
    0 x  j2 @; A1 B1 @    二进制数据   response.content  保存图片 音频 视频 或者 特定格式文件 & G5 |  a0 P# z% R3 h$ q* S4 f# p% R
    5. 解析数据8 u7 ]# I  Q6 U4 d/ r
        正则表达式 .*? 解决一切  遇事不决 .*? 通配符 可以匹配任意字符
    # G4 z6 N7 h# @6 ]; @, A& o$ o5 x6. 保存数据# T6 x* p: P! Y4 C* o" n
    1
    5 N: p/ ~$ q/ o2# D  m5 S6 q$ C# O5 q
    3
    - B) t' N+ j; s0 F3 W4
    3 r* L& g/ e. R: d5( Y5 C* @6 N6 u
    6
    ) ^* Q# M. M4 ?7 X* |7
    9 p- t# f4 o, F; J, U7 D7 L8
    0 l) V8 K; I! H9 M1 p4 c96 G" j9 d/ t8 L
    10
    9 s& a% j: @5 w0 y11/ T" t* ^  Q; u* d3 h( {
    12
    - w# b7 U8 |/ ^* ^13
    $ \* m7 _+ S( d! f9 M# N, @1 _! [, z7 K14
    # @" P0 Q' C8 O& L& ?8 O15* Q3 N; T" a. [
    16
    / m( @( K) J! W: L1 v: tpython除了做爬虫数据采集,还可以做什么?
    ) I. ^6 j1 _0 n; j6 b7 y2 U兴趣学习 还是 通过python技术赚钱 (就业找工作 / 外包)8 I) g9 E5 ~3 P4 h6 |
    0 H7 {' l2 Y5 @2 u9 l* A

    ) ^; `: K! J; q2 x8 b1 H网站开发(就业/外包) >>> 我们课程是教授的全栈开发 薪资 13K-15K- |- z3 c! ]' X; E
    比如: python开发网站: Youtobe / 豆瓣 / 知乎(以前版本) / Facebook / 美团 ;
    8 v' q+ z* d3 ]- Z, l我可以做到这样么?
    # A" M5 x' q) M' k& o$ I& f0基础 初学者 从零开始学习,上线 通过 域名 服务器 数据交互,4个左右的时间 就可以独立开发这个项目 类似知乎的网站;) \8 Z/ x+ G0 h
    如果你做去外包(团队): python开发就业 大多数也是进入外包公司 一个 10-20K左右;
    . U* D* l$ g& R3 H' i9 U7 U
    ( H% a, m/ n4 t/ n6 m

      L6 v) ~0 K) y( n, U+ \) r' ~5 _爬虫开发(脚本)(就业/外包) 可见即可爬
    ' ^( ^- a3 T3 o6 N6 D虽然爬虫什么都可以爬,但是获取用户的个人隐私(信息 电话 身份 贩卖 )、国家信息、商业机密(未公开数据,或侵犯版权)、色情等违法信息用来盈利,就基本上人无了!% Z% e9 I8 s' z
    很多兄弟问我,可以帮我淘宝用户数据吗? 我都是告诉他们,这个我还想多活几年,这玩意涉及隐私,个人信息,你可以自己学了悄悄爬,爬完记得删了,用来实践问题不大,但是别用来盈利!!!2 |# j  B2 n: y' R
    之前有个兄弟爬取微博上面军事武器航母图片买给国外, 然后就进去了!所以奉劝大家,切记切记,别乱来!5 G; q7 `) `7 h& ?2 z

    / k9 z. c8 u' \
    6 C6 |' B. S9 v- R% q3 ^! l5 V
    数据分析(就业/外包)
    $ R8 \" h+ D& S  X, s( w0 g# i  G5 q) l2 W$ |# |; M+ R
      H" [/ h: _1 ^5 m4 _- s; l
    自动化(脚本)
    + v8 }6 U: a3 P8 L: C% K% `' f1 j6 L4 g* ^, {! C2 J- y

    2 R# q+ z4 K: L" E  S8 G; a. v/ _游戏开发/辅助(脚本)' X5 r3 l6 W* d7 g4 t  J
    " t3 o- g5 Z& u  t' I( l
    ) H( Z8 P/ d. K# y8 k* S& {
    人工智能(研究生以上学历 要求很高)2 p+ [3 d! c3 z

    5 r; M  c9 E# S" C
    : i, B  P6 m9 q* w2 y: f
    等等方向还有很多,我就不一 一述说了,那些方向对于一般人来说作用不大。
    5 S$ m* s+ b# |0 Z; L4 w! r# K5 ]7 j% `
    2 t! @2 A5 h$ \7 p6 V
    我们开始正题吧  q7 Z  }+ D0 X$ Z; H" U

    3 j% E* Y6 X/ h8 _3 \+ u# L+ i: B

    7 |6 @  w- l# M8 k7 Q0 ^爬虫部分:8 i% q3 y9 V8 r( j. E: t
    发送请求 第三方模块 需要pip install requests
    4 p5 n! G, m( m; x( d
    & C& ?) j/ ^2 H4 V6 W6 R( P6 i

    6 t4 }+ e* h2 Y: k( F1 g0 Uimport requests* e6 v" Z( K: r/ [1 C
    import re  # 内置模块( g6 p( `% r- [& F- S

    / W  L3 H" E  F( ]; i8 Q- G$ f- u. \
    % Y- ~. Y4 P% l; h0 }- I
    url = 'https://api.bilibili.com/x/v1/dm/list.so?oid=376200196'
      i. W* j4 }* K% ^1- a4 \0 R( [4 `$ Q
    24 E, |7 ?; P7 G2 ^# z
    3
    7 L. n8 `3 @3 f/ r4
    ) r9 S2 c8 B; g; t5 a4 n请求头的作用就是伪装
    5 K( V0 Q; ]+ }; Y% {8 L" w, W9 ]) p- k9 G* S/ l: Z+ o+ c% C

    8 [- |* N+ r; T9 |0 q4 Dheaders = {
    - y' ?0 v. k5 H) s0 p: ^# o3 D& c    '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 B. `& U5 q# H4 ?}
    $ N3 A( Y6 b$ r6 ]9 a8 ~14 {9 |9 G0 i' ?9 k0 u. Y  M4 @6 R
    22 h3 B( b4 Z2 b
    3/ ~- Z0 e7 \) D! w+ n9 s
    模拟浏览器对服务器发送请求, 服务器接收到请求之后,确定你没问题 然后会给你返回 response响应体数据0 K0 k  L7 d9 \' ?, `7 r# F2 {  L
    函数传参
    ( \& p* T+ W( |; t- t3 k
    & s7 o' ]& O6 |' G$ H
    , T2 a- u7 G4 V; C- v
    response = requests.get(url=url, headers=headers)7 I4 ^7 r$ j8 q' C' z: B9 t! ~9 E
    1) w0 s/ \! ~  e. q2 M; G2 Z6 @
    <> 对象 对象意味着你可以调用里面的方法或者属性
    ) \4 {1 X. i' k: B1 }+ @200 状态码 请求成功( B; N) _- `7 @7 @  R! c( T
    获取数据 文本数据% n$ ^. I! n5 w7 C: }, {
    自动识别编码
      K* Q3 S' V6 `
    2 x/ O3 b* y- ]$ f# @: Z- @

    ' ]: Y3 [4 }0 _% c- f; yresponse.encoding = response.apparent_encoding
    ; i+ c: h+ q' r' b. o$ r. i( yhtml_data = re.findall('<d p=".*?">(.*?)</d>', response.text)
    . _0 n9 G. C5 S8 {$ w! D$ p  U1
    " d0 y+ C- C3 l# g0 S1 W  W2
      i4 |  ]8 T1 X: X& l0 d5 C  dcontent_str = ‘\n’.join(html_data)" K5 r6 f- D6 J' }
      ^' {- i: v" v- z2 J- w

    # C5 g( O: Y: W. `: e% x8 E2 V要列表转成字符串 ‘’.join()
    , M9 J( C) `0 x  U. s5 G  [, gfor 遍历
    0 M4 Y8 V9 Q! w( }' |保存数据 保存字符串' {$ }/ E4 L7 w$ g4 O
    for content in html_data:
    4 y+ u/ j+ e2 d7 j    # mode 保存方式 w 写入会覆盖 a 追加写入$ u' R6 d! B6 ^
        with open('弹幕1.txt', mode='a', encoding='utf-8') as f:4 m% M" t9 j) O: X7 T/ w
            f.write(content)/ q; s! K1 M/ s4 I' B( Y3 d
            f.write('\n')2 g' u9 P5 O4 {4 ^9 I1 l" J
    : M8 p5 c% ^4 E2 |

    2 I* E% D' B9 X3 e, d1 p# print(content_str)
    . q5 F1 G% f7 {* \' a1
    , ?2 u5 A/ @) R6 k7 f; c/ }$ |3 A2
    1 \& E! ]& P/ {* _; y3
    ; v9 h7 z( o$ k* H& A, U+ r4
    ! D$ _0 a0 y6 z7 Z5! W* v) |/ U% k9 a& P
    6$ B7 g% x. j6 }& K
    7& }3 K# j' v: b% I
    爬取结果, _9 \) {) M7 l7 I

    ( W% O. h8 C6 _9 e; f
    6 N! U8 L; ^) A6 ?% f
    % h( ]6 |+ }5 z+ S
    . R5 }! t4 I# e' Z; t. L8 r
    然后我们再来实现制作词云图部分
    ) D, Z$ ]$ h* {! X
    3 m! @9 M7 _' H, P: q, b; h  Z

      T4 _3 [' O- t6 j2 `9 k- w' i6 c3 `首先要安装这两个模块  s; v/ n4 d+ M( ?3 M: M

    # S" j9 r4 K8 n# B2 e
    " X: z7 P' l' X! I* l8 Y
    import jieba
    2 l( C5 I- u; z3 iimport wordcloud
    ; Y; i( I% f+ O1
    : v+ ?! `5 F9 d3 n& {1 m2( `- @9 e; f+ d7 G3 r' ^
    一个相对路径 一个绝对路径,保存好的txt文本名字要注意看一下,不对的话,记得改一下保持一致。
    2 v' a3 k7 R# L( U7 y2 d7 q6 ?9 K% y7 R; u

    ! Z! R( q2 Y; S/ U6 n, T5 Of = open('弹幕.txt', mode='r', encoding='utf-8')
    + L# r) }4 \, q7 \8 T6 Ttext = f.read()
    6 N0 _( Q, }8 @; E/ T5 _$ D8 `txt_list = jieba.lcut(text)1 n* L# V* F' ]$ }! |1 f7 K
    # print(txt_list)2 h& l! J, p3 s, c
    1
    ; ]" \$ B% v5 M4 Z+ J' t2# Z# z8 v: ^) k8 C+ |
    3
    # e3 q/ Z& V5 ]. v: D4" @2 S5 t* q6 L5 X- Z
    列表整合成一个字符串3 e5 @( ]: j$ c. Q
    7 l6 e# S% R& i5 ?

    1 V2 K7 y# z: a1 O" M: Qstring = ' '.join(txt_list)" e$ ~; H2 B1 [  b7 A2 Q# W. ~3 F/ ?
    print(string)
    1 P! p7 q8 w3 U; y8 Aprint('---'*50)  w5 B: t" ~! A* D9 w
    print(str(txt_list))
    5 S3 b9 p+ w5 _14 O. g  M- O9 [$ [! D* A5 Y' B
    22 a+ q' b' g) \: P* {
    3
    # x: r: w" P  B5 J; |( X1 j4
    / s! s- b. x% z/ J9 ?词云图设置
    ( W5 m  l% N/ E
    6 z! s, J6 U. m
    * z! G' N/ f& I' G1 v4 J5 y
    wc = wordcloud.WordCloud(
    - G& c2 p* W5 @        width=1000,         # 图片的宽
    : o$ ?4 p. y1 s9 S0 o% x2 g1 N: j        height=700,         # 图片的高* z' K. m2 B1 q+ ~" }& G. F
            background_color='white',   # 图片背景颜色8 l" q; f3 y$ O) X; l3 |% J3 Q; X
            font_path='msyh.ttc',    # 词云字体* e+ ^, [0 U( s5 s
            # mask=py,     # 所使用的词云图片
    5 H' S# I8 Z; O- I" _        scale=15,
    9 r& b' Z" r5 a* z% i# q        # stopwords={words},         # 停用词
    7 y) a/ N0 P/ m5 o8 ?4 e        # contour_width=5,( a9 M. A; _4 O( N/ H+ N6 G
            # contour_color='red'  # 轮廓颜色  c/ i9 h, V6 f2 X+ f% j% T
    )
    0 ?1 N# e2 R/ I7 c: Q2 `9 F# Y( f1
    - v2 D! X% z$ C& `1 G2. ?* B1 e, v" @2 Q5 e  j+ f
    3
    - R" \. x' g% [7 N4 t9 z4& o5 n* T7 z  R$ l; t
    5* N# W1 h2 \" G& U: p9 M0 h
    6
    ) C5 ?0 a) r' [* b7
    2 ?( X$ T2 _8 Q. L. g8! x2 G: A+ k5 c/ Y6 `
    9  h6 G1 e3 O  e3 O& y5 h! j
    10
    , k; V$ |% b; V% |5 Q1 U116 ^) V2 n+ m6 r; t. a! n
    给词云输入文字
    1 }6 C0 ?, X* q9 b$ ^3 U
    3 ~% J6 Q2 S/ \0 p# q, u

    " Z# z1 E! a8 z0 ~& W: Xwc.generate(string)
    9 h, w: c* P( `. d' j* L1
    $ {9 Q. X' _/ _5 _( w) R  s" W词云图保存图片地址
    + v. h% D( L8 m
    7 d* g3 [6 [% g% m; x! ^

    ; h# T+ e8 Q8 c+ ]0 A5 P$ S' iwc.to_file('output1.png'). W+ _$ x! Z0 I" V; U  h
    1  X8 O0 }8 z: g
    词云图的过程中有点慢,大家不要心急
    " Q! U& z' D/ b5 i; E% W
    2 a8 m9 g7 q( ^  T5 k" U- Z; h

    4 M3 l' b# y3 [: i' {" z8 q4 G$ ?4 Z这是最后的结果9 s. m- O9 {0 q$ H2 _0 s  Y

    . U( i$ y$ O. `# o) p
    * k+ y( f5 u4 Y
    没有加停用词,所以一些无用的词比较多0 r' [& T! h/ Q
    * a6 r8 d* h( X0 i3 ?' b

    ; ]. Z) H! [- F3 W. ?stopwords={'了', '啊'}
    * w; T) K7 u( A# @0 l1
    6 a3 B2 U+ y) q$ I( I把这个部分的代码加入要屏蔽的词就OK了!比如我现在把 了 跟 啊 这两个字屏蔽了。# }$ X1 Y; o; t: R$ X
    我们再来看下
    2 f- ]" Q. C, i- x3 [. G; H6 V
    : m$ b. c% S" x: Y) ]
    ; |& o  S! X& |1 k1 _
    不知名网友:666666 牛批 老哥我要学!!!
    % U  t  v: U; c" i. c  e2 F5 B
    ( V8 V- s% b+ W% h" A1 r
    ( C( ^# z/ H& j" b

    # g3 k5 n  Z: z& {

    + L; l) e5 U) B( N; U' q————————————————
    * v1 y2 ?/ Y+ R9 K4 q+ S( s版权声明:本文为CSDN博主「编程界的泥石流」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。$ K+ j' u2 Z; \7 J) W
    原文链接:https://blog.csdn.net/ooowwq/article/details/119211907
    0 j& P4 j! K: N7 R" L- n: P
    3 P8 V$ W& L  d! C; D" m3 r
    % n" }9 n! G9 ?. @" Q3 e" s
    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-12-8 06:24 , Processed in 2.731405 second(s), 50 queries .

    回顶部