数学建模社区-数学中国
标题:
用Python把B站视频弹幕爬下来,绘制词云图看看大家最关心什么!
[打印本页]
作者:
杨利霞
时间:
2021-7-30 16:25
标题:
用Python把B站视频弹幕爬下来,绘制词云图看看大家最关心什么!
0 _1 }; z$ x) o8 b
用Python把B站视频弹幕爬下来,绘制词云图看看大家最关心什么!
7 v9 ~$ g% i9 X$ r2 a: r# J
今天带大家做点好玩的,把B站热门视频弹幕爬下来制作词云图!
+ q% B( D( N+ w# I+ M' u6 |
康康大家都怎么说!
- x; Y2 C4 d3 w* U3 Z
" L l/ V t. u8 Y8 H7 `
& u5 E# g' t+ u9 ~: J
, G( @) u0 V* F7 _- G2 \
2 U7 z* _, g% d8 J4 a2 w
开始之前先给大家啰嗦几句,可能有些兄弟不会安装模块,我大概讲一下。
; L4 `3 z6 p6 j( O0 U
" ^0 [8 f% z4 d9 h# p9 P
" i7 y! @, x6 I; ~
如何安装模块:
# [7 q1 t. _/ H: B* P6 }
7 n9 I! T& n, @) \8 l
* A$ w% L4 j. [3 N6 W
win(键盘左下角ctrl 和 Alt 中间那个键) + R 输入 cmd 输入安装命令: pip install 模块名 回车
( S% _- e! k* }% }) @: T
pycharm里面安装 terminal 输入安装命令: pip install 模块名 回车
# S: ~9 v% ^( d/ Z5 J% p" ]1 R* J: h1 p
如果模块安装失败了,可能是这些问题:
6 v/ G: z* I$ ?% N3 c" r9 Z% @6 p4 [7 J
! V& E1 B% ~) `/ X/ K/ [
' \0 y+ R# b6 P- l
提示:pip 不是内部命令
# ^& M9 P( w+ T/ X: O
你python环境变量可能没有设置好
, c5 n9 Z' h9 |2 @, ^ Z; w* R
有安装进度条显示,但是安装到一半出现报错了
/ j) ~7 ^, i2 f3 k5 y" A
因为python安装模块都是在国外的网址进行下载安装的, 国内请求国外 网速很慢,下载速度大概只有 几KB
& F) M. X' D4 C' w7 J
read time out 网络连接超时 你可以切换为国内的镜像源
/ X( M& W+ E3 t& i- y/ v
明明在cmd里面安装好了,但是在pycharm 提示我没有这个模块
' A' V$ m' K6 G
你pycharm里面python解释器没有设置,你在pycharm设置里面重新设置一下
7 W! [& E) ^+ A) e# [
可能安装了多个python版本
8 j# o9 Q2 c2 r" `4 v
安装一个版本即可
* j. h' E z2 g# V
Python做爬虫到底可以做些什么呢?
8 Q- [! Z( [% D
: K9 X" e% S5 `, s2 p. e
1 \7 ?# y: |6 p' S
常规: 爬取网上的数据 / 我可以批量下载图片/文字/音频 视频…
$ y# y: y4 O/ g9 s$ D, P) R
12306抢票 / 京东商城电商网站抢购脚本 / 朋友圈刷票 / 一些问卷调查自动填写… / 文章刷阅读量 / 音频 视频 播放量
! L5 `& D/ K$ d0 c+ ~9 o8 P, k
可以刷课 可以刷网课 自动 还能自动批量注册账号
7 a) o4 x; z2 e* E9 O @! v
模拟点击 >>> 游戏辅助 >>> 修改游戏内存(单机) …
" b; T+ y5 @2 A5 s( a. s8 ? Q) s; f
普通B站视频可以爬 番剧是需要会员的
7 @5 \. |4 T/ N1 ?4 C
* B4 q( @+ }6 y
) r$ l" e$ k. L$ c7 t0 I
爬虫都是通过开发者工具进行抓包分析 查询数据来源 ( 静态页面 / 动态页面 ajax异步加载)
: ?, \% h- O6 }. S; I
" C% a1 D/ Q: Y( \' N$ N: W
. F4 q+ i+ l7 I) _2 T( O7 y
1. 确定目标需求 (弹幕数据 那个视频弹幕)
; e* A0 y; ], I1 E
确定了
# ~3 `" Q# f% J2 p! a; ~
2. 找数据 (数据的来源分析)
9 L! M3 C4 {. V3 t
简简单单 找到了
9 W- n0 b; D' o2 R
3. 对于数据来源的url地址 发送请求 (请求方式 / 请求头)
- ]/ Q3 s$ z* f5 B7 g0 S* x2 C
请求方式: get / post
! r8 c& }0 x) m$ m$ I+ N' h
请求头:
+ b! w+ u7 S8 \% o
https://api.bilibili.com/x/v1/dm/list.so?oid=376200196
& s. Y4 e& o7 A6 }+ |& v
(通过开发者工具去看一下数据的具体来源,是否是来自有这个网站)
B" D# l' g v5 L- ^# {2 p/ ^: u8 w
4. 获取数据
' {" T* ?3 }0 |+ L, e; _4 a
文本数据 response.text 获取网页源代码
5 E% B- O! v5 C8 ^: j! A3 G
json字典数据 response.json() 通常一般情况是 动态网页 ajax异步加载 用的比较多
! K, {* l. G- j3 ~: r4 m
二进制数据 response.content 保存图片 音频 视频 或者 特定格式文件
% W( J8 p8 `; s8 Y! Y( e
5. 解析数据
4 w' d5 A7 u: W2 M$ T# l/ r
正则表达式 .*? 解决一切 遇事不决 .*? 通配符 可以匹配任意字符
& C3 d& U+ h' d: X8 p8 H
6. 保存数据
9 ~4 W" |6 B6 b
1
; }: |$ A* X8 s" @: u% Q; ~5 H
2
1 B' Y/ h u! m, R
3
' \; _# z# T3 y" w, E
4
( {/ e( g" x2 S3 P
5
# k$ I% d% F# m' D5 k
6
: |' d# m6 r# L% B
7
- |- [" ]8 c! u/ ~/ t
8
% e& q; r% a# j S
9
3 P( X7 e3 y, x) g3 s1 g
10
% G Z5 V: H; m5 r8 c9 a
11
9 \" i& ?4 d$ T. B0 ?4 I: T
12
5 X, T8 t X3 E3 O5 s- J
13
[1 h) t1 ~! `. e7 V* G
14
! R$ [& c+ f' }5 @
15
9 o) h4 ], B' i' K3 x
16
O& N5 k C4 c) W y' w
python除了做爬虫数据采集,还可以做什么?
' f# O* i+ o5 Q8 Z, @( v$ U% y
兴趣学习 还是 通过python技术赚钱 (就业找工作 / 外包)
* U y* b" o: U
; F1 H. c5 e @8 q
- K9 X1 Q# L, o5 B
网站开发(就业/外包) >>> 我们课程是教授的全栈开发 薪资 13K-15K
) `1 d( l# d7 l+ v; T9 K
比如: python开发网站: Youtobe / 豆瓣 / 知乎(以前版本) / Facebook / 美团 ;
6 g" P- \. A% Z2 R% M9 I
我可以做到这样么?
R# [0 U& K2 y4 Y
0基础 初学者 从零开始学习,上线 通过 域名 服务器 数据交互,4个左右的时间 就可以独立开发这个项目 类似知乎的网站;
# {/ [* h" _* c% A# e
如果你做去外包(团队): python开发就业 大多数也是进入外包公司 一个 10-20K左右;
6 x, n0 q5 A( Y' L! Z
* L0 Z% J7 J/ s( K8 g5 ?
$ l! S. a0 N& J4 p! U& o
爬虫开发(脚本)(就业/外包) 可见即可爬
2 F4 x% c j1 ?8 C
虽然爬虫什么都可以爬,但是获取用户的个人隐私(信息 电话 身份 贩卖 )、国家信息、商业机密(未公开数据,或侵犯版权)、色情等违法信息用来盈利,就基本上人无了!
+ `1 a$ d/ o7 W
很多兄弟问我,可以帮我淘宝用户数据吗? 我都是告诉他们,这个我还想多活几年,这玩意涉及隐私,个人信息,你可以自己学了悄悄爬,爬完记得删了,用来实践问题不大,但是别用来盈利!!!
& Z- s1 q$ N# L A- W8 c
之前有个兄弟爬取微博上面军事武器航母图片买给国外, 然后就进去了!所以奉劝大家,切记切记,别乱来!
0 ~1 h- S% J- \, h) I
+ v( u3 } j: f% w2 }
$ M: g- C1 L, T- N; }! k
数据分析(就业/外包)
* g; ^, A4 b0 W7 r
% S& N3 B4 G8 J5 }' \2 j
6 k$ Y' P) e. Y6 {
自动化(脚本)
# v; l! E6 v/ s7 N3 ]# n
& B+ U1 N' N% p9 D! Q) V1 g: M
3 M6 ?) d' L3 }% |: B* c$ i6 p ?5 D
游戏开发/辅助(脚本)
1 l; B4 y' M" f. M4 M! y( C8 I
8 H# g9 A I( n" g4 a1 O
! m$ d. Z% D7 `) _
人工智能(研究生以上学历 要求很高)
, d: Z$ k+ W7 j7 [
8 c- A! n6 e% w0 U' `
0 h: g3 x9 H- D# O0 r' O+ T1 r
等等方向还有很多,我就不一 一述说了,那些方向对于一般人来说作用不大。
+ T% C7 B, v; \; |
' d% b2 y% t$ L5 \
( p3 ^ R |+ C+ D4 I
我们开始正题吧
6 g5 W( h# w8 J) O0 T) B8 P' P
% y) o u/ R/ d% `
! T/ m/ j. F* z* s% w
爬虫部分:
; B' e; {' U8 x' ^) y6 \( j* ?
发送请求 第三方模块 需要pip install requests
5 \" C. _7 k' e) B. g
5 o9 a B2 @5 z4 S
% O" r' r+ j* w; A
import requests
5 b; I' Z% W/ E1 K5 `1 |& G
import re # 内置模块
5 b- x, ?' W" |! h( w& k. K0 x
. d5 M# B1 T% s A4 H& n' x0 G/ z
) s: B* W2 F, u% e& g i5 [" V ]
url = 'https://api.bilibili.com/x/v1/dm/list.so?oid=376200196'
3 g( M6 Q3 x9 ^
1
/ r `9 L, C7 d) N# G5 V
2
7 t" v/ s) w. B! w$ i% }. Y
3
' l& Q+ E+ Z6 v. w
4
, O8 f5 P% F8 \5 [: ]3 W7 j) A
请求头的作用就是伪装
0 S. [: X3 d7 C9 u. f
6 N0 p- m8 i4 [# ^( P
& B' W$ b" H- `; h4 p% {1 s4 P
headers = {
* [. B) v5 z+ l9 f1 ^8 L2 ~
'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'
: u2 T9 A6 A- X! N
}
3 ~/ |9 k- ^: r: A" t' _
1
, Y+ _0 ]5 k. ~8 B+ |9 o
2
0 Z3 E4 ?% [- g7 x% h6 ~' d
3
4 W" ^, n7 @0 p" c9 l0 ]
模拟浏览器对服务器发送请求, 服务器接收到请求之后,确定你没问题 然后会给你返回 response响应体数据
$ e( Q1 F# o: U' O
函数传参
4 J, R8 B& e' S1 V- w- n% N
. d$ D* t9 d! m1 q
; z% L& ]: p' g# |, Y7 C
response = requests.get(url=url, headers=headers)
, k, Z& r' @* k2 W9 b9 ~% W
1
, ]# x& o7 W- Z' e7 ]
<> 对象 对象意味着你可以调用里面的方法或者属性
g* y; h( W+ f, q) l( T' M0 d
200 状态码 请求成功
! o9 d2 O" n s" X
获取数据 文本数据
& h, f; ~$ u6 W7 o2 L
自动识别编码
6 T- E% `! y) U+ q1 Z u7 L& L
5 A) v9 Q: V( v
7 o9 [$ E; \$ P4 c- X5 M
response.encoding = response.apparent_encoding
6 W0 y' l2 |: S! P# L, ~' f
html_data = re.findall('<d p=".*?">(.*?)</d>', response.text)
5 q+ E9 |1 R/ u, u
1
8 T: m7 O+ t6 {# m1 v5 D8 i
2
: B; f/ N/ k5 r
content_str = ‘\n’.join(html_data)
# d" L3 {" F: X2 y: t
. ~6 e1 c1 ~+ k
3 P( H# U& _- b6 T, Q9 X9 @
要列表转成字符串 ‘’.join()
- ^( J. g; `# T3 H+ k* Q
for 遍历
0 H8 ]6 h6 |& R. u
保存数据 保存字符串
+ i' n/ j* v4 X# A8 X! s
for content in html_data:
1 l6 E) B7 q0 u2 t: p
# mode 保存方式 w 写入会覆盖 a 追加写入
6 b" E; f' `4 c: X9 o a6 P* `0 U8 [1 s
with open('弹幕1.txt', mode='a', encoding='utf-8') as f:
) |$ N: s D/ y+ P
f.write(content)
6 u, t" j i# ?2 t
f.write('\n')
; U; |4 I" i" P% u$ _ Z. W
1 F# v8 S8 v7 [
" |! R# Z6 r1 {. S) }( T# t
# print(content_str)
& }/ K9 p/ ^5 b, c4 P1 m% U, c
1
1 S; e: g5 m; J. f) p7 P u3 b
2
8 D% l2 J. @! c" y q/ Q0 t
3
0 ^ V% m9 F: u( U& e7 j0 M
4
9 f/ e% b/ u8 \# W. H `1 d
5
( e4 S: e( e0 M6 e) _+ F
6
' R8 H1 x) M! q b" T* r6 H9 Q0 X
7
4 W9 U# S' z8 F, _
爬取结果
7 e: w4 N# B+ T2 \
9 P8 N& m9 r, X$ a( J/ r
; R" L) ?4 X- x9 I) W1 O& a
3 H2 k8 ]7 K3 G1 j' H3 Z- Y$ Z) w: g
2 T& L6 A' Q3 ?% B5 k/ O8 a) O7 |7 L+ o
然后我们再来实现制作词云图部分
5 z2 Q! ^, W: K7 G
; p# a! P1 I7 W: N3 X+ d3 @4 M
& n1 R6 U# |* n8 y) H5 z+ `3 S, |
首先要安装这两个模块
$ [+ E# u4 @& r( V& U
* J8 s! l2 d$ G5 [" y6 w
; F5 j% Y O% u0 r6 g$ O! H" m* u
import jieba
) ?: b- `' z3 \ q
import wordcloud
8 o# n$ ~) F( V# `6 L
1
! u; z( @. R% w/ q6 U
2
" V) J& S3 D, A8 Z: [8 B
一个相对路径 一个绝对路径,保存好的txt文本名字要注意看一下,不对的话,记得改一下保持一致。
4 O$ Q4 g7 L0 \# o) \
* {+ L7 u2 ]6 t
; v' r9 x( w* `
f = open('弹幕.txt', mode='r', encoding='utf-8')
( \! h. G7 l) j3 V) t
text = f.read()
9 s; z( B: ^3 f0 `
txt_list = jieba.lcut(text)
- ^# M0 d" I0 l1 ]) F6 Q6 \
# print(txt_list)
4 @2 q6 i! X: `5 f
1
% k+ A- q7 G; u- X Z
2
, S- J' Q% T8 K0 w6 l6 R
3
7 p3 m! s" x$ A0 V e2 ?, {
4
+ x& C U, X U! Q9 @1 U3 G
列表整合成一个字符串
' A( P; `% |* H6 }4 B( _
- {$ ~- q- k8 V/ k% ]1 \: j3 Q; U
5 W$ \9 |+ W$ ^' r% Q8 N+ t
string = ' '.join(txt_list)
' h% S' Q. A! Y; H \
print(string)
m( \6 T2 I4 k8 B. N- e
print('---'*50)
1 i8 z. u- G" ]
print(str(txt_list))
+ O9 |2 N1 n! z
1
& L n# E/ u& ^# ~
2
/ d' B/ Y' m m5 w' h
3
2 d4 m7 B& P; d8 o v8 a
4
8 s2 T* D" F! d( S
词云图设置
& b! z% v! ?0 I% G9 R
) J9 m2 f7 {: K" l1 \
2 i' S- n3 U0 R0 T
wc = wordcloud.WordCloud(
& T3 ]" X: B0 r# K
width=1000, # 图片的宽
: \; b5 X8 K) e' k3 [. `' h3 T J
height=700, # 图片的高
, G6 n% X3 _, M
background_color='white', # 图片背景颜色
+ Q. x y. W+ n8 m7 q
font_path='msyh.ttc', # 词云字体
, g; h8 N8 B1 ]( P+ A% P% y# \; Q8 N$ U
# mask=py, # 所使用的词云图片
9 A; w3 [# W) X% {7 `+ I1 b
scale=15,
6 [! `+ b$ M2 S* C) L! I2 H
# stopwords={words}, # 停用词
! ^1 ?5 t- |2 b ~7 V
# contour_width=5,
: b* l/ b+ g+ V) c: E
# contour_color='red' # 轮廓颜色
; B3 L( H+ } \3 V; ]% s3 A
)
* [$ y7 M/ O; I7 d- V
1
# K% B6 l2 }+ Y6 y9 F7 @
2
0 K: {# N% J# z6 r z! W# _% l
3
- V m1 m- r- q: E! G: b6 t
4
4 f: e& I" |# w" A8 F. Y7 `* E
5
% B5 Q$ S, Z/ j/ L, L# T3 z
6
& s4 ]. e8 m) v
7
7 r% q5 W+ G+ E' z& [5 a( m( s
8
& I1 p- U7 V! k. n; {
9
* U; Y( k2 g/ T& N! `9 E. |0 t
10
, o* b1 ]" j. H( n* g
11
7 v8 D b* H: |
给词云输入文字
% D1 V( \/ }+ f: {% u3 R( c) _# B& i
1 R! w9 s; U. V7 w6 g8 x. p2 r+ `
! L4 V3 B% r- e
wc.generate(string)
. q) T. ]( @& m+ ?: h0 l+ n$ u
1
: t- R8 f& A3 h) Q9 T
词云图保存图片地址
" G! c) E4 U9 ?# b& w1 t
8 Y7 y/ o. D3 R- {# i
5 { G# D8 }& K
wc.to_file('output1.png')
' k* I/ L# }- L) I5 \# t
1
, X; i6 a, K! |; c' x+ n
词云图的过程中有点慢,大家不要心急
! j) A; _4 o9 P8 Y8 A3 B' Q2 L
u$ t* Z2 I3 ^( D; b1 [
3 y: [3 B- J. k/ w5 v! b. k
这是最后的结果
$ @+ {4 V/ u. |) Y% o1 t
5 j. d4 {2 K7 Q9 ?$ Q- g* E6 B
; W% }3 i m+ F! ~
没有加停用词,所以一些无用的词比较多
, r2 f0 w. a Z/ e, _4 X
& v4 u) |: E9 ^) G8 t4 j
3 c' M. C4 ` n+ o ?) m
stopwords={'了', '啊'}
& _% ?% \ C# J/ _# L6 {- D: M, }
1
3 e8 t* d6 K7 `' V# k e
把这个部分的代码加入要屏蔽的词就OK了!比如我现在把 了 跟 啊 这两个字屏蔽了。
% Z7 O# F) A8 a* {$ v
我们再来看下
; A5 i0 c5 G* y# H; `6 D
5 @- e" A5 ~8 ^9 |) O Z
B' n5 }# c8 L/ T$ h; J: r; a% o
不知名网友:666666 牛批 老哥我要学!!!
" _/ w* s# e& N& @" R: S
7 b& M) o; {% ~
) Q$ p+ b/ l$ U) X" ^9 X
; J) I3 J0 @. C' ^% b# S
% X X$ M' |. n# v! V/ I
————————————————
! }% p% A! r; m+ S+ d; p
版权声明:本文为CSDN博主「编程界的泥石流」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
' v( {2 v1 Y) u0 {. ^
原文链接:https://blog.csdn.net/ooowwq/article/details/119211907
# K+ x! |$ O* ?& w: ~" A% Y9 }
3 u' B2 ]; ~- b& M- [4 F
& o0 E4 a0 r, c K
欢迎光临 数学建模社区-数学中国 (http://www.madio.net/)
Powered by Discuz! X2.5