数学建模社区-数学中国

标题: 用Python把B站视频弹幕爬下来,绘制词云图看看大家最关心什么! [打印本页]

作者: 杨利霞    时间: 2021-7-30 16:25
标题: 用Python把B站视频弹幕爬下来,绘制词云图看看大家最关心什么!

" t& I$ _* A; p! Q! k  @用Python把B站视频弹幕爬下来,绘制词云图看看大家最关心什么!
+ e  }$ [8 t0 O1 \8 U3 D. \8 U4 w今天带大家做点好玩的,把B站热门视频弹幕爬下来制作词云图!
& U4 d1 E) @3 r- j$ a$ V; V3 j# |康康大家都怎么说!" c; t" Z/ K! [4 z7 C
- X$ \9 L( d& f# ?* s  b$ B

5 m4 V5 d7 `# U: Z
  l0 C8 f' C! H
* X9 m* U4 A, e) b* P+ V# Q) m
开始之前先给大家啰嗦几句,可能有些兄弟不会安装模块,我大概讲一下。- l% V- R6 v' Z8 z+ l9 A

, p3 I. E, r+ y7 W! c4 t8 d

6 G/ [8 W: x* h1 P7 ^( Y如何安装模块:5 j$ _% U! B! _1 A1 W
- x# a# D' _- x3 N6 x2 I* x% \

: [' `3 \; B$ O2 o5 xwin(键盘左下角ctrl 和 Alt 中间那个键) + R 输入 cmd 输入安装命令: pip install 模块名 回车
* ?5 t# O) w; f% H+ H6 Wpycharm里面安装 terminal 输入安装命令: pip install 模块名 回车
& N! k. Y7 }; m0 M$ y4 Y1 @8 n0 {如果模块安装失败了,可能是这些问题:: C! M5 b, A4 P7 [* ]

# ~- A' W% r0 b5 q$ Q( x8 y

9 v, Z$ s: y; p& ?/ S& W提示:pip 不是内部命令, x* y( V* ^0 C
你python环境变量可能没有设置好) a! E5 ?* i7 U* Z$ A$ g
有安装进度条显示,但是安装到一半出现报错了5 u5 B- m" [  \7 S+ \
因为python安装模块都是在国外的网址进行下载安装的, 国内请求国外 网速很慢,下载速度大概只有 几KB6 ~$ b' K2 ^: r, e7 h( n9 k
read time out 网络连接超时 你可以切换为国内的镜像源
- D- N2 V1 }- n明明在cmd里面安装好了,但是在pycharm 提示我没有这个模块
0 u9 l. q* y- j" m, E4 g4 _你pycharm里面python解释器没有设置,你在pycharm设置里面重新设置一下& X; {: n% O/ C/ Y6 k
可能安装了多个python版本  b5 a! c( B1 a
安装一个版本即可
: z' ]. V% n' h5 k2 ?2 ePython做爬虫到底可以做些什么呢?+ F8 G) K6 r5 h1 H, h1 o$ m  g

6 L1 |8 t/ |9 `" N6 `: o
; Q* j8 ?  L% P: n- i
常规: 爬取网上的数据 / 我可以批量下载图片/文字/音频 视频…
  F0 n2 u0 p: h0 d8 Q. Z3 l12306抢票 / 京东商城电商网站抢购脚本 / 朋友圈刷票 / 一些问卷调查自动填写… / 文章刷阅读量 / 音频 视频 播放量
