QQ登录

只需要一步,快速开始

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

    $ f9 T) R9 u6 q% u用Python把B站视频弹幕爬下来,绘制词云图看看大家最关心什么!5 h% u9 B+ v8 d" r* n+ l
    今天带大家做点好玩的,把B站热门视频弹幕爬下来制作词云图!( ?" o. U+ w% ?  e
    康康大家都怎么说!: j, w; ^% u: l" a8 }. `  g; ^
    : ^$ T0 [7 x) t* {

    ; W" c; E1 E7 f% k( f5 @! d2 X" B  F; m6 {1 Q
      ?1 {4 F7 s7 }$ i7 U$ {' A* t: a
    开始之前先给大家啰嗦几句,可能有些兄弟不会安装模块,我大概讲一下。
    4 C# g, u& n  D' N, i4 G0 V% I2 X
    % _; Z! `4 |6 z5 W# v, }/ u! o7 h2 A
    0 A/ y+ J% O" g; y) V; `2 D8 b
    如何安装模块:
    1 r) q1 y) r. M0 i' f. Q6 q
    7 o9 V* u( `* e- E( b. w

    . T& e: Z$ |. @: P9 j0 vwin(键盘左下角ctrl 和 Alt 中间那个键) + R 输入 cmd 输入安装命令: pip install 模块名 回车
    & q$ X- n9 _) L: |5 i, \$ s2 fpycharm里面安装 terminal 输入安装命令: pip install 模块名 回车
    0 R- z, s( E- S' \3 J: y7 P+ ]+ _" _  E如果模块安装失败了,可能是这些问题:
    7 f4 P* E7 d' S( R9 }5 Q& J" B3 G, b; Y) Z) Q, j8 b) o' U/ |9 ?- ?
      l" x* C8 i5 K' [" g
    提示:pip 不是内部命令" t5 _: D1 \) L' C4 \5 y
    你python环境变量可能没有设置好+ A% E8 }: w5 T8 M$ N, u  {  X
    有安装进度条显示,但是安装到一半出现报错了
    ' s7 J$ r' B  M* k; |因为python安装模块都是在国外的网址进行下载安装的, 国内请求国外 网速很慢,下载速度大概只有 几KB
    ! U( X- T9 z  h6 y8 Wread time out 网络连接超时 你可以切换为国内的镜像源) ~* k* g$ A+ x: P- o
    明明在cmd里面安装好了,但是在pycharm 提示我没有这个模块+ ?4 F' R# m4 s. _
    你pycharm里面python解释器没有设置,你在pycharm设置里面重新设置一下/ @7 F- Z* R4 J8 ~6 y
    可能安装了多个python版本
    5 F' ?! z7 ~) \2 h安装一个版本即可
    0 L6 o  }0 p0 Y. S, e" C0 [Python做爬虫到底可以做些什么呢?
    2 E+ q% ^7 a5 D% S7 A0 _4 A5 X- C( z2 C

    # G6 J! Z0 C- W! `( x! H常规: 爬取网上的数据 / 我可以批量下载图片/文字/音频 视频…1 X! Q4 ^1 K9 F! R
    12306抢票 / 京东商城电商网站抢购脚本 / 朋友圈刷票 / 一些问卷调查自动填写… / 文章刷阅读量 / 音频 视频 播放量
    7 r, c$ e; ?7 b可以刷课 可以刷网课 自动 还能自动批量注册账号
    1 E- }" I0 @" T, E9 }模拟点击 >>> 游戏辅助 >>> 修改游戏内存(单机) …
    5 U& J9 ^4 Z2 |, F' l, }2 z普通B站视频可以爬 番剧是需要会员的- C. O/ A2 c. \& m) K& H1 ^

    5 R) D0 k3 D, o( a1 [* ^
    3 C2 z9 W& N+ ~7 k+ p- ~8 `
    爬虫都是通过开发者工具进行抓包分析 查询数据来源 ( 静态页面 / 动态页面 ajax异步加载)
    $ t% Q9 D- E3 p% F0 z# s  w2 q- }: Y. u/ }4 u/ O* y
    9 _& U4 ^" R& @8 T# _
    1. 确定目标需求 (弹幕数据 那个视频弹幕)
    $ C) n3 T7 ^( N9 H8 X' A    确定了
      Z% k9 o& T* `7 E4 q" t. ^+ e2. 找数据 (数据的来源分析)- q" J( ]* m5 Q6 t
        简简单单 找到了
    & r% ~: k. Y  U3 n+ y3. 对于数据来源的url地址 发送请求 (请求方式 / 请求头): I" o5 B  i& S
        请求方式: get / post
    / Z3 ?0 k) L: K! y    请求头: . e) g. G" z0 j  T1 A
        https://api.bilibili.com/x/v1/dm/list.so?oid=376200196& Q: M. `# W4 n2 i3 N( R
        (通过开发者工具去看一下数据的具体来源,是否是来自有这个网站)6 v$ u0 V$ t3 t8 I0 N$ X5 e& u4 z
    4. 获取数据
    , C1 O# F$ g2 s+ E* Q1 Z5 D  `    文本数据 response.text 获取网页源代码
    ' r8 x, Q/ |9 k: b' n7 K+ }    json字典数据 response.json() 通常一般情况是 动态网页  ajax异步加载 用的比较多
    ' }  X8 n9 `$ b5 G: r0 ~3 u: q5 V    二进制数据   response.content  保存图片 音频 视频 或者 特定格式文件 8 @: X4 F  q; q4 U4 ]: m
    5. 解析数据
    3 C; }5 U( q+ M4 H  t) K0 |+ r    正则表达式 .*? 解决一切  遇事不决 .*? 通配符 可以匹配任意字符
    ! W% ~, c+ z7 _9 }8 O! c8 c6. 保存数据
    6 w7 N9 U0 X( Y! z2 O# y1 ^- D, t1
    ! T) F  |2 F6 e/ l( i2/ b; @( e3 k  n) h" T
    3) n" H% t* ?7 G' Q
    4* r6 U$ _5 X6 K1 x" O
    5
    2 L$ T9 f& m1 k9 ?& Y& J8 d" [2 u6
    - j6 n' x( s/ Y2 W7! ^& {) N, {4 d2 U
    8, Z" A& [6 N  A2 v* [
    9
    3 m; w7 w; a2 |) R" p10
    8 Q9 E! `) ~: t, X11
    3 u3 F+ u0 T9 |0 V* ^12
    6 O. P( I) a0 V6 V3 y137 L2 v8 T, w: m7 V  S* F" r
    14
    - U, z) X# ~# q7 d15
    8 I% k+ m% X9 G6 J4 D164 j, Z  d6 W! H% G  l& C" e
    python除了做爬虫数据采集,还可以做什么?8 N7 ]# B: X- u# u# I8 V
    兴趣学习 还是 通过python技术赚钱 (就业找工作 / 外包)
    & q# g# O. m* Z) q# e6 x9 R- Y* u4 S2 I6 |; G
    ) K+ `1 B6 X6 ~3 K: Q
    网站开发(就业/外包) >>> 我们课程是教授的全栈开发 薪资 13K-15K
    & K" l; h( f5 ~8 i, ~+ g3 q比如: python开发网站: Youtobe / 豆瓣 / 知乎(以前版本) / Facebook / 美团 ;
    ; _6 @+ R% O3 n8 R我可以做到这样么?
    7 S/ N% w  Y# n' b0基础 初学者 从零开始学习,上线 通过 域名 服务器 数据交互,4个左右的时间 就可以独立开发这个项目 类似知乎的网站;) \$ D* h  G5 t- d! P
    如果你做去外包(团队): python开发就业 大多数也是进入外包公司 一个 10-20K左右;
    * W; }. h: F5 e2 B
    - H; o) U3 L9 Q2 w

    $ g/ ?: {2 ]6 E, f' e& M爬虫开发(脚本)(就业/外包) 可见即可爬; B( K" S5 T- A* V% T$ X& ]
    虽然爬虫什么都可以爬,但是获取用户的个人隐私(信息 电话 身份 贩卖 )、国家信息、商业机密(未公开数据,或侵犯版权)、色情等违法信息用来盈利,就基本上人无了!
    / g4 {! Q) J: K" a5 X6 z很多兄弟问我,可以帮我淘宝用户数据吗? 我都是告诉他们,这个我还想多活几年,这玩意涉及隐私,个人信息,你可以自己学了悄悄爬,爬完记得删了,用来实践问题不大,但是别用来盈利!!!
    + S5 E! z' j* u6 r- Q7 Z之前有个兄弟爬取微博上面军事武器航母图片买给国外, 然后就进去了!所以奉劝大家,切记切记,别乱来!3 }5 |# j. a/ d7 G* R
    , D" A0 V& O$ l) U; o6 k& J

    . O, s5 c) O1 K" q: G. t数据分析(就业/外包)
    " d2 j# q( E, B
    ' x6 @6 i7 R  v# W* v1 `/ d

    ; @3 m2 K* Q  d自动化(脚本)
    ' T: F  j! o6 i+ n9 r( u/ J
    7 j6 |' P9 s- V8 o0 c

    0 t1 D" l3 t0 v- u6 x游戏开发/辅助(脚本)
    1 c9 C7 `: I" {- |
    : D# m' t6 l9 u: k; p) Z

    - s% s& B' H1 a8 M* S3 Z人工智能(研究生以上学历 要求很高)8 U* ?. ~) Y2 Y
    " z1 }9 v1 p  {: i7 P

    $ ]% E6 i; X4 L1 s0 ~% O等等方向还有很多,我就不一 一述说了,那些方向对于一般人来说作用不大。+ b. [  k6 d8 E! W+ |/ x

    : i6 S1 k1 r/ s0 u0 b) a( M) m
    4 K6 _" {; A7 e6 ^- P  _5 I
    我们开始正题吧
    3 r0 ?% V# W8 M& D) }
    ) B$ H) q9 w; Z0 V! I
    , |* H0 j) P, o# h$ m% q
    爬虫部分:8 L( O1 q+ f- J8 r
    发送请求 第三方模块 需要pip install requests
    " P' I: m6 v/ D4 D/ H8 k( C' Y' a$ }  w* R) y  C

    8 s4 ~- r7 r8 Fimport requests
    $ b. X# Z, ?* T; X7 k- K3 [import re  # 内置模块7 P$ e# _- y) n5 |6 P! f

    " f- P# i1 c$ ?& O: q

    1 B: y1 c( D- |: f+ B; Iurl = 'https://api.bilibili.com/x/v1/dm/list.so?oid=376200196'7 p$ k# q2 e9 C3 E
    1( j4 Z* t5 [0 s) p# R+ U6 e
    22 g/ R2 i! R6 t8 Y/ h6 }
    3
    ' c) y% L) q) C8 Z- p( m& x4
    2 t3 g$ e* G" i! N请求头的作用就是伪装
    : E' g7 b9 y9 m7 M  y7 G, D
    ; V$ ]! S9 o  e

    1 ^9 v) v, b. _% C1 X5 |: l4 }, H! v8 Xheaders = {) ], x8 ^' g/ [) t0 M4 L! X* @
        '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'4 P. G; t. `1 G+ l" z& [
    }
    " P2 c5 x% }- |4 J1
      w4 J( j. h8 v5 l: X$ {  S# Z0 v2; q: ?. R$ a; V! A
    3
    + _5 C$ W3 C) T9 H9 t1 ^模拟浏览器对服务器发送请求, 服务器接收到请求之后,确定你没问题 然后会给你返回 response响应体数据
    ( R% \1 c# @3 T, Y4 S函数传参# F) q7 Y5 Y8 ^( x( J3 u8 p

    % ?/ {$ @- w1 [( Q7 \% n# [
    5 b0 R7 Z& _2 ?! u5 c
    response = requests.get(url=url, headers=headers)4 ~0 e2 \" X! n
    1
    - f0 d. x2 U: p* M1 d<> 对象 对象意味着你可以调用里面的方法或者属性! l! e1 m% f6 P- x! l6 Y
    200 状态码 请求成功
    * I" X. T. S: |/ D3 E1 Q2 ^7 Z1 K获取数据 文本数据
    / C& g" K; l4 l自动识别编码
    ' E% L& {# h& N% N) b+ [& s, B) A
    & u! ], b! v" h
    % x9 t: H9 x% t; ~! e- h
    response.encoding = response.apparent_encoding9 P7 {0 s+ ~1 u1 h& k" i, a9 x
    html_data = re.findall('<d p=".*?">(.*?)</d>', response.text)8 a. B& d- R" r0 Q4 G# P3 |
    1
    4 q8 G: d  X' {; T28 n& N) X( R; A9 F0 S& P/ z5 H
    content_str = ‘\n’.join(html_data)% K9 G! O6 j$ l) Z8 x# t8 {/ ^

    # s2 d( s" `9 Z) e

    / Y: P& ?1 @+ r要列表转成字符串 ‘’.join()
    8 U1 T* _: H' L: q" x! [6 D4 sfor 遍历
    2 ~5 v6 R7 a2 [% C保存数据 保存字符串
    6 M0 _" X; ^% `. ]% [for content in html_data:0 `* B+ u1 p( }3 a' k- h# R8 R
        # mode 保存方式 w 写入会覆盖 a 追加写入
    # l' Z9 ~8 k, B: w% K) O    with open('弹幕1.txt', mode='a', encoding='utf-8') as f:4 N$ Q+ l  f7 b4 S1 o' ^' I7 p. K
            f.write(content)
    / }1 q9 z& |. P6 E* I' ?3 @        f.write('\n')
    " g7 d( E$ t- s% [6 M+ t9 l" _( ?
    9 U6 n- ~1 _: ^- O- v9 n
    5 Q" H+ r) B1 j) D. ^! M7 D
    # print(content_str)
    1 W+ r0 g5 D% S4 a; g7 Q13 s8 S9 V+ b, f4 {
    2
    " D2 T* p  y6 l: `/ V+ k% j- B3
    ) K1 j4 C' T8 x7 w4
    . q7 c; G  m+ {6 n- m1 [) l9 f5: h8 {3 r: x9 J
    6
    $ U; G( _8 ?' ^# L7
    0 X3 f+ F1 ]6 ^9 b爬取结果) h7 _2 S* E/ o0 X
    ) ]# {/ q, n2 ^. p: M0 V
    * M3 N. ~' w3 M9 L7 i" ]7 n
    4 G9 T1 i% |. Q2 M0 ?, n" @

    3 o, q2 Q- m2 z然后我们再来实现制作词云图部分
    4 ^# a  D4 t  L3 d( R
    9 T# s+ a& {4 ]# n

    0 t5 J% z* u" ?; I$ x首先要安装这两个模块
    , ~) Y5 l  s$ h% W) Q5 T5 D+ r" ]3 q
    - N- V- i$ i& L: K- j$ H+ r
    import jieba6 H* `( y1 q6 l. M( c( }0 s9 S8 C
    import wordcloud/ z8 m6 v8 z2 b7 O3 g
    1
    8 M* a2 E" ~+ k! A; K7 F' i2
    6 [9 e6 S" U2 C7 `# [一个相对路径 一个绝对路径,保存好的txt文本名字要注意看一下,不对的话,记得改一下保持一致。  N9 Y$ B9 @8 K0 |
    % }1 ^$ s% M4 j; w9 R
    # n* K' I* d( e1 R$ t* J
    f = open('弹幕.txt', mode='r', encoding='utf-8')9 f! T/ d# l$ ~* y$ K) {
    text = f.read()% B$ P- V$ p/ K; s  l) h  x# p
    txt_list = jieba.lcut(text)
    ' O6 P0 A4 Y: M+ w# print(txt_list)7 I! _4 x$ o: k* v
    1
    " O# G( `* P  |) c  p8 W% r- ?' N2
    + L! }; b. T1 Z9 r: Z' F; v39 x) c' u$ V) u8 ]7 ]. Y, `; v
    4
    & G$ S* V* Y: c% f' v, I列表整合成一个字符串5 J  h5 B* w) r9 J
    6 D7 H4 Z! e9 b' O' U0 [$ h

    - D  u  S! F- i  v5 F  ^. }7 [string = ' '.join(txt_list)$ S: U# R0 p" I/ y
    print(string)6 e, Z  J+ ?8 I6 X& Q1 z
    print('---'*50)
    3 V& `) }; Y' |7 W2 |6 [6 sprint(str(txt_list))
    4 U9 i+ d/ `" h% @1" ]- t7 n, T& E, y
    2" ]7 M3 Y9 M. g' ], h8 W  q
    32 B$ L; S3 [0 ~9 D& _5 [( w) u
    4% Z; C: h& ~5 p+ h; Y9 d6 o
    词云图设置
    , ]0 P0 j4 s7 k7 G" o  k$ w: O3 O! ~6 H1 V. p2 R
    & R" A& N/ k5 @" ~% ~0 G
    wc = wordcloud.WordCloud($ W! b, l9 ~% c' J
            width=1000,         # 图片的宽2 {* f! u- P+ Y+ Q# l
            height=700,         # 图片的高
    * f  L9 O# ^* D        background_color='white',   # 图片背景颜色1 o8 p* f, L) c& n) I
            font_path='msyh.ttc',    # 词云字体; j' P7 F- `% {- E( Y3 g3 F
            # mask=py,     # 所使用的词云图片
    # K4 r( E% P* s4 r% v        scale=15,$ E5 g  b1 n; Y8 J5 F/ ]- F
            # stopwords={words},         # 停用词
    9 ~- ^8 ?: e0 d3 ^. W$ z9 R* }* U        # contour_width=5,
    & k9 U& N6 O6 `6 _3 [9 D1 a        # contour_color='red'  # 轮廓颜色& N9 O" p5 X( }/ \" ^! [
    )
    : ~1 Y4 J8 G9 j" b$ o( z) ]0 A1
    ( z# y) a7 H6 v0 A$ ]1 V( f% F2 V2 W2
    " Z* b8 d, {9 M) h; ]( F3) T# I. X4 e! E+ c1 K4 N
    4) b* \! l( e4 `, Z4 C9 E
    5! d! N' B. Q* k- q7 K/ X
    6
    ( M8 p  j9 }3 T7
    ) m7 ]& G0 x. }/ H4 F$ t- W' Q8+ {4 R3 H1 A+ S3 c1 A% f( a
    92 W6 \$ L4 A0 f2 f$ u1 ^2 k  s
    10
    6 \8 q* q+ ]6 t$ E113 }* d4 u/ i3 T! f6 g
    给词云输入文字3 O/ a0 [, J7 F9 w. \" `9 S

    , ~! d6 ]6 u# L5 A8 {

    . E0 u/ @2 k: p3 d- R  e# ]wc.generate(string)# j; s& ]  {- z8 h# _- U4 X: `8 g: D
    1) V9 s/ C$ B4 S6 H3 I2 ]
    词云图保存图片地址/ B  C: e$ K/ J" U& _
    5 r# o$ ^: P$ N. L2 y

    ' X- ], M1 q7 C0 cwc.to_file('output1.png')
    ; q# _" m0 q- \6 ^: i- L1  n- g  N" F$ t
    词云图的过程中有点慢,大家不要心急
    : R6 K, Z6 j4 F) l! l
    5 h. @9 F. b: a/ A
    8 P3 f7 G6 {- |- A1 f: }1 E" u
    这是最后的结果
    ; G+ j. [# h; D0 H" }9 d+ ^! _' J: F: F4 R
      a- u, ?+ D5 P) T( P$ i- j, [
    没有加停用词,所以一些无用的词比较多
    # o3 O7 r( q( A9 v+ F6 o% N/ {6 Z, X
    4 X9 t! w, ^- A- \  S$ t( z

    # M' D0 M) a% {( t" ]7 Xstopwords={'了', '啊'}, v9 }4 _6 g' x! T
    10 F+ z' z5 T% P0 r' y
    把这个部分的代码加入要屏蔽的词就OK了!比如我现在把 了 跟 啊 这两个字屏蔽了。8 @  N; z! S% ]" p/ S
    我们再来看下$ @$ \: k( r- T  O: w0 Y+ e" E% |3 {
    7 |  f* T0 ^; s$ R4 M
      g7 \' F7 s$ Y  p7 i& U) R7 F
    不知名网友:666666 牛批 老哥我要学!!!* h: S8 ]$ X2 I3 C2 V5 ~% m9 @9 X1 g

    0 r0 n+ g! [+ W( ?
    , Z4 ?$ c9 z; q6 V3 @8 {2 ~* |6 [! R

    5 X9 f& H* ?9 `) c7 S

    ) c( h, Y/ k9 }* b% p4 J————————————————, ~( C7 K, ]4 u6 h* [
    版权声明:本文为CSDN博主「编程界的泥石流」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。8 M* h: R  v; M1 D' N  m
    原文链接:https://blog.csdn.net/ooowwq/article/details/119211907
    ; ]3 }! N8 P4 a7 P, `, ~$ \
    - X4 W( Q" a, B5 E  N1 f6 `  y; B" o1 o; v7 A
    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-24 10:07 , Processed in 0.658289 second(s), 51 queries .

    回顶部