数学建模社区-数学中国
标题:
用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 x
win(键盘左下角ctrl 和 Alt 中间那个键) + R 输入 cmd 输入安装命令: pip install 模块名 回车
* ?5 t# O) w; f% H+ H6 W
pycharm里面安装 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安装模块都是在国外的网址进行下载安装的, 国内请求国外 网速很慢,下载速度大概只有 几KB
6 ~$ 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 e
Python做爬虫到底可以做些什么呢?
+ 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 l
12306抢票 / 京东商城电商网站抢购脚本 / 朋友圈刷票 / 一些问卷调查自动填写… / 文章刷阅读量 / 音频 视频 播放量
' 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+ y
2 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 h
3. 对于数据来源的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- k
4. 获取数据
! 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# `- |* i
5. 解析数据
7 K' t1 }. I1 P$ @2 b
正则表达式 .*? 解决一切 遇事不决 .*? 通配符 可以匹配任意字符
/ N) [6 r: f, D0 f
6. 保存数据
' t) G0 i( p; g! h, R& P
1
" j/ O: m# M( ?4 g- M1 d' ~6 \
2
3 K/ O- P* a+ g0 n! o! X
3
3 ?9 u2 m2 O: {3 x; n5 T
4
7 ~: p" V: b% N/ [
5
* H( b* o* ~6 D) V
6
5 M& E! b2 j4 F" e9 W3 v8 O) l
7
+ v1 B0 x% {# N% X2 b6 r9 L: X
8
& 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 w
14
$ 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- z
python除了做爬虫数据采集,还可以做什么?
& 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 requests
2 m- A: w. A' ?: v8 P7 S3 d) y" b
( H- P# ~. G/ f% m6 |
5 U; s j z$ `( c3 \4 R
import requests
) ?" B) ~6 B) F- L% ~3 n, y0 m" Y
import 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+ c
4
( 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 Q
headers = {
& 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% I
2
6 W' _7 R. p6 @, N
3
( 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 M
response = 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( E
html_data = re.findall('<d p=".*?">(.*?)</d>', response.text)
( r! z- q0 U, h) Z" G
1
3 M% B, a% Z0 Y' T0 S5 R
2
3 b- G8 p6 X \+ X# a3 }" z5 v
content_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 }. O
for 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( d
1
4 C# c7 M5 H8 ~9 t. g$ g
2
( Z5 w# }5 V$ H" S
3
! B( B, h q8 | G6 ^4 c2 |
4
9 }7 h2 p* [& T) Q8 I
5
) e1 k6 ~, O1 [: s# j9 ?
6
3 X& Q( a+ l: z- S' C: f
7
5 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& G
import jieba
" p4 Z) m" R1 d/ P+ U- z
import wordcloud
7 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 r
f = open('弹幕.txt', mode='r', encoding='utf-8')
. {- t# d6 j3 Z! k
text = f.read()
2 l: T; P) O- I' R2 L
txt_list = jieba.lcut(text)
' A$ ^# C4 U/ ]- R
# print(txt_list)
% X7 r: @3 D/ P) Z" F6 B. k/ n
1
0 C0 H- I! Z, y- v- W: g0 Q
2
& L; l7 @9 c8 H
3
3 ` C i% W2 k. h2 d% K9 K
4
9 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- N
string = ' '.join(txt_list)
2 k9 @4 q; v+ k8 v4 v6 \
print(string)
' }* i. ~+ _1 }$ J% B+ [4 V
print('---'*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: t
4
) 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
4
9 B/ c3 ]$ x5 H3 l' H: X# J
5
1 k% b1 h( ^3 k
6
5 |& j0 d8 u- @9 o5 l
7
$ @6 J# @1 z7 V9 Y
8
6 @' 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$ Y
1
0 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# m
1
" t+ {% O( _2 t4 o5 C
词云图的过程中有点慢,大家不要心急
: L a6 u' v' G+ t# L& K4 h2 ~9 t3 q) U0 Y
4 _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+ _+ Q
7 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