QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3124|回复: 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
    9 m+ Y% y7 H3 z+ L
    用Python把B站视频弹幕爬下来,绘制词云图看看大家最关心什么!
    0 G- v. [* H0 Q9 ]- x今天带大家做点好玩的,把B站热门视频弹幕爬下来制作词云图!8 v7 W% e, b: G) v  n- H4 h, _6 N
    康康大家都怎么说!4 ~' w1 {8 T' B0 f
    ( l1 m/ R# i6 D( G& N

    + `$ \& i  U5 f0 X0 O4 P* N8 j* k! T4 d, C+ ^& R) |% L, b

    ; N5 K8 R; A+ _4 I! p开始之前先给大家啰嗦几句,可能有些兄弟不会安装模块,我大概讲一下。
    % o# T# G9 a  F! s6 l  E+ S* \3 j5 b4 T1 G8 S5 w! e
    1 ~- j5 [) r9 x! z0 E, @) ]9 c! K3 C
    如何安装模块:
    1 j3 f" B( N) H& i; k! S" _4 [
    / W: z/ b5 j8 l0 n- r( F

    ( h# J' \: h- N% @0 ]- M5 _+ _. ]win(键盘左下角ctrl 和 Alt 中间那个键) + R 输入 cmd 输入安装命令: pip install 模块名 回车
    5 @8 C. s* n3 f7 vpycharm里面安装 terminal 输入安装命令: pip install 模块名 回车
    " s3 n5 F" b: @+ \如果模块安装失败了,可能是这些问题:1 d5 r# S7 K0 y3 g( w6 H
    / P; E- I  g$ D
    ' o6 l  v+ n% h5 K3 `7 V
    提示:pip 不是内部命令
    - D$ x0 @2 H! b  a  H你python环境变量可能没有设置好! j; O  W% s# B5 R2 L
    有安装进度条显示,但是安装到一半出现报错了# ^% d" S) n  G4 M
    因为python安装模块都是在国外的网址进行下载安装的, 国内请求国外 网速很慢,下载速度大概只有 几KB
    ( G+ h9 h7 d1 P" T  {5 w1 O/ _) dread time out 网络连接超时 你可以切换为国内的镜像源2 w5 R$ W( O: ~: I, O- g2 q/ r
    明明在cmd里面安装好了,但是在pycharm 提示我没有这个模块
    ' q2 h6 u4 C/ p  S1 m你pycharm里面python解释器没有设置,你在pycharm设置里面重新设置一下8 V8 o4 {& s  x2 I9 p( @
    可能安装了多个python版本
    4 D) u5 K, X$ Z安装一个版本即可7 h( i% e) h5 A! U- n
    Python做爬虫到底可以做些什么呢?) x- U% T2 T: R+ L

    ( o# a# p& t! J! z: j/ h

    . i7 s" V" f$ O9 ~1 h1 h常规: 爬取网上的数据 / 我可以批量下载图片/文字/音频 视频…
    3 q" ?7 K+ F1 r8 e$ A; n9 ?12306抢票 / 京东商城电商网站抢购脚本 / 朋友圈刷票 / 一些问卷调查自动填写… / 文章刷阅读量 / 音频 视频 播放量
    ( e' F: n, l! ~& U可以刷课 可以刷网课 自动 还能自动批量注册账号
    5 B( w1 Y8 _7 J: _5 B& u: d模拟点击 >>> 游戏辅助 >>> 修改游戏内存(单机) …
    ' c9 z4 z: m& D+ k+ F% s8 D普通B站视频可以爬 番剧是需要会员的- c; ?7 F/ Z  w0 S0 u- E
    1 H+ ~6 }- D/ t" e  [9 K

    : F" h2 v7 m9 A$ b4 E- \爬虫都是通过开发者工具进行抓包分析 查询数据来源 ( 静态页面 / 动态页面 ajax异步加载)1 F( a* w) \7 P5 A: ?/ l: O
    " O  _, U: ~' U/ f, E

    * W, [  L4 ]  G# r1. 确定目标需求 (弹幕数据 那个视频弹幕)
    . n5 l' }: M7 a2 }- a    确定了$ O/ S# w: I$ K' V4 ]  }% j
    2. 找数据 (数据的来源分析)
    . T3 Y; q$ z/ O- y! }4 f    简简单单 找到了
      `0 U. S! C  i% M# N# ]3. 对于数据来源的url地址 发送请求 (请求方式 / 请求头)
    5 H) A4 c' y2 m3 f1 A    请求方式: get / post. T0 C! B# n; t0 s
        请求头: ! V. ~, w, i4 j3 `) v" i
        https://api.bilibili.com/x/v1/dm/list.so?oid=376200196; O8 D& t( W4 M4 q# K7 H/ X+ i
        (通过开发者工具去看一下数据的具体来源,是否是来自有这个网站)
    ' m; M: P% y7 X" Z; q' h4. 获取数据 ! p; u6 P5 T8 p+ M8 k
        文本数据 response.text 获取网页源代码
    ( {( }4 O$ w" C4 Z2 ]8 P: Z1 z3 W7 |    json字典数据 response.json() 通常一般情况是 动态网页  ajax异步加载 用的比较多
    ! S" ^3 L# T% h% `: R. R  [    二进制数据   response.content  保存图片 音频 视频 或者 特定格式文件
    6 J6 r) _. ?% ~4 f2 n7 H8 x5. 解析数据& |2 Y' M" Z; h3 Y$ R" ~
        正则表达式 .*? 解决一切  遇事不决 .*? 通配符 可以匹配任意字符 8 k9 c6 R% U  M; x$ j3 ?
    6. 保存数据
    - }4 g1 y9 k5 [) P1, ~. o6 K7 E  X4 I. b4 }
    2
    . W9 _$ L6 y6 {9 V1 v% G3
    ; E. U; P4 @$ l8 e2 J* j41 Z1 r! ^7 W$ [7 _; ?9 C. s
    5
    ( ?: J2 p: V9 J5 {' J' Q7 h61 n& g0 _: n$ r4 q, M0 |# w
    7$ Z" a) f( j1 p0 P6 A7 p/ o
    8
    2 N1 O$ I4 ?/ [$ n/ a3 b8 L9% i4 C/ ]$ Q7 Z9 }8 P; V3 ]$ I% Z/ s
    108 f7 L/ U& B  ~& I3 r% ?
    11- ?# S7 \( l3 D& y& R/ H
    12. E9 v( ~# B' z. I
    13  ^0 U* @5 T" f& K- ]9 G7 p
    14- r3 E, I( {6 X' j" k& @( z
    15
    * Y' f/ N9 }9 p! Y16& K1 v# r' j0 E
    python除了做爬虫数据采集,还可以做什么?
    * E; Q+ W" L, _  P4 V兴趣学习 还是 通过python技术赚钱 (就业找工作 / 外包)
    $ C1 J( s. i* x1 p& c7 W1 ]
    - B$ v* m) n# V/ Q6 ?% @7 v3 }

    ; w  s: s% s) O, j8 {8 _! d) _网站开发(就业/外包) >>> 我们课程是教授的全栈开发 薪资 13K-15K4 ~( A# g( ~# ]$ @0 V4 [! y
    比如: python开发网站: Youtobe / 豆瓣 / 知乎(以前版本) / Facebook / 美团 ;  p7 I( I/ U/ ]9 _
    我可以做到这样么?
    . t) i; d5 V3 H+ g) b* g- C' |0基础 初学者 从零开始学习,上线 通过 域名 服务器 数据交互,4个左右的时间 就可以独立开发这个项目 类似知乎的网站;
    8 g# }' _* e8 e( F; Q" J8 E如果你做去外包(团队): python开发就业 大多数也是进入外包公司 一个 10-20K左右;- ?! C6 Y9 g* o

    1 w# F; c+ Z6 N+ t, g
    $ g* [; J& M% X7 M
    爬虫开发(脚本)(就业/外包) 可见即可爬
    $ E: Y. q! k5 ?: j+ E虽然爬虫什么都可以爬,但是获取用户的个人隐私(信息 电话 身份 贩卖 )、国家信息、商业机密(未公开数据,或侵犯版权)、色情等违法信息用来盈利,就基本上人无了!
    ' p! J- ]4 f+ g很多兄弟问我,可以帮我淘宝用户数据吗? 我都是告诉他们,这个我还想多活几年,这玩意涉及隐私,个人信息,你可以自己学了悄悄爬,爬完记得删了,用来实践问题不大,但是别用来盈利!!!, Z9 f7 s- C, D, r% o9 b; i& j
    之前有个兄弟爬取微博上面军事武器航母图片买给国外, 然后就进去了!所以奉劝大家,切记切记,别乱来!$ D; e1 ^$ r6 d% y
    ' T: |3 A. C: q9 n6 ]3 G8 E

    - D/ s$ K. S5 m7 V; @数据分析(就业/外包). [+ O/ N/ P! A8 V9 b7 n7 ]5 c

    4 [5 K3 |7 ]" Q1 {* f: p6 m

    6 n3 l6 t% I1 O自动化(脚本)
    # V, N% a; w( O$ |, q
    " R: t9 G) s/ `) s! U8 X

    * v  Z' N7 v( a8 t5 X4 s游戏开发/辅助(脚本)1 S# Y* [( i8 }6 T, h9 l

    1 b4 k0 J8 o3 f3 |
    % f( y+ O+ Z& g( A' I1 G, Y) I
    人工智能(研究生以上学历 要求很高)
    8 }  Y% ~6 n! y! h% m& L4 g
    3 r4 ]6 j4 ~7 r* e" q7 B) ]

    $ w4 ^, B! L& T" f, \. r; x3 F等等方向还有很多,我就不一 一述说了,那些方向对于一般人来说作用不大。
    ; @+ X7 f( e; h( ~- i" z: L& w. o1 K+ s/ X: H8 P/ `

    * w, X( Z0 I% w* _; N) P; C: y我们开始正题吧) v& J: v! d7 u
    6 ?1 I' b4 e& t
      B2 [+ s& [( b% z  {. _3 A
    爬虫部分:
    4 e- C, X$ j+ P% t8 l  p: c0 `+ F( O发送请求 第三方模块 需要pip install requests
    * a- r/ I" g. i* G$ p2 u4 Z$ b$ ^5 X, h1 h) J7 M

    . x/ s  F# r* {2 |7 {  m8 J* p: simport requests
    * W8 r; F& @' j: Eimport re  # 内置模块
    7 s( Q) W9 }. w3 {' Y. a
    3 ~* L, \! f: t6 m3 ~- k- L

    # E& {/ @9 C' i& r. p7 i; Zurl = 'https://api.bilibili.com/x/v1/dm/list.so?oid=376200196'& a' p" O  |9 R, M' ^
    1
    8 z* L2 Y  k# A, y9 B. b2' E0 T, U7 C7 z4 j& L
    3
    2 G* M1 H6 o/ v/ s40 ?# ^$ e0 M, Q$ x4 a8 ~' M9 u( c
    请求头的作用就是伪装2 \: j; ]- n, N

    5 M0 O: I. ]$ _
    ! F1 B0 E! y/ A
    headers = {
    4 I  w, y7 ^5 c7 G    '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'
    ! A2 b9 {& W. o8 K6 ^  x}4 z9 P8 K3 ]9 U0 M) }: X7 |" A
    1
    9 }8 _- N% M. R1 M0 f9 k2 o2) b+ ?+ u, q$ h. b
    3
    % I1 U7 p; m. W- C# [) H3 Y模拟浏览器对服务器发送请求, 服务器接收到请求之后,确定你没问题 然后会给你返回 response响应体数据
    $ J# h6 d; |1 J5 L1 _函数传参
    / H' G' M# [) E# Z4 `4 Z3 Z+ ]$ S/ w4 y% w5 W* `3 n9 `# R2 r- X: ~8 y
    & ?2 y5 N  a* @/ @* n- ^
    response = requests.get(url=url, headers=headers)
    ! q( B+ |0 a6 p1+ N* s) o) x. q5 I
    <> 对象 对象意味着你可以调用里面的方法或者属性* G0 i" r; Y# o5 j; \9 r7 s% |- Y( D
    200 状态码 请求成功
    0 o  H- u6 O; I. B% o& @获取数据 文本数据
    7 e& g9 B9 G/ E1 m2 d& y  C/ U# H自动识别编码
    % H/ X9 v4 ?# H) h( }9 H: k' U/ ?$ X1 H# J. Z

    , c) o5 A4 P  l( h7 _. Tresponse.encoding = response.apparent_encoding
    8 V1 g9 F1 d; }" H3 G% Ihtml_data = re.findall('<d p=".*?">(.*?)</d>', response.text)& e: Q; f$ w. Q; R; p
    1
    + Y! m1 z' S1 A2
    : R% @5 w8 Q7 K/ N3 P" ycontent_str = ‘\n’.join(html_data)
    9 K+ Y  f" |  \( F2 ?- J3 L. z1 k: b7 P8 y0 t$ N7 _
    ; w; a& i4 ~6 z  P& F
    要列表转成字符串 ‘’.join()
    & _7 ^: E7 S: L3 @9 _3 z, M9 z. Pfor 遍历
    % ~" L7 _  H6 \( n) q" }保存数据 保存字符串
    / T0 \9 h- F2 v) S. xfor content in html_data:6 k5 _8 B0 x0 m  _3 H
        # mode 保存方式 w 写入会覆盖 a 追加写入
    5 ~$ u7 A& h4 _5 b+ ~$ H    with open('弹幕1.txt', mode='a', encoding='utf-8') as f:" e$ F) n7 S8 W+ b  {0 y
            f.write(content)! R4 Z2 Y0 f2 y; w# S' D$ k
            f.write('\n')
    $ z, Q' R- p0 M9 u. [1 {, W7 E0 Q& h' o  n( k" s

    , F' T: n: i( ~) ~! Z- O$ m) {# print(content_str)
    / j; f$ M( ~0 Y/ h2 y% A$ o1
    , Z# D7 E, d" N2% a$ l+ \( n6 n
    37 P( [" y& F* o$ U5 w- `4 _
    4! `4 L2 g& w, j; ~. k" Q
    5
    2 b2 J* I/ H, d  O  X6
    ; z4 C* n% r) R1 e- y7$ ?1 [4 F- Y% G8 i& `6 w4 A) d
    爬取结果
    $ ]4 ]2 c! I! |# G
    ! B% z( C) {* S" ]! @
    2 g& z) ~' l+ R9 `1 i# D+ Y

    ' [+ |; S5 H1 ^9 _9 x8 f

    ! d* I' L5 P  _" L. r. t* C$ t然后我们再来实现制作词云图部分. N! `# X. d0 f% l; O3 l% ?

    # c+ g: W- ~, B1 o" N! p$ L

    - A: G/ w5 R6 W7 T- ^首先要安装这两个模块6 N. X' o, T: g
    * H5 _  b: E. j8 Q, X) P

    : n. r6 {9 o7 Dimport jieba! d0 u$ Y8 ?: e$ {
    import wordcloud
    . R$ f( E- E1 W9 S8 |: w4 c7 B! }1
    ( F# b' S' l2 d! t8 a. R3 @0 s2
    ! N* r, G# u" d2 D: W$ J: I# e一个相对路径 一个绝对路径,保存好的txt文本名字要注意看一下,不对的话,记得改一下保持一致。3 c# f/ J5 x6 w8 N; n; U# e- ?

    * f  `$ @8 y4 m- i

    3 l, y  y" i. [1 [1 ]$ wf = open('弹幕.txt', mode='r', encoding='utf-8')
    8 {( U# B" @! utext = f.read()
    ) f9 p  F& ~- {) y& Btxt_list = jieba.lcut(text)
    ) p" R5 r/ ?. F" n" b# print(txt_list)
    ; b$ ]. |7 Y/ p1
    : T* {' ?/ R' W2 }( k3 c0 l26 B" d. C1 c5 g4 S, y
    3) R5 V0 m" [5 c# }5 v7 Z
    4( k% ^8 [6 Z' z2 x* V& n* N8 i
    列表整合成一个字符串
    8 D! D5 |: K( U' Q2 H5 ~! a8 Q" ?2 ^6 F8 Z

    7 m( E( x# M1 v* x$ a2 h( {string = ' '.join(txt_list)
    8 M/ v9 w( B6 I9 S1 q7 eprint(string)- L$ _# |( }  W. w* B( f
    print('---'*50)$ `# a* H. l! N9 q" y/ t3 b
    print(str(txt_list))+ S$ G- J) z0 N$ {( p& ]/ M
    12 J! _& x# ~, J# K0 ~$ i6 T
    22 n2 D! j2 z% X
    3
    $ U' S; K9 Y/ d8 `5 Q/ E) k0 f49 q! _9 ^9 u' ]* B, P0 Y
    词云图设置
    2 x$ ]6 H2 F( ~0 z, Q& e0 d( W7 ?( l3 ?
    8 r& {0 f; v$ N- N- u9 C" K) f( N
    wc = wordcloud.WordCloud(
    ( z7 R2 ]- Y4 C        width=1000,         # 图片的宽
    9 c: l, N/ L" r6 \  f* {% O; x        height=700,         # 图片的高
    : u  U9 K7 |- e. k! C  e8 E        background_color='white',   # 图片背景颜色' Z% _) P0 d! n7 s% K  a
            font_path='msyh.ttc',    # 词云字体
    ( A+ p) x+ H7 ?! k; x+ U/ S6 L3 }9 T        # mask=py,     # 所使用的词云图片
    6 T+ F! E0 c- D        scale=15,5 q! \8 @/ K/ ?0 i  I- r
            # stopwords={words},         # 停用词9 m. P; F5 f+ r% h# K
            # contour_width=5,8 O" @% @- a+ a- f0 ^  [
            # contour_color='red'  # 轮廓颜色9 q2 ~) n" Q4 G. S; n" U1 T
    ); Q3 N4 z6 D; H+ Z; w7 M
    1
    1 _; a; x$ n' O# `9 P2
    7 j: y. o- w# a7 |# C30 {0 P: E; s7 g( S1 [  _
    4
    7 P: S4 Y5 c" b# [5- j3 @  M  C" R& _" \0 s: C
    6
    # u( L/ H% l- [+ ~3 [7
    9 _: Y3 C* q) E1 B0 U8
    * E+ P# B) E9 i% q& |+ {9
    7 p) ?) S+ q+ N: i10
      e; `$ Z* H8 o/ W& C2 Z( b11& u% H6 B% ~2 \2 ~. S' Q6 i: o2 L
    给词云输入文字
      p5 K+ c! n% i/ ^$ b6 I+ w, B# i( X

    3 y) f! Q: v% |7 E2 Nwc.generate(string)
    , N. E* `' f( S1
    7 L4 a/ D& z( w& y% b% Z% h  S词云图保存图片地址
    " ~, l; L8 Y$ r6 u0 f7 n$ N( e2 L: n( B' {( L& \/ M. q: f% M

    , ?7 e6 k) y0 A+ ^wc.to_file('output1.png')$ i" n/ k0 T! U9 j& k0 E' X9 W
    1
    , Q& ?! c7 [& J1 C' h# d词云图的过程中有点慢,大家不要心急
    6 H3 K! O, u5 O! }* T/ E
    9 K! s; l: n7 _% R  B# D' w6 r8 O

    ) n; e5 N2 I5 O. g0 `% A" G6 w这是最后的结果( T% [- C: t) Y7 N3 t5 {

    , A( ~/ m. M& C$ u# o3 A* |( f. t

    & K6 Y2 S+ C8 W7 T# q没有加停用词,所以一些无用的词比较多
    5 F0 U0 y3 m8 h3 I! V" p, V4 `6 G1 L) P  X. f

    / C# C& K5 T+ `8 k0 Z) q' P+ Dstopwords={'了', '啊'}/ W+ R* F4 p4 t
    17 H8 x. U$ B/ y4 g9 K) S
    把这个部分的代码加入要屏蔽的词就OK了!比如我现在把 了 跟 啊 这两个字屏蔽了。  d; `: W* ?& t. ^  x5 k: |
    我们再来看下
    5 k$ q5 }' T; [% [9 f% k  f" \+ a$ U$ P0 a+ T
    5 }: _0 v+ ~' q+ _
    不知名网友:666666 牛批 老哥我要学!!!
    3 E( n) ]" ^  t. ]" Z6 a. M. a# J0 M5 @% e8 x- N3 V0 s
    % c2 X# U% ?; b& S1 R( Y

    3 }5 O6 U2 F, J; P
    ) {8 P3 B( `+ u6 i5 a/ a8 v  f
    ————————————————
      f1 S1 Z; c3 X3 u! i2 P版权声明:本文为CSDN博主「编程界的泥石流」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。8 {) ~5 s; p- Z  @3 d  |, U  v
    原文链接:https://blog.csdn.net/ooowwq/article/details/119211907
      p  s4 ^! `1 h2 c+ x' |+ w1 I3 H4 W" E- _% X& K0 m. h# I
    ! m5 ~; w# ^! 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-6-14 23:51 , Processed in 0.382041 second(s), 51 queries .

    回顶部