QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3123|回复: 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! Z4 C' l" G: p# W6 e
    用Python把B站视频弹幕爬下来,绘制词云图看看大家最关心什么!; O! {% Y0 z7 M
    今天带大家做点好玩的,把B站热门视频弹幕爬下来制作词云图!. K2 n( y8 d' @% D& L3 J% b3 N$ t% f
    康康大家都怎么说!9 r  J0 k1 M9 j4 {$ _2 f

    % b% x2 i" A9 ~

    - n% `$ U1 m' e( X2 c
    $ _; e# k6 K1 }
    - ~5 U9 N# @4 W$ ~
    开始之前先给大家啰嗦几句,可能有些兄弟不会安装模块,我大概讲一下。  a. K0 a+ u4 n" R' F2 ^

    7 A7 V$ _3 x# F* B; d( B
      ^& M; A$ s' R3 H# D& B0 V
    如何安装模块:  D0 m* t! A- q0 P* K  P1 L2 w7 R
    9 h$ L0 Y" s) W
    2 `* x( ^! Y" ^5 p5 x
    win(键盘左下角ctrl 和 Alt 中间那个键) + R 输入 cmd 输入安装命令: pip install 模块名 回车
    ( {4 v* t# y- ^3 Upycharm里面安装 terminal 输入安装命令: pip install 模块名 回车
    8 q8 k  o* u! P2 {5 V  M如果模块安装失败了,可能是这些问题:
    9 V: ?2 ?! Q3 f( W% ^$ E
    & {' X, a# M7 C, d7 G
    , i/ ~) J/ z# F8 i2 p6 V
    提示:pip 不是内部命令
    ; g$ o) t4 }: K9 N* s; C. c你python环境变量可能没有设置好: c$ `6 V1 ~( |, Z# N8 y
    有安装进度条显示,但是安装到一半出现报错了
    ; y* o& _1 q: V  n. K4 U: K4 r3 r因为python安装模块都是在国外的网址进行下载安装的, 国内请求国外 网速很慢,下载速度大概只有 几KB, i. O& w5 U2 f* H1 B
    read time out 网络连接超时 你可以切换为国内的镜像源# S4 A3 V. E# G& I+ t2 T
    明明在cmd里面安装好了,但是在pycharm 提示我没有这个模块7 w5 b) b/ H0 B' O
    你pycharm里面python解释器没有设置,你在pycharm设置里面重新设置一下( @2 }& J* V2 U/ Q
    可能安装了多个python版本
      g# \- _: k: X7 |$ x3 J安装一个版本即可
    & E& O$ H- W. s' T3 dPython做爬虫到底可以做些什么呢?* R' k( F8 G8 a7 ], t$ \, }# N
      q9 ^" m- e& L1 @4 V# W
    5 d1 {6 c/ m8 |: E: c
    常规: 爬取网上的数据 / 我可以批量下载图片/文字/音频 视频…
    * y8 j  q% Q% [6 J12306抢票 / 京东商城电商网站抢购脚本 / 朋友圈刷票 / 一些问卷调查自动填写… / 文章刷阅读量 / 音频 视频 播放量% y3 x0 `1 x) d, @( f( q
    可以刷课 可以刷网课 自动 还能自动批量注册账号4 s5 M! B: w. s( Q" K3 T
    模拟点击 >>> 游戏辅助 >>> 修改游戏内存(单机) …
    0 {1 r% y$ ^# \9 R2 D普通B站视频可以爬 番剧是需要会员的
    " N5 G1 h# D+ z8 d+ z' @& W- g3 b4 {) ^

    & o/ Q$ ?- o- W, ^6 b爬虫都是通过开发者工具进行抓包分析 查询数据来源 ( 静态页面 / 动态页面 ajax异步加载)
    $ E9 W7 _) k. S- y0 M$ y5 Y
    $ f8 W7 j  w& T5 [/ m
    7 P. J3 h* l( v$ B
    1. 确定目标需求 (弹幕数据 那个视频弹幕)
    0 n) E& I' }& r* B" n7 y+ g1 V    确定了
    . f' p1 ]: m; A+ |) [& J/ \9 V2. 找数据 (数据的来源分析): z2 g' `8 a1 T" H/ E
        简简单单 找到了
    / n2 O( s7 k3 `: Z6 x3. 对于数据来源的url地址 发送请求 (请求方式 / 请求头)
    ; K+ H: x* X+ Z    请求方式: get / post
    & J6 \. \2 W6 `2 ^# g* D. U6 Y    请求头:
    3 V, r% H; C  H( Q" E    https://api.bilibili.com/x/v1/dm/list.so?oid=376200196
    4 r4 O' P5 K% Q( h& J) |" {    (通过开发者工具去看一下数据的具体来源,是否是来自有这个网站)8 W: H! C" A; _. [/ X' K( }3 M4 F: k
    4. 获取数据
    # b8 d' t" ^& w5 z- M5 [    文本数据 response.text 获取网页源代码' ]. y( _. u, B" e
        json字典数据 response.json() 通常一般情况是 动态网页  ajax异步加载 用的比较多' v( o% |& W& V, o9 `
        二进制数据   response.content  保存图片 音频 视频 或者 特定格式文件
      j  j4 ?: [! `/ o/ N+ i5. 解析数据6 I8 O0 u% H7 p: m# ?: j
        正则表达式 .*? 解决一切  遇事不决 .*? 通配符 可以匹配任意字符
    & _2 y$ n6 M; F6 u9 m' |% R# o6. 保存数据- X! `' p7 V. K4 \# Q4 Q
    1
    ) O1 P' C$ K" i& p6 f2
    # I/ [8 ?, u5 E$ H8 p+ ?$ Z3( ?& @& J7 ]3 @- G2 N9 i7 D) ]
    4  @" {3 [) i. l7 W' P1 g
    59 g1 V% Y. Q5 N. M
    6% g* b2 @. R' d1 w' Q" N' }
    7
    7 l( y6 V: B" u( n8* D, w2 f7 u( x
    9
    ) d3 U5 H* J- a) w10
    % j" q; H) }) u8 h# m. Q% j11
    6 m7 j: w8 H' U12, w5 K8 v$ [; l; O; m1 h4 z
    13
    " h4 e  T+ \6 p: H* ?14
    * F+ s' k' U, C! o15
    : T7 u8 i$ H0 C! K* g5 J7 U- U16
    ( {: u% d6 w: }% N$ @9 Upython除了做爬虫数据采集,还可以做什么?
    9 ~9 G2 C4 b$ B) f兴趣学习 还是 通过python技术赚钱 (就业找工作 / 外包)- I% W; b: \# Q' Q. \* `& G6 H
      M# P4 \& i$ B6 g
    + ?3 G7 }/ M7 F/ o( p/ p
    网站开发(就业/外包) >>> 我们课程是教授的全栈开发 薪资 13K-15K/ `7 v% F4 f* c) x2 v4 s- I
    比如: python开发网站: Youtobe / 豆瓣 / 知乎(以前版本) / Facebook / 美团 ;6 T& M/ r" y: N. |1 q) x
    我可以做到这样么?" x/ V+ p1 g1 c7 K4 o3 I
    0基础 初学者 从零开始学习,上线 通过 域名 服务器 数据交互,4个左右的时间 就可以独立开发这个项目 类似知乎的网站;
    / I  O8 @+ H/ a' w) W如果你做去外包(团队): python开发就业 大多数也是进入外包公司 一个 10-20K左右;
    & c0 s, J9 f7 Q3 D: z" x6 Z8 c  L. O3 ^3 ^5 ?' O6 v
    " }6 s: v4 n3 S( D& Q  _
    爬虫开发(脚本)(就业/外包) 可见即可爬
    3 G1 l5 l, A# V5 s0 [虽然爬虫什么都可以爬,但是获取用户的个人隐私(信息 电话 身份 贩卖 )、国家信息、商业机密(未公开数据,或侵犯版权)、色情等违法信息用来盈利,就基本上人无了!
    0 R9 S# Z' W$ n* f9 y* K很多兄弟问我,可以帮我淘宝用户数据吗? 我都是告诉他们,这个我还想多活几年,这玩意涉及隐私,个人信息,你可以自己学了悄悄爬,爬完记得删了,用来实践问题不大,但是别用来盈利!!!8 w3 y  k4 Q& o( P. t
    之前有个兄弟爬取微博上面军事武器航母图片买给国外, 然后就进去了!所以奉劝大家,切记切记,别乱来!5 G9 z* g2 y/ h5 x

    5 i0 c. r2 s$ T$ i

    . v; e3 @* |* Y$ I数据分析(就业/外包)( O: S& F9 |% z4 x" p

    6 v3 I! q2 ^4 C
    % v/ u& E9 E' r% ?! E" ?
    自动化(脚本)
    6 {3 m7 q" p9 J# y( ?) {: a6 T
    , Z' G% E. j, Z, O: R. Q
    ; g( Z4 `, q! ]6 Q8 F3 e' o
    游戏开发/辅助(脚本)
    8 R6 X% I3 i4 I9 n
    7 p: h! x& @4 X9 |9 V$ [
    / n+ P$ w6 _- s0 O1 h% M$ O8 c
    人工智能(研究生以上学历 要求很高)
    3 T& I7 q# Q* ?
    ! Q  K& y+ U: u2 D  R
    / E' G; C. D) v8 q  N
    等等方向还有很多,我就不一 一述说了,那些方向对于一般人来说作用不大。( @5 d  H( V' W+ l5 F9 G
    , v/ v8 z$ S/ [( y' H7 H1 u

    4 i3 {$ z9 I) E; J* g1 \$ I我们开始正题吧
    . Q  \1 G5 B8 Q$ |3 O0 y
    3 Q$ \$ M' l6 m# E' ?$ y
    8 c1 ]$ k" n% w0 c3 l( k
    爬虫部分:
    8 [$ ^  Q! c- r" s( D$ t发送请求 第三方模块 需要pip install requests* ~, E( p" |: H" F4 c

    " Z* B4 V; x2 I' ]4 {6 l. l, j- k+ D
    " g3 W' w9 g, m: N
    import requests
    6 [% t. X- _  m7 cimport re  # 内置模块8 K) a; C, E  f  ^
    ' I! o& v. p$ @
    . D8 I' L& j! P7 q6 v+ u' o
    url = 'https://api.bilibili.com/x/v1/dm/list.so?oid=376200196', b- a. e2 H+ g; i% d
    1
    ' j( P0 E2 n/ Y% S; s! v2
      i; {# |% O& r3
    4 R4 S5 d. a& o2 i2 [4. l; f6 f2 p$ C
    请求头的作用就是伪装, P2 Q5 J2 _3 L; p& ~

    ' v+ o+ R  M6 v  b9 x2 \

    , @. J# t" a( X  `- S- g, L* G; oheaders = {' x+ A( b! C0 u: i& M6 E
        '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'" l$ o( G5 k9 H+ j5 W6 G& N
    }3 }% Q( y% n% Q
    1
    . s' g* Q7 k8 h/ q$ i2
    ) S! f4 V1 c% A1 T9 e- j; [3* h$ n  N+ J3 B
    模拟浏览器对服务器发送请求, 服务器接收到请求之后,确定你没问题 然后会给你返回 response响应体数据
    2 K5 n! F: n# y函数传参
    $ O9 E3 |. {; p5 H# ~3 s* O
    . G' Y7 I  @' i7 }1 J

    % U" E+ i1 ^. w' Xresponse = requests.get(url=url, headers=headers)
    # w9 B5 Y' k2 u  v3 W3 w: e1
    + V8 m- T3 h) h! X. ]<> 对象 对象意味着你可以调用里面的方法或者属性9 b3 D7 {! r" W" @9 d  L
    200 状态码 请求成功
    ; l3 _$ p% D! T+ _3 P- e获取数据 文本数据
    5 E* h' ?! j5 E5 l* R2 M) u自动识别编码; r+ d/ W5 P; R6 ~/ A/ Y
    ) c1 m# H: }! c6 E. |
    ( e9 @1 d: W% B" r& a) i# O
    response.encoding = response.apparent_encoding, N+ I& R+ X$ s& p/ A+ u
    html_data = re.findall('<d p=".*?">(.*?)</d>', response.text)
    2 s' K2 S  s% ^9 D; g! t1$ S  J' Q  H5 }, f
    2
    $ a/ I- q/ Y7 m6 @! i' Ycontent_str = ‘\n’.join(html_data), @; D3 \# T2 f- ], z

    " v& g: Y3 h9 k: M3 F7 D. S, @; `
    7 Y+ x. p( `- `3 n9 n3 m
    要列表转成字符串 ‘’.join()& c! b/ x/ |7 N' l' t" Z: l
    for 遍历
    : y+ p/ e2 o1 L3 y/ G# l保存数据 保存字符串' g! U0 X1 y2 q& y" j
    for content in html_data:% i# [+ D9 l4 r0 g: v0 H& j
        # mode 保存方式 w 写入会覆盖 a 追加写入
      v; p7 e" n* X" \& i    with open('弹幕1.txt', mode='a', encoding='utf-8') as f:
    4 M2 c$ q2 L" H0 G1 n% {        f.write(content)2 ^( w3 V- e( W: K# k) E
            f.write('\n')
    & b5 P8 P4 c% m! I+ z
    * v4 F) n; O1 c4 W- a1 S
    + G  f. T3 M6 Y9 b% T4 ^
    # print(content_str)1 r  T3 C2 u" t- ?' x$ S2 m8 i
    1
    3 V: E) n2 E  m& C4 s2
    1 Z4 t, d) @. [  u! E/ d3
    - v2 Q5 G! h, t; Q/ e46 w2 D6 g1 M8 X! {" {
    5$ P2 d+ \! }3 W0 ], ~. y- [( ^
    6
    ; u1 Q+ {# s- _) F0 p7 ~% N, v7( v7 E0 w# B* }; |% N6 _
    爬取结果  E7 D9 t, ~0 h* M* ?/ f* |

    + x4 l* A; C2 n/ m( e* T, X; A& |+ v
    & Q6 T! G; F! H0 i8 @9 M5 q, m
    4 y4 |8 V$ X% `/ U7 R
    4 p6 Y' V7 T1 W! U; ~: I" r- M. b) G5 J
    然后我们再来实现制作词云图部分
    1 x: J# {" l( w/ ]( g( |& C* ?. _- G3 E1 ~" W, y
    1 z  ~% [2 j/ y7 y8 D. t
    首先要安装这两个模块) a$ p$ P1 q/ @+ L- ?" m4 q
    # l# \/ m  n2 ^2 @
    + M2 C8 t5 U7 f& @% J
    import jieba
    . g7 `; e% g: gimport wordcloud
    ! ?; D1 _. H* C9 t1
    # l6 Y& U% s+ W% D& A3 x2
    6 O- z8 i! `/ Y) b( M/ V, e一个相对路径 一个绝对路径,保存好的txt文本名字要注意看一下,不对的话,记得改一下保持一致。6 D2 G, X) H6 M& m9 r

    + i  K6 G' ?+ d0 j- z; t
    0 o  o! x* ?- {- J
    f = open('弹幕.txt', mode='r', encoding='utf-8')
    - x9 g5 n& ^: S# ~1 N7 X( s, J0 I6 btext = f.read()
    ) j' L' _' J7 {$ C. t# E) G, I2 _txt_list = jieba.lcut(text)
    + j; F; K" h; O* }# print(txt_list)9 V2 r# ^; K) n' X* c
    13 M8 `8 s/ {5 ?2 Q/ c  c
    20 A. ^( F% o6 x- F. c: s* h
    37 R+ v4 @" O* a. h, F3 [* B
    4
    * s$ k6 t6 P0 x5 D$ D. u列表整合成一个字符串
    ; d7 ]5 u& E" b! _
      Y3 s7 \# n6 y; L
    % h- o+ i! w5 `) V( a# `, O- l5 ?
    string = ' '.join(txt_list)7 W- ^7 {4 [; P
    print(string)
    - r% D& X! _+ w: P9 u1 mprint('---'*50)' ~9 N! S9 V; |* g6 ]. F
    print(str(txt_list))0 G4 `, s$ J. v# M8 v: G
    1
    , ]- i: ]. k# ~. |' F3 H, W  c2
    ) _# `( v* t& c/ H$ [, c3
    ! Q5 Z- x" P' y2 g4
    / w5 J# c' ?; V& k- z词云图设置
    0 f% U: F# S3 q6 w8 R& n, R, k( B0 f; @! K7 {$ I- r0 ^
    . g. v# [" Q% |- f# c! m4 d0 e
    wc = wordcloud.WordCloud($ e; K0 P) c) w* H& O
            width=1000,         # 图片的宽
    3 v  ~% W! k% Y6 Y1 e$ ^        height=700,         # 图片的高/ R) Y( _5 Q) o  B# K5 [3 q0 h9 J
            background_color='white',   # 图片背景颜色
    ) M% r! ?, |9 ]  t' I        font_path='msyh.ttc',    # 词云字体
    1 P- H8 u" c( ~* b        # mask=py,     # 所使用的词云图片
    2 c( G8 j- @% }+ @0 [. j        scale=15,! |* T* Q/ I  U: w2 T& R
            # stopwords={words},         # 停用词9 _! w% x) I5 M4 y+ H6 e
            # contour_width=5,
    + g0 l5 @' o5 w/ l        # contour_color='red'  # 轮廓颜色
    $ d# Z2 t' z7 B7 _( c  m( O6 g)
    5 Z) H" h1 Y, y2 _1
    9 E( q! Z0 J) @, ~7 A4 ?& ], ?, y2. Q- ]# J7 R: C" \5 m  V
    3
    . p6 g, q6 y) w0 e2 y4
    & ?8 {5 X, g& j$ X5  R  K" h. {! ^% {6 h/ J
    6
    ' ]7 O" w/ b. H( w8 U7
    6 h! `) G, C# ?( G- s8
    4 `5 V8 R* [6 \+ v8 X8 J+ R; s9
    # F( y7 N) \* o: t% h10
    4 \% i0 v* [) O( I' L11
    6 N6 V2 w% O/ u0 s, ^给词云输入文字1 Z5 s! S6 ^5 b6 G

    % }8 [" b" s  h4 x* d
    ' f0 t2 {  l( R- f. A& p# m
    wc.generate(string)0 S$ K2 e4 ?2 ^2 [  d8 i
    1
      s% P2 s# X2 J2 e6 q词云图保存图片地址1 s, g% o( D( p+ h" \
    / M6 \% d; h' A( v5 i1 O/ X+ P6 ^/ j/ F

    3 S! U$ k  s  N. kwc.to_file('output1.png')1 Z& q, @5 E1 G1 G) A, B
    11 M% k, D! h5 o" {: r' a
    词云图的过程中有点慢,大家不要心急
    % s; K+ A# f8 i$ k# A
    # a4 y5 c) l, j% A! u; U
    + c' c. }$ @6 h$ y0 P. j5 q
    这是最后的结果1 b. _5 b7 K# P8 J  i

    ( W1 G' z( u/ }: w
    / T8 s2 ^1 {! V! B& j$ L9 c
    没有加停用词,所以一些无用的词比较多
    4 P+ H! ]* @, _5 v# d* H- g( ]7 q" i: a# R" B7 `0 U
    6 ~% j2 p4 `" ]" }& f
    stopwords={'了', '啊'}& N4 T, j, k. ?1 t; e. ~
    1
    , R8 G% I  w9 ]8 [  \! N' q- F$ M把这个部分的代码加入要屏蔽的词就OK了!比如我现在把 了 跟 啊 这两个字屏蔽了。  u9 `$ k: Y& O- W3 ?
    我们再来看下! M- t# b4 e9 a% }0 g% T; G
    # \( z# F& s% _$ f: U  _' S
    0 v+ A; K2 d$ g& s8 Q
    不知名网友:666666 牛批 老哥我要学!!!
    # O; B  e7 o8 Y2 m/ D/ q2 }
    - v4 s: e3 d5 c3 s3 s1 O$ }* \# P
    ' J  b9 w7 }2 I9 w. h' n/ j

    # p5 v6 ?/ A9 M) }- L0 B
    8 S0 U- H' ?0 Z2 ~2 N
    ————————————————3 K0 a( K: I, y! R6 }
    版权声明:本文为CSDN博主「编程界的泥石流」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。3 O3 ~# N" G% u9 o# y7 Q4 d% Q
    原文链接:https://blog.csdn.net/ooowwq/article/details/119211907
    $ ~8 W  Y7 g, z& }, B  Y9 z- m* \8 ?8 I9 f
    . E1 g' T0 w" G2 J, |- k7 _% f7 i" R/ Q
    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-6-14 23:21 , Processed in 0.372616 second(s), 50 queries .

    回顶部