' x/ H2 u- ~$ L% m2 r" b可以刷课 可以刷网课 自动 还能自动批量注册账号2 n% D: g" i5 x  z" x* H% V* K
模拟点击 >>> 游戏辅助 >>> 修改游戏内存(单机) …
% R, {4 t  L1 H: |普通B站视频可以爬 番剧是需要会员的
% A+ @+ @  a0 g  @" w. v+ y2 l/ d0 {$ e0 q- |
3 g" O$ g3 D$ h2 V* w! I
爬虫都是通过开发者工具进行抓包分析 查询数据来源 ( 静态页面 / 动态页面 ajax异步加载)
* A$ o" @( i+ ^. U6 |( j
+ j4 r1 _+ P4 s, b# v; P5 W/ W5 D
5 ], e) U9 q) z3 v5 W
1. 确定目标需求 (弹幕数据 那个视频弹幕)3 `# h( w% b) S/ m2 U
    确定了, t9 \5 ?- S& ~0 O: C
2. 找数据 (数据的来源分析)
- r7 F' |" C  ~9 M( n$ a  u3 n    简简单单 找到了
4 s) y4 Q* B& U' K  K0 h3. 对于数据来源的url地址 发送请求 (请求方式 / 请求头)% i8 W3 n( k6 K) V+ F4 F
    请求方式: get / post% v  g8 H# F# C, g' o& L/ \
    请求头: - ^" Q0 T4 U. H& J9 Y$ j2 x
    https://api.bilibili.com/x/v1/dm/list.so?oid=376200196
/ J$ X9 E" V8 g; U5 Q; j    (通过开发者工具去看一下数据的具体来源,是否是来自有这个网站)
* h/ M* u% V- k4. 获取数据
! E. V0 [; K  }    文本数据 response.text 获取网页源代码
4 a1 _8 X9 J4 H5 J) |6 p5 M2 I    json字典数据 response.json() 通常一般情况是 动态网页  ajax异步加载 用的比较多/ b$ g" C5 v- ?
    二进制数据   response.content  保存图片 音频 视频 或者 特定格式文件
  B9 Y( b# `- |* i5. 解析数据7 K' t1 }. I1 P$ @2 b
    正则表达式 .*? 解决一切  遇事不决 .*? 通配符 可以匹配任意字符
/ N) [6 r: f, D0 f6. 保存数据
' t) G0 i( p; g! h, R& P1
" j/ O: m# M( ?4 g- M1 d' ~6 \23 K/ O- P* a+ g0 n! o! X
3
3 ?9 u2 m2 O: {3 x; n5 T47 ~: p" V: b% N/ [
5
* H( b* o* ~6 D) V65 M& E! b2 j4 F" e9 W3 v8 O) l
7
+ v1 B0 x% {# N% X2 b6 r9 L: X8& p4 q/ _" O4 W& U/ E/ f7 b! S
9( p- K8 A5 p1 b2 I+ ?
10
8 w! n- _7 H1 X4 p4 ?+ |11) s, i" p8 L* S2 }
12& l2 a% Q: Z' M% L5 l
13
% z9 M2 n0 s( P$ J6 w14$ i  D0 S; M; d! d- U8 M
15
- p3 y2 x6 L2 L  V. h( t- k8 Y+ _2 ]16
  C. m" E0 a0 n- zpython除了做爬虫数据采集,还可以做什么?
& g  v: Z: `0 s( U兴趣学习 还是 通过python技术赚钱 (就业找工作 / 外包)
7 `0 m) \  o$ w7 `9 W
2 u( \+ n& I, _" y) N7 l/ y6 J- g
& C: @( k* |. _0 X( e" f+ j* M; }
网站开发(就业/外包) >>> 我们课程是教授的全栈开发 薪资 13K-15K
8 Y& K4 C' M1 k1 f比如: python开发网站: Youtobe / 豆瓣 / 知乎(以前版本) / Facebook / 美团 ;
0 D' d: f: j3 `( q, Z我可以做到这样么?
/ q5 ~0 ]# {" Y6 n; g" I6 ~0基础 初学者 从零开始学习,上线 通过 域名 服务器 数据交互,4个左右的时间 就可以独立开发这个项目 类似知乎的网站;
3 K) ?5 y/ \8 _8 k如果你做去外包(团队): python开发就业 大多数也是进入外包公司 一个 10-20K左右;
0 j, |7 i8 G4 ]/ b8 \. h! a/ q8 R- [
6 p" ?! E" B. b9 f) d) @: v

