QQ登录

只需要一步,快速开始

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

    7 z4 \( Y& x/ I) Q5 l$ Y2 f用Python把B站视频弹幕爬下来,绘制词云图看看大家最关心什么!- ~3 t0 D" I! z  k, Y; U. s
    今天带大家做点好玩的,把B站热门视频弹幕爬下来制作词云图!8 V7 r4 A, m0 V# ]* ~
    康康大家都怎么说!
    ( H1 K% S8 v0 I( o8 b0 @: ]$ R0 H5 m" [  R
    5 t' \! t3 i4 b" ^

    " e* }7 x$ `% J* n

    + ]% j& H7 }9 N: C+ s: e开始之前先给大家啰嗦几句,可能有些兄弟不会安装模块,我大概讲一下。2 R, p7 X3 P0 h( c5 V! }- ?7 b
    3 y/ A6 A# F5 V0 E

    1 @' X' e; p& t9 s4 {' a9 F如何安装模块:% z  }5 T" ^- j' I& D$ ?$ R
    2 n3 t8 V# _* G1 Z

    8 f8 i5 K, d: _4 M1 j1 @, Ewin(键盘左下角ctrl 和 Alt 中间那个键) + R 输入 cmd 输入安装命令: pip install 模块名 回车
    / g! w; F! d# `* Ipycharm里面安装 terminal 输入安装命令: pip install 模块名 回车
    " P! t- t6 A. I5 d/ l如果模块安装失败了,可能是这些问题:
    1 j8 \4 W0 i8 X, |- o. Y* u
    3 M4 r5 h  t( S3 {

    : B2 N8 U/ M5 y# v提示:pip 不是内部命令
    : E$ ~2 q7 K9 l2 A你python环境变量可能没有设置好* @% h7 [& v" C
    有安装进度条显示,但是安装到一半出现报错了, |/ {9 P: X, D7 J- n: `* f
    因为python安装模块都是在国外的网址进行下载安装的, 国内请求国外 网速很慢,下载速度大概只有 几KB
    0 j3 D% \3 P+ }9 c2 }* _6 q$ Oread time out 网络连接超时 你可以切换为国内的镜像源. H$ t5 `: C, X+ e/ ?( i" F
    明明在cmd里面安装好了,但是在pycharm 提示我没有这个模块' T- l' ]& k3 U8 ]& e
    你pycharm里面python解释器没有设置,你在pycharm设置里面重新设置一下! j9 {3 B! h" O
    可能安装了多个python版本; ^3 R2 @" n, M( Y' f+ c3 F/ P6 v
    安装一个版本即可
    ( u! H3 U+ F4 l) y7 qPython做爬虫到底可以做些什么呢?
    * N1 b% _( j& U# e6 a
    5 i! W  c" q- K& Z  V. o; T0 w

    6 M4 }7 q% h( W& |" J% o5 D8 W常规: 爬取网上的数据 / 我可以批量下载图片/文字/音频 视频…/ Z! ^! T3 k6 T& n: B
    12306抢票 / 京东商城电商网站抢购脚本 / 朋友圈刷票 / 一些问卷调查自动填写… / 文章刷阅读量 / 音频 视频 播放量
    ( _- o# l+ ^1 G, t0 x* P可以刷课 可以刷网课 自动 还能自动批量注册账号' `* B( a0 H% ]: F
    模拟点击 >>> 游戏辅助 >>> 修改游戏内存(单机) …
    ; |9 K% }5 L$ f普通B站视频可以爬 番剧是需要会员的
    - {, @0 E3 C& O( L; M$ {
    2 R% ~1 }0 D: c) L( R% U- U
    $ r2 I+ q, r! {/ G4 Z! Q9 m
    爬虫都是通过开发者工具进行抓包分析 查询数据来源 ( 静态页面 / 动态页面 ajax异步加载)" A5 \; c. x& H. |  E5 O6 L8 y
    " {$ g! _  u. n- j. ]% N1 [

    0 w% Z( t* g5 n! z1 Z1. 确定目标需求 (弹幕数据 那个视频弹幕)
    - n1 ~+ R' N" ~: P+ F    确定了9 ]7 E( Y( ?! h5 A5 t1 x1 Z6 X
    2. 找数据 (数据的来源分析)
    : m9 `0 M( _# c- x    简简单单 找到了, n- g: i% L& p3 l
    3. 对于数据来源的url地址 发送请求 (请求方式 / 请求头)
    . Q7 p: u4 T9 i* Z9 @    请求方式: get / post, V/ b; z! `, e
        请求头:
    % z/ k) b  w3 x7 y    https://api.bilibili.com/x/v1/dm/list.so?oid=376200196
    # \0 J+ n1 f$ t+ h    (通过开发者工具去看一下数据的具体来源,是否是来自有这个网站)
    1 M( b7 e' [) S4. 获取数据
    1 i! F& F) w( P' p4 E    文本数据 response.text 获取网页源代码2 m" N. I2 i$ k
        json字典数据 response.json() 通常一般情况是 动态网页  ajax异步加载 用的比较多
    8 Q6 Z1 h% a1 ?    二进制数据   response.content  保存图片 音频 视频 或者 特定格式文件
    " J% c/ J) j6 u: B* s+ o: p) C5. 解析数据
    ' \3 q0 c% w, j- l    正则表达式 .*? 解决一切  遇事不决 .*? 通配符 可以匹配任意字符 * s( E8 |7 w1 @8 V) ^
    6. 保存数据" ], h6 C# c* n4 {! O8 g
    1
    : E) y; s, p% h$ o: O! r1 n2
    * g: N7 q; T7 t' }! J& P39 `; K5 N3 V- E0 y4 V
    41 ]( Z# u' \% `+ h2 M4 H2 j2 A
    5
    $ e) S8 A+ t( l' A; Z6
    # Y  Z3 s+ A7 |7
    ! R$ e6 s" b; w4 T8
    . D% @' ?. Y2 \; }& e- @1 k8 n$ z9' U; ^. L2 n. r* r  O- L
    10
    3 E6 J1 }+ ]- l+ @- H, c8 B111 q" c1 G# }+ a9 Z' u# w" n8 C/ c
    12
    & X' d3 z) |9 \8 A4 u137 {0 a5 E  @' w$ l
    14% H; j+ d- U# K* F' c
    15
    # o6 R2 j7 N+ }) t7 n16
    , I$ l' V2 C4 f6 H, x" P* W5 ~2 @python除了做爬虫数据采集,还可以做什么?6 a' Z! h% V- ]) d
    兴趣学习 还是 通过python技术赚钱 (就业找工作 / 外包)
    $ i1 D! p, L  v7 M
    7 l# k. Z* p2 a4 H6 b- W$ R5 ~: t

    ; L& \8 J' ~6 K* o! b/ ^网站开发(就业/外包) >>> 我们课程是教授的全栈开发 薪资 13K-15K
    + t  m, U. z, S8 C比如: python开发网站: Youtobe / 豆瓣 / 知乎(以前版本) / Facebook / 美团 ;
    ) P3 s' K5 v+ E# Y我可以做到这样么?
    & O/ S! G4 d" L: v0基础 初学者 从零开始学习,上线 通过 域名 服务器 数据交互,4个左右的时间 就可以独立开发这个项目 类似知乎的网站;7 a. M5 k5 X2 r( v
    如果你做去外包(团队): python开发就业 大多数也是进入外包公司 一个 10-20K左右;
    9 }( L3 ~) U& Y/ I9 d& c5 \( \8 k8 `2 n
      I; n" ]. e% K# P1 c: R& v
    爬虫开发(脚本)(就业/外包) 可见即可爬
    % R$ a( w3 n5 h虽然爬虫什么都可以爬,但是获取用户的个人隐私(信息 电话 身份 贩卖 )、国家信息、商业机密(未公开数据,或侵犯版权)、色情等违法信息用来盈利,就基本上人无了!
    $ f6 e6 D, n2 A( n4 J. ]# W% `很多兄弟问我,可以帮我淘宝用户数据吗? 我都是告诉他们,这个我还想多活几年,这玩意涉及隐私,个人信息,你可以自己学了悄悄爬,爬完记得删了,用来实践问题不大,但是别用来盈利!!!! j3 Y( D" t. |! n% Q4 W
    之前有个兄弟爬取微博上面军事武器航母图片买给国外, 然后就进去了!所以奉劝大家,切记切记,别乱来!
    1 m6 ]4 [5 f1 w* c; S, r: U. v2 J: @, U; X  D
    ! T% @" b/ J& q% Y7 O; U
    数据分析(就业/外包)
    ) L% B% J/ v( b3 N1 f* K) z. e7 K" m4 `$ C3 k- P& ]

    * p1 A9 y- A& M0 C自动化(脚本)0 H2 b2 w9 T  g* _/ O
    $ x; q8 ?7 J6 i2 X; l" ^) h

    ' O' R9 l# A+ g. U游戏开发/辅助(脚本)
    ! M0 W4 A2 O4 Z: y& P% ^
    5 v) P  J2 U- a) d5 u+ _- q
    - A& ~$ Q$ D/ h( H
    人工智能(研究生以上学历 要求很高)
    ' c6 o1 p. t8 X9 T- l$ f1 i+ _
    ; H$ q, X% `5 p) h7 v

    * X4 b' X6 B+ k4 f3 }3 G4 I% r等等方向还有很多,我就不一 一述说了,那些方向对于一般人来说作用不大。
    7 Y8 _" S" ?* P1 ?
    6 G2 O4 f- w- F' ^  K% j
    2 b& z4 d/ n9 m) n4 D
    我们开始正题吧
    2 v' y5 M* m* Z2 }- r: ?+ [1 K& @& Y0 w

    ; a/ ?3 A8 E( c0 Y% o% s, m爬虫部分:: L; F) u' Z% B+ d2 @9 F
    发送请求 第三方模块 需要pip install requests
    0 W$ j  b! ]+ h/ i4 O' u9 M( N& p, j
    " c+ p$ V4 o8 t2 I+ S2 o! b
    import requests% L. }1 {. x6 l4 ~3 a4 h9 D( a
    import re  # 内置模块* v! Z" f8 J- W: g8 G
    ; [! r8 Q) S* Z8 R# X. x' g5 q
    5 G7 W8 I/ Q* [( ?9 a! b: }
    url = 'https://api.bilibili.com/x/v1/dm/list.so?oid=376200196') b9 T' S; L" P8 X. `6 R
    18 C9 }2 b  ?/ \; i# `3 D
    2% E7 m* e% N9 t
    3
    + Z; X' B' ~& f9 a2 H$ C  ~4
    & q2 r1 Z7 d  m& n# {8 X请求头的作用就是伪装0 `/ \+ s+ X, {6 m$ Q

    - Q  m# z' Y6 i2 u- J5 i) q
    6 \( ]+ e! q: E1 _- z  M+ r
    headers = {2 |' E9 z4 V1 s0 r' N) Z0 k
        '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'  b' |7 c. g( R9 f' k
    }
    3 d" t5 H5 O8 i1
    8 S7 C$ u7 X: [2 E0 [' R0 s2  T9 a) t; X8 N. I* C) x6 k  q
    3
    - j, ?- N4 G' ~1 Q  E模拟浏览器对服务器发送请求, 服务器接收到请求之后,确定你没问题 然后会给你返回 response响应体数据
    # v2 r) B$ \' \5 c; M函数传参# E% W1 W1 Z* P; |% l

    : q4 B) l4 n# \

    & e6 J: I+ M5 d% q0 C4 d( r/ T# yresponse = requests.get(url=url, headers=headers)# M+ c% r$ P6 u/ n5 v3 i' t5 w
    1
    6 G4 P% B' b# k<> 对象 对象意味着你可以调用里面的方法或者属性2 d) f6 g( d- y
    200 状态码 请求成功" }9 o& E; P* t# i  p% Z0 b- t
    获取数据 文本数据
    ! {' \; u6 c9 N$ w自动识别编码9 e6 J* U. Q* _0 e; Y8 [- k, y

    & Q- b* {' g% o6 Y
    & m' g9 _  v+ T) R: g) m
    response.encoding = response.apparent_encoding& M$ c9 X$ V4 ]/ {7 T& B8 y
    html_data = re.findall('<d p=".*?">(.*?)</d>', response.text)% y' {; C# Q4 D) K+ `
    1
    9 v5 Q3 w4 Y" ^( Z23 F- ?* a( g6 K# H& g
    content_str = ‘\n’.join(html_data)0 O# [- d/ O7 ?# W0 @! D
    6 Q( y2 l" K+ t; `/ q. Y
    6 l* X4 j- h8 q! O2 c7 g
    要列表转成字符串 ‘’.join()$ _" u8 C( w/ M) y$ j' ?! O, d( I
    for 遍历
    4 H$ P$ {9 s: q# A; U2 G保存数据 保存字符串& O" C2 Q2 y1 M" \3 Q, N# F
    for content in html_data:
    * ~- L0 H* _" p! o8 {# s9 @    # mode 保存方式 w 写入会覆盖 a 追加写入7 |9 p9 i$ r4 u. ~% W, W
        with open('弹幕1.txt', mode='a', encoding='utf-8') as f:
    1 R+ _5 I5 T6 V) X' S8 m9 m        f.write(content)) A) q, `0 f3 s. `: z: M7 B, i" O+ B
            f.write('\n')' f$ H+ c- x8 |2 I. a5 `4 @. u

    . t. N% E8 W+ j) B8 r9 e& D

    , m' Y7 C; O* v- M0 L8 j5 k# print(content_str)
    4 W$ p5 d& @* J8 Y; W5 I1  F3 ]4 O# k0 V! @& f7 K3 |3 ?
    2. k) U! ^9 k" r8 x' w% G+ s
    3
    7 b6 d" l$ L# z2 C' H% G4
    0 z+ ?6 |' s; D$ C$ m- o9 D58 r6 @# `& j+ x  O, r) o1 X; k: N
    6
    1 }& h: z& e* J; O6 r5 ~7
    " M# j5 l, X, k, _% w1 B" C& f爬取结果$ M* g+ _5 d: ]+ a6 ?" E. i! Q' c
    0 V, p5 z* |* m' W5 F
    4 q; W" q6 R9 g1 a
    ( D6 }2 A2 D1 J% @+ u

    + u# z' X2 F; m2 g" y然后我们再来实现制作词云图部分
    $ c  x; g. L* `+ ^) t' ~: L% H9 S' h  a8 Z6 g2 p4 I  M6 Q

    " L! v! r4 u6 A3 I: y+ N6 ~) V首先要安装这两个模块
    8 h5 l1 Z: \* d( b$ K# e
    4 ~# p4 f7 w8 e/ ~7 n! B* c
    ! V# L7 p% n8 d  F3 G1 S8 t  _- I
    import jieba$ r  a  {3 O, L. ?
    import wordcloud* ?" e+ x( A+ _( f6 x4 z
    1
    - {' J( {" [) Y  q3 ~2& O- U: I% O( L5 C+ f/ y
    一个相对路径 一个绝对路径,保存好的txt文本名字要注意看一下,不对的话,记得改一下保持一致。
    * Q; e" g. V4 H0 I7 {
      H. ~% ?: [; |7 k
    " f- ^6 q% ]" g
    f = open('弹幕.txt', mode='r', encoding='utf-8')- W+ c- J0 x# h: w. R6 |
    text = f.read()
    , B% E) ?4 ]( c6 [) p7 T9 rtxt_list = jieba.lcut(text)
    # L: [# L6 o, \2 l# print(txt_list)3 }# ^: j8 h' T( Y& v$ I
    1
    1 t5 u9 }) s' f! ^5 W: {; n# P4 I2, B) G0 P! F5 M" H
    32 U1 Z* U# X9 W4 d/ k; K4 h; |1 p
    4
    ' m8 i5 Y0 m. @列表整合成一个字符串6 l3 g' R/ n: [, K* Y
    3 t# V; `% z. E
    0 j' o+ S- r9 K& N4 u. B; n
    string = ' '.join(txt_list); L; m' n0 |4 O! G, L& y
    print(string)2 H: b( M' b) V# A0 {+ C* C
    print('---'*50)" |# k6 S$ h, a, R: i
    print(str(txt_list))# `: H* R7 [( |( D" X( n) `( y
    1& n: h. \1 e1 x$ {) V, k
    2
      u' R0 |' Y4 d9 F0 ^3 Z3
    6 U: G; O8 f2 M4
    . M/ v7 s) J" W词云图设置
    ) _% I; ?2 o4 {5 i3 r# L* G7 r0 l" @1 T$ u
    ! i) d: N4 h9 y* }
    wc = wordcloud.WordCloud(; S3 ^9 ^4 d/ H1 p5 \4 }
            width=1000,         # 图片的宽$ p( N' i8 L/ a9 r( W: C8 ?
            height=700,         # 图片的高
    ( S/ ?5 i0 M( _" d! M0 d# ?        background_color='white',   # 图片背景颜色" @. H& z, [/ W( i( x' e$ o
            font_path='msyh.ttc',    # 词云字体
    " I$ A* ?; l; H# L/ N  S        # mask=py,     # 所使用的词云图片2 B; z; h$ t% M7 T0 o/ O( u
            scale=15,! W/ e( ?9 q$ w  j
            # stopwords={words},         # 停用词, A( J) |  Z$ M! k/ y
            # contour_width=5,! n' J5 s  ^# f. m" W2 T
            # contour_color='red'  # 轮廓颜色" e6 @8 y0 d5 C% F4 Z- N$ B8 o0 P
    )
    5 V4 H" j! |/ ?# ?+ i' G9 D) ?1: H' d/ J/ t6 n
    2
    " p3 o( c3 b1 J4 f/ b) n30 W! _" Z  T$ }0 ~2 P- i
    4
    ( \9 U3 w9 K$ Q1 p55 V3 U+ m  [& x* W2 h) A! {# `
    6$ @+ x. t& L4 ]4 I
    70 D8 b  O5 {2 x2 B# Q3 I1 Y4 W: |; f" K) l
    8, j4 U7 X6 o4 G4 N3 N8 b: y' _
    9
    ; a$ N( J; Q' E  Q" s7 a10
    9 C& v* j( E$ `+ J* J% D11
    9 ~- z, S- a+ U5 y8 P5 u给词云输入文字/ p/ K& U+ q; Y9 k% j% q9 M9 i  ?
    & O2 [" v2 `2 ~7 q% W* C7 I/ a# K
    4 I) ~% \) d0 ^' J! f! T5 o4 [
    wc.generate(string)
    7 N" A3 E, F* e! i  w1' p1 K* e4 b& ^4 R: |
    词云图保存图片地址
    ' K0 S. [6 Q7 y% Z/ |' }
    $ Y  N8 A3 ~% `4 @  w# x# i

    9 N* }0 `+ y0 K. S% L: [2 l2 Uwc.to_file('output1.png')
    # {6 V2 _6 u( x9 n4 I9 ?+ ?1
    ; \2 V& j1 @) W; X9 @9 H词云图的过程中有点慢,大家不要心急
    - r& e; m- P; l5 o. b2 H& m" _6 t1 Z( X! q: G4 o; \; |
    3 @+ B; [* a2 N. V' r: D* ]: p
    这是最后的结果: O: U0 J4 u2 O) l$ M: l

    ! G) v( F# v& C/ g- Q$ a
    4 e( j& l) R* u% ?* U; o
    没有加停用词,所以一些无用的词比较多5 d$ ?, k+ C' t$ z& X7 K; l
    5 v) w2 G& H5 C3 V2 w, X9 @3 @

    . l$ j# D$ c, i! u% w# dstopwords={'了', '啊'}
    # C% I0 A% z2 q% z5 Y& f1
    $ C6 g% ]$ k% z* J- C把这个部分的代码加入要屏蔽的词就OK了!比如我现在把 了 跟 啊 这两个字屏蔽了。
    . b6 f+ z) C4 ~1 T6 h: v我们再来看下/ \- h- ]+ M. y' x7 f% [- e' g+ j

    " z0 s0 E6 P" C7 y2 |' F9 `
      y% l: ~$ m. Y
    不知名网友:666666 牛批 老哥我要学!!!8 {3 m) C* E; t/ h9 m$ P+ [# ?7 r! C

    : R7 M3 z2 v0 r& w2 A

    8 P* u' V: k  b! k3 T* l+ c( B/ R4 k* s$ y6 u1 d' [
    " {0 b) F" ^& e/ E7 n
    ————————————————
    2 R3 D8 G! f% Q0 Q6 M- F3 d版权声明:本文为CSDN博主「编程界的泥石流」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。/ w- K& C3 Y8 b
    原文链接:https://blog.csdn.net/ooowwq/article/details/1192119079 [" V5 D, m* O! g1 }0 x
    9 G) F8 J+ Q0 R/ n1 w
    : r. W1 h0 `; {) Z4 i4 g9 N
    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-4-11 14:00 , Processed in 0.430417 second(s), 50 queries .

    回顶部