QQ登录

只需要一步,快速开始

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

    # Y& K5 A1 v9 g. m- D# g. r用Python把B站视频弹幕爬下来,绘制词云图看看大家最关心什么!
    % q0 k- Y+ P5 G  E& i今天带大家做点好玩的,把B站热门视频弹幕爬下来制作词云图!4 Z& h* _- h2 H, V+ [) J
    康康大家都怎么说!4 t  e9 ^3 r* g

    5 n, c! M0 n- M) L$ Y7 V/ G; w

    " K+ u7 w8 \; d, [" V- ]
    8 P6 c& b: y/ J6 b% \/ ]4 D2 U
    : w, B; R' \, w, k. b. P
    开始之前先给大家啰嗦几句,可能有些兄弟不会安装模块,我大概讲一下。- B. H  q- L0 N) Q
    + h# Y1 l9 o3 ]& p" ^& E* m# H: M

    - L( T' _0 }8 e. r7 d如何安装模块:
    + b4 ~6 x# P- N& |; n& z6 m/ P; Q; c' v4 E) m

    3 g( I1 y3 K# |9 K) q3 Iwin(键盘左下角ctrl 和 Alt 中间那个键) + R 输入 cmd 输入安装命令: pip install 模块名 回车5 I7 ^+ X3 A3 l4 V" {' C( L' a9 c
    pycharm里面安装 terminal 输入安装命令: pip install 模块名 回车4 l1 A3 N$ H; |
    如果模块安装失败了,可能是这些问题:
    $ l5 q) `9 l0 S4 H. \  l) R
    - k% L$ G0 J( E' o) L
    7 b4 [. m9 R2 T' T$ \1 E
    提示:pip 不是内部命令
    / x/ D. d6 ]& W5 Y你python环境变量可能没有设置好6 }( C' O1 }9 g% |/ v2 y6 m
    有安装进度条显示,但是安装到一半出现报错了% ?  i% N, ]& u+ Q2 @+ `. N9 X. k
    因为python安装模块都是在国外的网址进行下载安装的, 国内请求国外 网速很慢,下载速度大概只有 几KB
    " G7 T7 [- A9 m) Uread time out 网络连接超时 你可以切换为国内的镜像源
    * s% u& M8 r3 k! ^/ \; `明明在cmd里面安装好了,但是在pycharm 提示我没有这个模块
    * W6 G# x/ ]1 z你pycharm里面python解释器没有设置,你在pycharm设置里面重新设置一下- U; P9 l. c6 A, S5 m  K. d  B
    可能安装了多个python版本
    $ X1 G) i, ~( G: R* p; p, `1 q& K安装一个版本即可% ^( I+ L5 h% p' r( T1 |4 m1 w$ p4 `
    Python做爬虫到底可以做些什么呢?
    % J: W( E+ P% H% z5 @+ Z: N
    1 E. U! I1 S& S+ ]
    & n; [' H$ \1 L* r7 F  S
    常规: 爬取网上的数据 / 我可以批量下载图片/文字/音频 视频…  `( e  E. K; R5 t( E6 G
    12306抢票 / 京东商城电商网站抢购脚本 / 朋友圈刷票 / 一些问卷调查自动填写… / 文章刷阅读量 / 音频 视频 播放量8 K2 {. [  r: }9 p( e' U- Q% E
    可以刷课 可以刷网课 自动 还能自动批量注册账号! q/ B6 h, j4 a; d9 o3 l
    模拟点击 >>> 游戏辅助 >>> 修改游戏内存(单机) …
    # u" ]' l" ?( R2 n; K普通B站视频可以爬 番剧是需要会员的7 H! }) f. y4 U+ v. N) ^( h9 F

    ) h- q' O- g$ r+ D, l, r$ S

    % B2 i: j( v! ^# _爬虫都是通过开发者工具进行抓包分析 查询数据来源 ( 静态页面 / 动态页面 ajax异步加载)  a8 q3 ~- y3 [3 x

    % q9 G1 w, I. e4 O2 d

    % S) c* G4 I# o% s9 f: B1. 确定目标需求 (弹幕数据 那个视频弹幕)- ^. }$ f/ C, @$ p% i6 x8 z
        确定了- U9 p! I& d, r, O2 Q' D( i" e
    2. 找数据 (数据的来源分析)$ b5 |9 f0 U/ Q5 b1 F0 Z
        简简单单 找到了8 `& v9 w& |/ R: K
    3. 对于数据来源的url地址 发送请求 (请求方式 / 请求头)9 v! K1 H5 |1 f( A* q0 @& O" w
        请求方式: get / post) J+ L5 Q6 g0 O
        请求头:
    4 R% M% Y; o5 J5 z( S+ @    https://api.bilibili.com/x/v1/dm/list.so?oid=376200196
    / W# y- z( H1 N4 P' e    (通过开发者工具去看一下数据的具体来源,是否是来自有这个网站)$ G/ f1 H8 I( J
    4. 获取数据 3 F  e5 g/ K- i8 \/ P! K
        文本数据 response.text 获取网页源代码
    , O3 K6 t# }" d4 f    json字典数据 response.json() 通常一般情况是 动态网页  ajax异步加载 用的比较多6 ~8 `5 i1 p+ |, E1 l  \
        二进制数据   response.content  保存图片 音频 视频 或者 特定格式文件   R& y0 L$ T6 X
    5. 解析数据
    # p& z. A9 L- ~( h    正则表达式 .*? 解决一切  遇事不决 .*? 通配符 可以匹配任意字符 9 y+ s2 w* [% L( D* M1 u
    6. 保存数据
    # l+ O2 ^1 G( D0 f8 d% L14 H+ g* e% y! p7 A; H  v8 l
    2
    % u  a- p3 z3 d2 ~3
    7 O8 V5 l9 e' N% s0 N4: v" ?. H6 J8 ^7 a3 }, H0 b
    5
    & G) h6 t/ o* B' x6
    3 y- |( R0 }! l4 B" X! O+ Z+ g4 B& v7
    & M; V& \  f  t  P8 s8+ P1 g. u  q7 p% n# c
    9+ N! Y$ F$ W0 P0 _2 `, Q
    10) q8 L/ q7 `6 [( G8 b
    11
    & y+ |/ z5 d! _1 S+ j; r# A12
    1 f  `9 Q5 W% n3 U+ p8 B13! A" B$ V* P4 V  {; k: ~$ I
    148 r3 F, }. m4 E
    15
    4 e* x8 W/ Z) O! Q16; I" f6 J4 K' ^' U
    python除了做爬虫数据采集,还可以做什么?+ h! T2 A% S/ ]* ?/ |. B$ g: J
    兴趣学习 还是 通过python技术赚钱 (就业找工作 / 外包). c! m* O$ O6 F1 g2 {8 ~
    " M6 m* i  ^3 T0 ]" O

    * l2 b: ], H) }- i2 J* h- ]网站开发(就业/外包) >>> 我们课程是教授的全栈开发 薪资 13K-15K- D8 e" }/ Q4 W- A+ l
    比如: python开发网站: Youtobe / 豆瓣 / 知乎(以前版本) / Facebook / 美团 ;
    2 W* [; g) G) q0 l9 N( G我可以做到这样么?' y' g7 G* a! z- l
    0基础 初学者 从零开始学习,上线 通过 域名 服务器 数据交互,4个左右的时间 就可以独立开发这个项目 类似知乎的网站;  N6 a4 j1 w' @$ J
    如果你做去外包(团队): python开发就业 大多数也是进入外包公司 一个 10-20K左右;2 z& l3 J7 L9 b7 d# m# d; b

    8 E0 U8 E( V) i3 x0 {" L

    % @- g+ U6 x2 M9 h$ p: ^爬虫开发(脚本)(就业/外包) 可见即可爬
    % L7 Q2 _/ g+ q' y6 |! q- f虽然爬虫什么都可以爬,但是获取用户的个人隐私(信息 电话 身份 贩卖 )、国家信息、商业机密(未公开数据,或侵犯版权)、色情等违法信息用来盈利,就基本上人无了!
    " U( g; W, C1 X% V1 @& t很多兄弟问我,可以帮我淘宝用户数据吗? 我都是告诉他们,这个我还想多活几年,这玩意涉及隐私,个人信息,你可以自己学了悄悄爬,爬完记得删了,用来实践问题不大,但是别用来盈利!!!
    ) r( m4 u/ \( \; f7 ^之前有个兄弟爬取微博上面军事武器航母图片买给国外, 然后就进去了!所以奉劝大家,切记切记,别乱来!% K9 V6 v5 _" K  i

    : s& y, R& f% O8 [! f

    / z( w, V9 {  m" h数据分析(就业/外包)
    ! ~" s5 g# [' a0 Q8 x# Q* }+ {/ V5 ]

    - R) W! M! d4 P& S/ A自动化(脚本)
    ; q) i: B' b+ o3 J1 F- ?; A
    + m' f1 Z* x3 O

    5 @' u. y9 z9 u4 C' ~. l% v游戏开发/辅助(脚本)' q7 e/ U( U. I9 b
    : P' x; g9 ~8 l' u0 [# ~4 l1 G. e$ k

    " @5 K; E$ \/ n1 i9 J- i" D* N% N0 o人工智能(研究生以上学历 要求很高)
    & ^, t, S- a- N" F8 p: j0 K+ y. I# a7 }. R9 Z# e' L
    1 b; p" Y% {, K* ]
    等等方向还有很多,我就不一 一述说了,那些方向对于一般人来说作用不大。
    # L! g% J7 P0 d6 M! i
    & T# \+ q! t) Y- \5 V7 e0 r

      l. m" h2 D) t% m9 k8 M6 ^我们开始正题吧
    ) k' p' U/ ^. K) G0 ?$ @2 @/ V% j- L7 }

    . {; t. l, b( S" g+ c2 D- ]  q爬虫部分:
    6 f2 Z$ L. G, Y+ E) E1 O7 [2 N发送请求 第三方模块 需要pip install requests
    7 v% C. e  J( y" j$ P
    : W0 P& m+ {3 M2 Z& d) e+ V$ N+ h
    $ S" l: u, ~. T2 `' O  Y  e1 F( O
    import requests" y4 z; t/ B; Q3 T+ Z
    import re  # 内置模块5 y3 x4 [3 Q- Y5 R2 F$ ]. I

    5 b% t. n* ?: s( `, O
    ; B: O" \, o9 W# d# T! u0 I
    url = 'https://api.bilibili.com/x/v1/dm/list.so?oid=376200196'$ [6 P+ p3 K! w/ q7 r+ O' e
    1
    , N' {2 ^' K1 O5 W2
    , @# S$ a3 E9 d" B3
    % i' e' _, J3 O48 j( V$ v' g/ p/ }% o
    请求头的作用就是伪装8 M: {3 Q  i9 k4 E* z4 \9 K
    & Q8 p' v+ n$ Q& n  [- K

    * m- H8 l& r" e/ U/ H1 x( iheaders = {
    & U5 C# t( S. n7 _, D    '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. a# F$ E6 L, O8 G, G" d
    }
    8 f6 v# T8 U! k1 j& I; P1
    8 ^1 J! l' u- U7 Y7 W2& y* C% G/ O5 M2 g- a
    31 D& h! H  W& I0 d2 G3 c  j4 g
    模拟浏览器对服务器发送请求, 服务器接收到请求之后,确定你没问题 然后会给你返回 response响应体数据
    1 u) ?( \, B! i7 d( T函数传参& s& V* i. [! v; y8 p
    7 b1 u4 I; f+ E. O3 U" o* m
    , ?  P0 K) b8 K) U/ j& a; R
    response = requests.get(url=url, headers=headers), N/ @- O) }- J+ Z3 i5 Z, \
    1! \6 ?5 Z  r+ U* m
    <> 对象 对象意味着你可以调用里面的方法或者属性9 P/ X6 m) Z0 S; V/ d- W% Q9 |
    200 状态码 请求成功
    9 N2 J" o% u5 Q: R9 s* T获取数据 文本数据4 t) y/ u+ ]0 \3 I8 F; X( \$ o2 s
    自动识别编码
    " J, a% {! X6 X9 W5 W( z2 D5 E* I$ Y' `8 ?0 R9 V0 J' w
    + F/ g' l4 G4 ^2 R
    response.encoding = response.apparent_encoding8 U, w0 p( G4 C
    html_data = re.findall('<d p=".*?">(.*?)</d>', response.text)8 p$ ]& W: ]2 m* U% a, L
    1
    $ K/ e# C, l' e* |! J. A21 I3 a0 k7 z' W: a. h: {0 b+ t, b$ b& K
    content_str = ‘\n’.join(html_data)
    7 m) R5 F# C1 q3 A+ |8 o. T7 ~
    $ ~0 I5 Y4 [5 Y9 L- l5 D
    % a9 o) ~0 A8 M* z5 T" r$ V
    要列表转成字符串 ‘’.join()
    ) L; \( c/ w& p+ S5 Ofor 遍历! ^# s% n+ q/ ~) @5 Y( O3 s
    保存数据 保存字符串+ Z% r+ [! l; o' E, X: A0 t5 X" V' T
    for content in html_data:
    % |+ u5 t2 S$ n0 u3 T' f% D    # mode 保存方式 w 写入会覆盖 a 追加写入
    ' o$ j# Y) ~6 u, I4 e0 o4 T    with open('弹幕1.txt', mode='a', encoding='utf-8') as f:
    / C% X& _1 U- @" \. }& J; Y& L: _        f.write(content)
    ( p/ c' h7 H3 K        f.write('\n')
    ; x  I+ p4 c+ y0 ]6 w; D/ G5 O7 {1 ]7 Y: [0 |" k

    7 M5 u' J( c5 ^# print(content_str)8 w3 `. D+ i, e+ D% i# b% a
    1
    $ _8 k- j" t5 W, {; [2
    - W: E3 X8 w! Y0 d' W3& G/ H7 g8 P/ f* \( V- i
    44 p8 S1 W/ w9 {1 F% ]  o. u  A
    5
    5 s. O9 |$ y7 H1 V63 `# t. j" G! O/ `5 p
    7
      s; i/ I5 P6 e1 q爬取结果
    & O" y( r& J+ {/ P3 C5 t; o9 e8 E
    . |  c+ F& Z; c5 y) Q. k) _
    0 O" q& x5 Z% V/ H. {! Q( u# x

    * Y9 z# c8 a, f. A* L1 b6 ?

    * w: ]( H# h4 w* g6 b9 ?3 k然后我们再来实现制作词云图部分
    0 A) `# m' S1 D- P. g' p% ^* j! T8 L5 S" j

    % S6 S( u; W2 W: q* j) [首先要安装这两个模块' _: V3 R: Z0 q3 \( k; V# d: B

    ' I6 j* q% D0 F. x) n) L

    * R+ w- q: H; ^: i- A# {* m5 Zimport jieba) [- U' A' S+ r& {9 Z) r1 w
    import wordcloud
    5 G! N; i6 F0 w$ Q1
    2 n: H$ L  ]3 B4 |- y% y# a2- d! W( S4 W) b
    一个相对路径 一个绝对路径,保存好的txt文本名字要注意看一下,不对的话,记得改一下保持一致。" E/ m" T' h' t& E1 Z4 H% Q% [
    2 k( f$ c6 \3 m- D
    , J; B0 X; x3 `9 I* a/ q) d# L
    f = open('弹幕.txt', mode='r', encoding='utf-8')6 F: o* W) R% d: u  X1 w/ Z
    text = f.read()
    ( q5 V8 K2 f& A& ^+ G. x( Ptxt_list = jieba.lcut(text)% _, I4 ~5 r9 B8 [
    # print(txt_list)
    # N+ J/ s0 K: V( b$ r7 ^' k: o1: F1 L9 j" z3 S8 p( a/ n
    2
    " b) h1 B; ^9 G3
    0 Q/ l  r! L9 B) k/ W4- e4 e# S$ u: I# V! p4 p% k
    列表整合成一个字符串
    . h8 L; A- @* @2 q8 I. {- n
    % m5 k- {6 O. v

      _# m0 Y0 x1 D! l: ?+ _1 istring = ' '.join(txt_list)0 K9 u0 `' A( M, S$ W" _4 W
    print(string)
    ( v" l/ y- O9 \8 V. U( Qprint('---'*50)- ]! W) W! x- _* d
    print(str(txt_list))
    0 D: d  g- R* Q9 F$ C! {5 ~) R1# o1 V( I- Y2 q# O3 e* c
    2- [- V, t5 D5 n
    32 \' O* U. p' C4 `% E& R
    4
    ; V' a# T) T$ }词云图设置
    ' |' {3 z: A1 q4 H, M) u6 S! ~) M& l2 `: q* T. k8 w  I; m. j! Z7 @

    . b: E7 p6 Y3 H6 G: S5 p1 Pwc = wordcloud.WordCloud(
    & v9 _2 m. X, U9 `3 k        width=1000,         # 图片的宽
    , c7 ^& c% @! y) _, T. {        height=700,         # 图片的高
    ; [+ v* S1 q0 d% y1 L        background_color='white',   # 图片背景颜色
      E2 \# e6 w6 ]        font_path='msyh.ttc',    # 词云字体; P0 q  p1 E* v- c7 p. t4 O1 ?
            # mask=py,     # 所使用的词云图片
    * o# C, r5 R: ^7 o5 C$ k        scale=15," t( }+ c+ }) Y/ E0 S6 u) B. R
            # stopwords={words},         # 停用词
    . d& D! j$ M, ~8 ~" I4 B  ^        # contour_width=5,
    ( \) G' [8 z0 j2 N& T! T1 Z        # contour_color='red'  # 轮廓颜色& g. ?' M$ @" p+ e
    )
    - v3 r$ `* _; h7 _1
    4 j5 w2 V: d! ^/ ?. a2
    1 R& ?/ n4 U' f7 N  n3( n, L+ D+ j! l+ \; p
    4
    4 ~$ I2 a5 O- g5 r4 }5
      P  v! A3 }' q1 l6
    ( z0 s3 [- {  N, L& F7
      |' q/ g* T  b8
    - d8 c2 z0 l6 o  ]' C9
    ! P) [6 `$ M6 a/ V; D10# t1 V! M3 U3 s+ S9 U1 f8 v
    11
    # Y) q0 h* z) L9 Z4 o0 q给词云输入文字
    ; V% F) T: b# z. v8 Z1 P4 P+ |; i, u6 e' D$ f$ L! M2 q: n. L
    8 k; M: H4 O0 a& k2 Z/ \: O5 V
    wc.generate(string)0 P1 f9 Z" J' k. O6 x
    1: s4 G7 X8 r  m9 L. C* s8 U
    词云图保存图片地址; ^) O: J+ r6 h3 O3 \7 D2 G; l+ l

    + J/ }2 y% T: p2 x4 Q1 i
    ( [, Z; E4 t# \
    wc.to_file('output1.png'); p5 F( e* V( X3 r4 ]
    1
    + g+ O( a* {/ a! E- X+ L, i' c词云图的过程中有点慢,大家不要心急
    ' @4 d( c  V$ V  l6 _7 p, I
    1 v3 P/ U" k# r& H, ?' B- H

    ; g% J$ q4 }% l: \这是最后的结果- G8 M- o! `& C7 N: m

    : E- W7 M3 ?  v& f# `% ^

    # ~" P! @. k5 O, g, P; \  R没有加停用词,所以一些无用的词比较多
    & J& @# R$ N$ d2 d/ X8 l( v" c: g& q
    " H+ a3 e$ t4 Z. s( q

      d. {# H5 ~' q: K% Mstopwords={'了', '啊'}& Y, w2 o, y2 o7 s
    1
    2 @  W+ {* P) _: C9 q) j把这个部分的代码加入要屏蔽的词就OK了!比如我现在把 了 跟 啊 这两个字屏蔽了。
    7 N8 H1 I+ F" @我们再来看下% n" ?2 p  t5 t2 i9 ]+ p. d

    ! \$ b  h/ u3 b9 U7 }. Y

    ; B' X2 \. }1 w! J; n2 v2 a" _不知名网友:666666 牛批 老哥我要学!!!! q  Y# \- g' _# B. Z. e
    / O; {* ?! K* }, ~- ^3 z3 f
    & M( k- \2 ?/ l( U

    & x7 ~; Q' j" Z8 |

    2 A( N$ M! d6 {) t' R1 r. @————————————————
    * I9 k2 @" t; ?版权声明:本文为CSDN博主「编程界的泥石流」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。* V, v6 k, G+ ^( z
    原文链接:https://blog.csdn.net/ooowwq/article/details/119211907
    4 e9 p% T4 I% S4 s0 c/ C  U
    / e* C7 t4 Z# A3 C, t' @& R3 k; x, M% F8 E6 E3 _. h& ^: Z: o
    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-12 07:46 , Processed in 0.399818 second(s), 51 queries .

    回顶部