1 e" v9 w8 n# m4 r爬虫开发(脚本)(就业/外包) 可见即可爬
8 O8 t' E2 n% t7 J$ C虽然爬虫什么都可以爬,但是获取用户的个人隐私(信息 电话 身份 贩卖 )、国家信息、商业机密(未公开数据,或侵犯版权)、色情等违法信息用来盈利,就基本上人无了!# {4 v) I# w! E; t  ?2 I% W& s
很多兄弟问我,可以帮我淘宝用户数据吗? 我都是告诉他们,这个我还想多活几年,这玩意涉及隐私,个人信息,你可以自己学了悄悄爬,爬完记得删了,用来实践问题不大,但是别用来盈利!!!
1 b  b5 ~- W5 }" j7 [/ C; p之前有个兄弟爬取微博上面军事武器航母图片买给国外, 然后就进去了!所以奉劝大家,切记切记,别乱来!; m9 L1 Y) }, n* x5 z3 A. F
8 ]& D, ?0 i: A7 [# L

+ D6 E' g+ l+ }+ j* F5 I4 H( u数据分析(就业/外包)
# l3 P7 K% t0 |/ Q$ ~+ D; g! ~6 W4 c* l$ Y
4 T% }$ a& C4 P& H& U' E. r' c2 F
自动化(脚本)# N$ o+ z- d; `# y# s! Y% H

