数学建模社区-数学中国

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

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

! [8 |; |% v& t5 G. [. O3 E* z& z用Python把B站视频弹幕爬下来,绘制词云图看看大家最关心什么!1 D8 R2 S6 c7 P
今天带大家做点好玩的,把B站热门视频弹幕爬下来制作词云图!, y. ?4 s, t+ _
康康大家都怎么说!  X/ b# M9 s* `1 e4 w6 x

/ t' F8 ^! [% M

2 {8 H/ t$ Z) S+ o, g: b3 ^  B- V
! Y. R% k" i) }3 ?) P/ Z
2 z* Z0 H/ z! o
开始之前先给大家啰嗦几句,可能有些兄弟不会安装模块,我大概讲一下。
/ @" E7 D9 m6 G) M, W# J& U
/ h- k* ?0 K- ~

. k5 e0 _2 ^: @/ r% Y; s5 S7 H如何安装模块:
2 n: T. t4 `, `3 V: \9 p/ x
: O- ]5 l6 X( ~4 S! g

6 @4 ^: S6 F2 J+ }0 @/ d& `% p) Bwin(键盘左下角ctrl 和 Alt 中间那个键) + R 输入 cmd 输入安装命令: pip install 模块名 回车
! [3 H' F- C- a) J: |  }pycharm里面安装 terminal 输入安装命令: pip install 模块名 回车
3 ^6 X1 M/ O4 n/ b, |" p) K如果模块安装失败了,可能是这些问题:
2 v/ g$ l5 O! j/ ~0 m. e4 V1 I
' b& @2 [# O. H! y
% t2 K; w& I/ H
提示:pip 不是内部命令
' R, i6 l. g- [  c( M/ r8 _3 ~你python环境变量可能没有设置好
% s6 |* n/ s5 e, K/ i: X有安装进度条显示,但是安装到一半出现报错了
" g$ C7 z: o5 I8 {因为python安装模块都是在国外的网址进行下载安装的, 国内请求国外 网速很慢,下载速度大概只有 几KB! D$ |# d+ I  [" o- G5 j
read time out 网络连接超时 你可以切换为国内的镜像源
$ F* r7 S0 J+ x% V: j! R. a# f明明在cmd里面安装好了,但是在pycharm 提示我没有这个模块
# c2 W! y: W* s% n+ v你pycharm里面python解释器没有设置,你在pycharm设置里面重新设置一下* P7 |, y* P) Z" G
可能安装了多个python版本! [. ^- M4 ?& n. ]6 T7 _$ b% O1 Z& @
安装一个版本即可
+ u/ [2 ?+ S2 J- W% v7 ~2 EPython做爬虫到底可以做些什么呢?; `; T. `" z6 U' g3 y, L, _2 Q
) P+ s4 I8 z' ]- }
/ n  v  c6 C0 \" m3 d: K
常规: 爬取网上的数据 / 我可以批量下载图片/文字/音频 视频…0 L" X- q$ U& n5 W6 F& L: D0 o
12306抢票 / 京东商城电商网站抢购脚本 / 朋友圈刷票 / 一些问卷调查自动填写… / 文章刷阅读量 / 音频 视频 播放量& `9 `  w% M) s* _  T2 x" e
可以刷课 可以刷网课 自动 还能自动批量注册账号* x9 N* N0 }( x# |4 x: v6 e5 P
模拟点击 >>> 游戏辅助 >>> 修改游戏内存(单机) …
2 ^; S( T& A8 Q/ E8 B# \普通B站视频可以爬 番剧是需要会员的) R$ r+ |' M7 q$ f$ d- u5 E8 I2 G
9 j8 d; b# ]% H* J
! D: k6 s4 ^2 x
爬虫都是通过开发者工具进行抓包分析 查询数据来源 ( 静态页面 / 动态页面 ajax异步加载)" ^9 G7 W& G  D8 D1 [0 [
4 N# g1 s% q( C  K  E- p# _

/ Z: F* C/ ^9 ]8 j  d' z% S1. 确定目标需求 (弹幕数据 那个视频弹幕)
$ }3 L- [+ D  x7 Q' B8 n9 j    确定了
( \% a! I3 a7 J4 J. `  ~+ ^2. 找数据 (数据的来源分析)
( W7 u- Q2 g1 `6 B4 ~5 F    简简单单 找到了
2 K; }7 U+ T8 j4 G% u  a" E; S3. 对于数据来源的url地址 发送请求 (请求方式 / 请求头)
" X5 a1 _3 W7 }$ p! A1 w  F$ C    请求方式: get / post& H9 A* X& I; s1 c2 K* C
    请求头:
5 v& A" r; g: x2 o2 `0 E6 q    https://api.bilibili.com/x/v1/dm/list.so?oid=376200196. `7 t* @9 z0 j; Z- F
    (通过开发者工具去看一下数据的具体来源,是否是来自有这个网站)
8 @' V) ]/ j8 M: f2 f4. 获取数据
1 a) K. X" V( }/ V, w    文本数据 response.text 获取网页源代码+ z3 N6 J& F3 H3 e
    json字典数据 response.json() 通常一般情况是 动态网页  ajax异步加载 用的比较多+ _, |  z, N& c& a, C
    二进制数据   response.content  保存图片 音频 视频 或者 特定格式文件
; |0 \, ~8 ~1 [: Y- a5. 解析数据& K6 J: w3 T% u' l
    正则表达式 .*? 解决一切  遇事不决 .*? 通配符 可以匹配任意字符
' ?' j5 N% u% H9 m6. 保存数据9 B/ p3 J1 g5 d) W# Z5 Y$ \3 n5 x
1
! g0 \. ]: H9 n) r3 h2
& E. C+ d+ _$ k5 f9 m* F3
% Q2 I7 |( \5 L. [4
; Y% B! ?- P, T: ^  y5( H/ B& p. H! F4 \5 |7 p" T
6
: c: W5 R8 N- M1 N7
( k0 y3 g. F! i6 _" e  t8
' ?8 ^- F8 \. U$ v0 v9 R9
) w2 y" j/ z" }. e. U8 M10
. @+ q( a; X. Y6 n7 J3 a11
; \3 e/ d! q2 p+ e8 ]' e7 d/ P12* l( a3 J: p/ P  h7 ~  e
137 j  n: \4 |* c' T+ m) }0 O+ r& }
14" Z' v7 G1 p8 p8 `
15
2 B8 A/ \4 U$ c& H8 g$ \( S16. G1 T6 T8 O5 ~0 a% C0 ?
python除了做爬虫数据采集,还可以做什么?* W: l% T$ k7 A  {9 b9 X2 [( S
兴趣学习 还是 通过python技术赚钱 (就业找工作 / 外包)
8 u  p/ r; \- l
% G5 Y6 I2 a0 g9 o$ _2 Q8 o5 k: v

; g7 j  E% ?" ?" b0 `5 @网站开发(就业/外包) >>> 我们课程是教授的全栈开发 薪资 13K-15K
7 K9 N6 @: ?+ [0 L: f" I比如: python开发网站: Youtobe / 豆瓣 / 知乎(以前版本) / Facebook / 美团 ;1 K9 Y- g1 I' g  p7 _
我可以做到这样么?
7 a$ ]% H, ^) a1 o6 |1 d0基础 初学者 从零开始学习,上线 通过 域名 服务器 数据交互,4个左右的时间 就可以独立开发这个项目 类似知乎的网站;: S; M2 o7 F( X- l& M! P
如果你做去外包(团队): python开发就业 大多数也是进入外包公司 一个 10-20K左右;
1 o/ ~1 }# ]2 J9 x- x
! {6 i( H* q- Q5 }2 r- Z
8 z7 r1 j! V: J  S7 ~  i( I% f
爬虫开发(脚本)(就业/外包) 可见即可爬
5 c0 j9 J+ e9 l$ I" v9 i; y虽然爬虫什么都可以爬,但是获取用户的个人隐私(信息 电话 身份 贩卖 )、国家信息、商业机密(未公开数据,或侵犯版权)、色情等违法信息用来盈利,就基本上人无了!
" t) p$ s0 E, H5 t很多兄弟问我,可以帮我淘宝用户数据吗? 我都是告诉他们,这个我还想多活几年,这玩意涉及隐私,个人信息,你可以自己学了悄悄爬,爬完记得删了,用来实践问题不大,但是别用来盈利!!!" P; ^# x7 r4 T- U
之前有个兄弟爬取微博上面军事武器航母图片买给国外, 然后就进去了!所以奉劝大家,切记切记,别乱来!% f3 K+ b1 s- Z9 M! k5 {; d- W
) k9 v2 }. v8 R' @
, h8 ~6 g+ C+ D4 E+ F. g$ d0 s6 \
数据分析(就业/外包)
% K* d' S- j  R0 W: S
% H. k" e' ]! u& d7 g! w

8 q4 M# r+ F! ^, c& }自动化(脚本)* ^& n/ A* _  F3 G) F, N

4 T" S/ \. T, g: v' k
; b; `  J( C) v$ M
游戏开发/辅助(脚本)
$ S" Y9 }2 @' ?7 q1 \: h
& }$ c/ G. O4 X: P6 ]

5 o) Y) M5 B: d$ r9 u人工智能(研究生以上学历 要求很高)- |+ U/ D: R+ G2 c: b3 `
; d) L3 u% K2 X7 z) G

* s8 s6 j1 K" C& s等等方向还有很多,我就不一 一述说了,那些方向对于一般人来说作用不大。
' V/ W1 \4 g' l  Q/ O, A( Z' ]; c$ G. J* x

8 T+ c  _! c4 C0 E/ W/ G8 H我们开始正题吧
3 j+ Z- v( E) m% M/ V" n, t
, n* l. M6 P& t3 P( F# |- J9 P6 G

$ A. Y) m4 l4 n  s) T9 l! _" t爬虫部分:
: B; t6 [* g( `' [& F/ W发送请求 第三方模块 需要pip install requests/ [" Q: ]4 K# u1 c- @; D$ ~
2 W) Z7 w6 Q7 d" P

6 @( z% B' U" ?import requests
9 L0 q+ t$ A( f* fimport re  # 内置模块1 h9 s  e: {2 `0 e# Y3 N
9 z' U$ P5 O+ Y8 K
7 a: X- E8 s* N% H
url = 'https://api.bilibili.com/x/v1/dm/list.so?oid=376200196'
/ Y+ e! q2 O) g# M1 \9 Q1" A9 X* U8 v: u3 Q+ D- T
2
1 Q% E6 D$ i# E/ c7 }3
% r$ v; X4 O6 c) [: v4
9 y. J" O% \' T* S请求头的作用就是伪装
/ b- {" V5 C6 w9 |: U0 T/ o2 A! G  S

7 A5 a$ J( H. Z) g! o! J* fheaders = {$ ?) S) o; |: w
    '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'8 U: Z0 O& |/ J# A
}
9 ^2 }4 L/ w; u1
* p9 _2 j. g. v* v2+ I$ E* n6 Y/ @! H! Q( D5 A5 B
30 h% K0 O( o% ?% A
模拟浏览器对服务器发送请求, 服务器接收到请求之后,确定你没问题 然后会给你返回 response响应体数据4 x5 N9 g4 Z" \: e# h
函数传参9 s* l2 N0 R/ J" j3 R
" }+ c$ F" x. q0 {. J# `& c* g
! ]4 [# |+ D( n* \+ }' H& c  Q, X
response = requests.get(url=url, headers=headers)# v! W. a& r7 S. D6 V
1
. h' v5 w3 E+ r" j: Z<> 对象 对象意味着你可以调用里面的方法或者属性
3 I8 m5 f3 v. \200 状态码 请求成功
7 P3 }; d, R( F1 n获取数据 文本数据' W8 t# [6 @; A6 q4 J' I  ]
自动识别编码+ n. u& e( z% X, k4 @+ u" D
+ L" u  Y+ F, F# [! U2 }

4 Z  m+ H5 `, }9 T1 {response.encoding = response.apparent_encoding
( r& b  `5 b: J' [9 e3 s2 whtml_data = re.findall('<d p=".*?">(.*?)</d>', response.text)( r4 L/ z, D$ G/ U0 S8 t$ |/ b
1" e4 {6 w( ?  B2 z/ D8 d8 N. g
2$ X1 @3 r/ w% _1 b8 W
content_str = ‘\n’.join(html_data)
+ F& L% K! W6 D
- M! f" `3 ]( n3 g- }

, t4 \, I7 Z0 G; e要列表转成字符串 ‘’.join()  C0 W) w: L+ ], n
for 遍历
6 T+ R2 c) D4 T保存数据 保存字符串2 e( O! M4 }4 h  U1 _9 l4 o
for content in html_data:* p% l' J2 R6 [3 J: p! v
    # mode 保存方式 w 写入会覆盖 a 追加写入