2 o; h+ Y/ l6 b' c& D
7 [* c4 Q! d2 h- m9 g2 _2 j' \
游戏开发/辅助(脚本)- Q( @# e3 M. a" M4 ]; w5 \1 `  ?& c

9 A  K1 t4 G7 u* P
( F9 g$ `) C- G8 o
人工智能(研究生以上学历 要求很高)
1 y1 I# g$ @$ Q: A  z3 @7 f
! R  [0 D1 ?! h& p+ ~& }
8 L0 D1 @/ O) @  R; s7 f
等等方向还有很多,我就不一 一述说了,那些方向对于一般人来说作用不大。
$ u4 u7 I4 f/ V) }" l* T! q
) ^: u2 O/ m, ?( U( E

! t& _* @5 P7 `  g4 T我们开始正题吧- l& q" ^" a# s! p

4 o. U5 s: \- C/ {" D
) y% x- v( D" b7 v1 X
爬虫部分:! `: P. A5 y' k" h- w
发送请求 第三方模块 需要pip install requests2 m- A: w. A' ?: v8 P7 S3 d) y" b

( H- P# ~. G/ f% m6 |

5 U; s  j  z$ `( c3 \4 Rimport requests
) ?" B) ~6 B) F- L% ~3 n, y0 m" Yimport re  # 内置模块! n! ^# f$ l% X5 Q' V( g& _
% W7 ~' {" u2 L
8 Y8 u1 O( i" b1 N
url = 'https://api.bilibili.com/x/v1/dm/list.so?oid=376200196'  @2 e% z1 D' g" }* E& S$ [" m
1: D& b+ N8 z0 L
2, U5 `9 U1 l2 u
3
9 W, |7 X! e# Q! ]( L) y, C+ c4( C! ~# D; |1 z6 w+ ]
请求头的作用就是伪装
2 H3 m. \3 x% m8 a- a$ U2 b# r& j$ j8 \! w) B7 C. K9 i. G) d  A

2 X- ?0 [. g: |0 Qheaders = {& d2 |- R3 ~2 `. w7 I8 }8 [
    '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'
& q* Q5 a# W9 R2 d2 \}$ W# P6 |$ U: e
1
7 M( p8 w0 \4 J% I2
6 W' _7 R. p6 @, N3
( c) C, p$ |! @模拟浏览器对服务器发送请求, 服务器接收到请求之后,确定你没问题 然后会给你返回 response响应体数据
3 L/ U9 j: x# p, R9 C, }+ L1 G# J4 C函数传参$ ?2 o2 Y/ u: f, h" l% I

0 f( u& L. v( c  s6 _3 o

& ]/ B3 H; ?5 Mresponse = requests.get(url=url, headers=headers): Z& @; g- ^' i# C/ u% Q  b
1
3 Y& v! ~4 i( Q( X/ ?5 D<> 对象 对象意味着你可以调用里面的方法或者属性$ y$ h3 E( F% v* \6 O
200 状态码 请求成功
% B5 M: @5 S* o/ l获取数据 文本数据
# W3 R$ w8 Z- C0 `6 \) ~9 O% ~9 }自动识别编码0 E0 \) V5 J2 g0 [  Y  v0 b$ u; i

  y% O0 E( W1 y1 ?. M) b

! ]3 {* N6 W* ^) ?1 ]: C3 ?response.encoding = response.apparent_encoding
9 m7 N& d$ a; m! w  Q1 N4 Y3 G( Ehtml_data = re.findall('<d p=".*?">(.*?)</d>', response.text)
( r! z- q0 U, h) Z" G1
3 M% B, a% Z0 Y' T0 S5 R2
3 b- G8 p6 X  \+ X# a3 }" z5 vcontent_str = ‘\n’.join(html_data)
3 r* }1 [0 W- G) v' h$ H" ]2 i* J  O4 w. A2 n6 d& _8 ]

% W/ s, u, |/ z' ~! Z要列表转成字符串 ‘’.join(). o, p. X2 J5 ~( p+ M7 J
for 遍历, d* R, P2 F5 m* V
保存数据 保存字符串
# x# S+ ?- D8 u- v& r0 }. Ofor content in html_data:
' n: Y2 m$ D) r: U  x. \% |    # mode 保存方式 w 写入会覆盖 a 追加写入6 g# z, ~2 T+ h! b
    with open('弹幕1.txt', mode='a', encoding='utf-8') as f:4 Y/ [, r$ n( b. y
        f.write(content)  Z! R2 D" m, K5 Y! L# J0 G
        f.write('\n')5 ~+ n+ H2 E8 a6 B

4 T9 b( T- ^8 ]) M* v; o2 i+ r

4 X) s, o) Z1 |) r# ^5 F1 O# print(content_str)
' s  T( a; @: s, L/ _- y6 s( d1
4 C# c7 M5 H8 ~9 t. g$ g2
( Z5 w# }5 V$ H" S3! B( B, h  q8 |  G6 ^4 c2 |
4
9 }7 h2 p* [& T) Q8 I5
) e1 k6 ~, O1 [: s# j9 ?6
3 X& Q( a+ l: z- S' C: f75 b/ _5 I) o7 t; {" G& W! f
爬取结果
& p2 ~2 T, ]* z9 e0 q: g) D& {* _% B9 F' x
8 I6 ~3 |) X7 H. [2 X
' Z' Z5 F4 O4 X* W1 `
$ r* u: S9 {  ?' b8 @
然后我们再来实现制作词云图部分  s; E; `% g8 B" H/ i0 R0 b! J
9 z( q" ]; |' J8 G% J/ q, `
7 Z" n9 F! L! @% H" m- [! b
首先要安装这两个模块  h) s. }4 E' i. X1 U+ m6 ~" |! R
/ ~! f8 e: c, ^% F) ~

& W4 K& Y/ H  y) w* N. f& Gimport jieba
" p4 Z) m" R1 d/ P+ U- zimport wordcloud7 h% V! q8 b3 _+ {# Q
1
% a- D9 P' I( B  m9 S  ^# _2: v- A. I8 M+ \
一个相对路径 一个绝对路径,保存好的txt文本名字要注意看一下,不对的话,记得改一下保持一致。
, G9 j  d( ?7 w4 N% ]
+ V5 L& D/ u/ O; o8 K

5 L) X+ n, i. S8 J5 f9 rf = open('弹幕.txt', mode='r', encoding='utf-8'). {- t# d6 j3 Z! k
text = f.read()
2 l: T; P) O- I' R2 Ltxt_list = jieba.lcut(text)
' A$ ^# C4 U/ ]- R# print(txt_list)
% X7 r: @3 D/ P) Z" F6 B. k/ n1
0 C0 H- I! Z, y- v- W: g0 Q2& L; l7 @9 c8 H
3
3 `  C  i% W2 k. h2 d% K9 K49 h* \" x% ?' T: D" u8 y
列表整合成一个字符串; D- L' f- h+ u' U+ h/ h2 Z
1 F  f5 S; V* i5 p

6 j9 b( @& H' \4 f& e# ~; K- Nstring = ' '.join(txt_list)2 k9 @4 q; v+ k8 v4 v6 \
print(string)
' }* i. ~+ _1 }$ J% B+ [4 Vprint('---'*50)8 {' P$ [& Q7 e6 m$ m
print(str(txt_list))  N" l  @7 p5 b" k
1+ d% |6 }5 {0 G  X- r  ]3 b
2$ T! j- i, U( r& A4 V  K( `+ o. N
3
9 {9 v( ~9 }8 p. }" N: t4) l4 Z, S: V$ U6 E
词云图设置9 a& S1 h' V8 |$ z4 i7 u1 A
, h; `- J7 r# {9 j/ o
& [+ n8 h3 I3 v: a9 \  S' p
wc = wordcloud.WordCloud(
; _3 B3 ^4 u  J6 {        width=1000,         # 图片的宽
9 {7 l4 p& D; Q+ U( ?. q  N        height=700,         # 图片的高5 }5 l5 h( j! w" B: [( o
        background_color='white',   # 图片背景颜色
8 y6 S+ C; z' L0 ^0 E" L& J        font_path='msyh.ttc',    # 词云字体8 B1 n% A# B" l6 A
        # mask=py,     # 所使用的词云图片4 {, M7 w# b& n( @+ W5 P( C  o
        scale=15," g0 z3 M' Q1 {: V+ d. J4 a" U
        # stopwords={words},         # 停用词; ~1 c1 U4 \8 K  E0 c
        # contour_width=5,
4 ?$ X/ N  X# m+ E( |        # contour_color='red'  # 轮廓颜色
2 m6 S% v) e0 e* J& F)# i7 f8 u, @. U; f
1) O6 b& j8 I2 O+ `1 @
2# N6 T. ]% r; h- [# z6 o
3' D% u" C8 @$ I: }; [3 z% p
49 B/ c3 ]$ x5 H3 l' H: X# J
51 k% b1 h( ^3 k
6
5 |& j0 d8 u- @9 o5 l7$ @6 J# @1 z7 V9 Y
86 @' A8 v8 N/ U' s, E
9
  B. ~/ y$ L1 o0 g8 |* A9 \10: c* K6 x1 P' {, d
11
6 Z) Y/ Y% o% e% B$ @' p给词云输入文字9 o6 y. i, t9 v/ _( [. G( P
# D9 ]  U  @/ Y
$ \- R9 l& w( v* D; v0 O$ _9 N
wc.generate(string)
2 J* y, ~6 c6 U$ Y10 L/ B7 E" W2 E0 w8 m
词云图保存图片地址- n- F9 b* ?; r
1 j; o$ R& [( L$ d9 K
% O; L) Y) ]' l" {' C, z
wc.to_file('output1.png')
5 r& z- W( V  a" o9 i' T# m1
" t+ {% O( _2 t4 o5 C词云图的过程中有点慢,大家不要心急
: L  a6 u' v' G+ t# L& K4 h2 ~9 t3 q) U0 Y4 _0 R  d9 s+ Q5 V7 h4 w: O2 n: j
8 K( P7 Z. m2 N+ e
这是最后的结果
7 l9 t7 v; F& R$ k
  X# Z. R' Z5 J! k: D. h8 Q" a

& Y  U5 H) [) U. K+ E- f( l没有加停用词,所以一些无用的词比较多
% e/ u+ g  h. S+ _+ Q7 R/ \; Y7 r% O- [, n# n& I& k
7 T' i/ F3 O  r& C, R+ d
stopwords={'了', '啊'}/ J% i. Y& i1 o1 I5 ]
1
: K0 G9 i; J/ U3 {# ?% d0 r1 r3 |把这个部分的代码加入要屏蔽的词就OK了!比如我现在把 了 跟 啊 这两个字屏蔽了。3 u$ R4 m7 i# }0 ~, d0 Q; h
我们再来看下! j( _! q  ^* ^1 r( b' D4 W# R6 ^
) q0 V8 b* a0 |9 c3 e; K" d

5 w, }6 K+ X- _) f- b. O8 }  w% C, S不知名网友:666666 牛批 老哥我要学!!!
$ v" n1 e  l8 `! Y& i# b
& \4 \/ p" Q  q3 ]; _  V

4 n8 K! l7 A6 z# _" o
# y' l8 C: v0 e- o! n! }: C  V0 r9 H
/ D+ y5 j2 A- D0 S8 T
————————————————' c! R, n9 n) |5 ?
版权声明:本文为CSDN博主「编程界的泥石流」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
0 R. D5 r" |& W% E+ o  ?) F, }% U原文链接:https://blog.csdn.net/ooowwq/article/details/119211907
4 A% h+ y) t7 p1 R8 F, i  s
( A2 k& i, I" H' X1 Y& G2 U
) m7 M* Y, f' I9 x: m4 F- D




欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5