4 k+ S* `) K8 I2 S3 S    with open('弹幕1.txt', mode='a', encoding='utf-8') as f:
0 \8 N/ R9 P/ a4 I" D5 Y        f.write(content)' n0 m; Q. B2 y5 W7 h
        f.write('\n')5 @0 W$ N+ Z8 f7 z# h$ }
# Z6 j  c6 H8 N9 g6 Q
4 J; O5 c6 g7 f6 L& K: l) _5 v/ i
# print(content_str)3 c- w( s0 G, P( ~5 `
10 x; Y9 B  l+ H8 n; P
2
0 q% G% K: G2 X* x3
9 K$ W, ?% {2 i% h/ V' T8 u3 h49 b4 Z+ M$ X/ v. _3 H4 A$ T3 t
5
* I' o6 r# L2 Z: d; r6
- \9 q/ L& ?* _' r7
5 i! f4 v6 b' K1 [/ ~爬取结果
) L# X7 J0 o$ r) {8 @! f! L3 }8 l$ V7 f9 J- |/ F
2 W4 j" L7 c! J0 l: q/ a

% e/ o3 R" Q3 f% v4 D* t
3 }0 H8 C' {5 U9 l
然后我们再来实现制作词云图部分# i+ [7 v- \  n( H6 {
  L3 S0 N; `/ J$ ^
* n! Q3 z. I' _: D
首先要安装这两个模块# A/ ~# m( F7 t6 E/ r

: d: P5 S, M% l0 ?
+ _- i- x) u' b5 P
import jieba0 j5 z3 S' J% F1 O6 B3 |! n
import wordcloud
  ?: }! I# E/ @) o! L$ N1
7 W% ~8 `7 y& F# I5 O  H' @, T2. E5 @2 o0 Y- j. ?
一个相对路径 一个绝对路径,保存好的txt文本名字要注意看一下,不对的话,记得改一下保持一致。4 ]$ Y" s1 `* N0 H6 d8 c
( F9 P. D7 n9 y

  Y4 u5 P( `. Z0 {$ M) x! {7 A: af = open('弹幕.txt', mode='r', encoding='utf-8')
5 j4 |/ X8 |9 h" M" J# mtext = f.read()
- K- A2 @3 M0 W2 q- j2 _txt_list = jieba.lcut(text)1 o6 c0 b& @$ Z& ?* ^/ W* M
# print(txt_list)
3 U  `6 H' ?" \" E1
" j: k% E" y4 y2
( C  e/ z- n1 `) j6 T3
9 T7 c& N7 n( D& m4
. m6 O: n7 C$ O9 z列表整合成一个字符串* _2 g6 i3 m( f) o4 @: z# B. N

9 I$ W; D+ R1 a) A; g

/ e8 a% j2 M1 c6 a6 X9 F4 |" xstring = ' '.join(txt_list)
; v4 S5 E8 F: N" W7 u6 p. k  h9 kprint(string)$ w  X# ]/ J* ]) u
print('---'*50)
( `* y7 m, \6 r8 o' P% W" Xprint(str(txt_list))
1 l# N% k: |. r: [# p2 T8 t7 y6 u1 M1" H% `3 X) G+ P2 m8 ~: p: {) I+ p
2* Z' ~2 ]/ i9 J
3  `" V3 d4 N" n& K4 P
4
0 T: @% E6 F: n词云图设置6 \- r: J" J; y! f' g- u7 k
& `5 B* ~. {% I4 }* I4 `

" H7 K6 N$ w3 f) Pwc = wordcloud.WordCloud(2 g' X2 K3 b" W/ e/ W
        width=1000,         # 图片的宽0 s8 y8 S  Z0 ^) Z
        height=700,         # 图片的高) q# G; h7 G- [" D! t" q4 {
        background_color='white',   # 图片背景颜色
- f, D" |$ ~6 {, Z/ v7 \' ^        font_path='msyh.ttc',    # 词云字体9 Q3 B! x+ Y/ b0 w. e9 K
        # mask=py,     # 所使用的词云图片
3 M. l' k0 k1 S: M- V! F% J! _        scale=15,
, O& ?' A& o) P- E" c6 u        # stopwords={words},         # 停用词
' i0 t& u, d4 K! @" ^) \        # contour_width=5,0 i% M9 H% A" z6 g! R8 l6 m; _6 Z$ _
        # contour_color='red'  # 轮廓颜色
' U! s6 l* w9 x)1 C* G- Y) M& |8 |
1
1 u7 B6 M- s& N6 S1 `5 j* q2 [2
" f9 x4 N9 H9 {, C: L! [3
& G% m# A" l! F$ u0 a/ ^0 U8 Z( e4 `44 ^4 b2 T% k0 G% V
56 I# S2 N1 O( y# {2 b0 `; d7 |
6
% e- ^% c6 i* n2 n0 c  p7
, E, k5 V5 s8 l4 m9 b8
5 s% q7 M7 \. e9+ |' m( S1 K+ b0 ^" v
105 z, |) [) s* H( E( i( k5 |
118 P( {' ~5 B: [* k. }
给词云输入文字
3 N# g, c; l0 L, v2 G" _9 V' c5 M: q

0 b$ X, h' Z( S1 Wwc.generate(string)
5 e9 _) e2 S) R% L! @9 k, z! g1- B" r" j! Y  v
词云图保存图片地址- c2 l+ V) i* F  V, O; @# }, h

5 ~+ i4 l: D+ }3 ^5 `0 `% w

" `: n+ P) R( Qwc.to_file('output1.png')4 m0 s) |, c) J- P
1; G7 M- t, C; C
词云图的过程中有点慢,大家不要心急1 ?, y) J4 a- w& |9 r' Y

1 K% J. m. c+ U% W
) e7 _0 D4 D# {  B& e5 a7 M5 g9 o
这是最后的结果3 K  ?9 t! A7 `4 P9 }; @
8 x7 `$ _. I0 S' a

$ e$ `& W6 w: f; l- c没有加停用词,所以一些无用的词比较多
- c" G2 O1 ~1 i* ~7 T: ]5 c! F! P# j, o( d
1 a3 O9 `% c2 X: R
stopwords={'了', '啊'}' Q- G! }& V& d) F& E
1
# k! j) ~8 {8 M" m把这个部分的代码加入要屏蔽的词就OK了!比如我现在把 了 跟 啊 这两个字屏蔽了。9 S7 Q. H( p9 d- c  U
我们再来看下
! O. y% `' N4 Z8 z0 R) `- ?$ k4 ]# e; u/ l+ ?! E

& h6 w' a3 `! k9 n0 Z0 T; g" ^/ j! |5 i不知名网友:666666 牛批 老哥我要学!!!- L% I& ?$ ?8 B- b2 N

8 m: z6 J0 g- }" A+ }" R  ~
- A) e. @3 E0 V  A! [6 u

3 _' v- S9 c2 y6 Q: D. P0 d

; b. ?! X( b# _$ O5 D" x————————————————
' V: Z$ F# |6 b( W: z, s  x/ _版权声明:本文为CSDN博主「编程界的泥石流」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
1 U/ `# e+ M4 u: N1 F原文链接:https://blog.csdn.net/ooowwq/article/details/1192119077 F# c* v% y  ?5 B9 \  b  z8 Z
- \8 V9 D% [$ w' Q
8 ?' R1 ?! E' b6 @3 I+ f





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