数学建模社区-数学中国
标题:
用Python把B站视频弹幕爬下来,绘制词云图看看大家最关心什么!
[打印本页]
作者:
杨利霞
时间:
2021-7-30 16:25
标题:
用Python把B站视频弹幕爬下来,绘制词云图看看大家最关心什么!
, W+ Z) ]7 U7 q j
用Python把B站视频弹幕爬下来,绘制词云图看看大家最关心什么!
( s# u* ~2 g, A9 e! Q8 V% z6 i
今天带大家做点好玩的,把B站热门视频弹幕爬下来制作词云图!
# C" z6 E7 Z7 W- E" t
康康大家都怎么说!
. }" V3 I, o* \" \3 I. p) D
' r v* h% ]9 z$ o9 @
. v8 p* O8 ~ p3 D/ U; r6 \- |7 v
7 `8 q* O8 a" D/ ?, ?
% e$ W. y) x3 b' W- n0 `: Z( p
开始之前先给大家啰嗦几句,可能有些兄弟不会安装模块,我大概讲一下。
/ u% E! V% R, j7 m0 c1 ^
6 N1 s: O m1 ?) K& J' b( b
$ D& X( l7 T& ?) ~
如何安装模块:
- P! {- r# Q( I* Q4 B2 f3 f5 n/ ]
I6 a S2 @ m S6 A
4 c& Q% D3 K, u# X3 E/ Q
win(键盘左下角ctrl 和 Alt 中间那个键) + R 输入 cmd 输入安装命令: pip install 模块名 回车
* n, Z% { W7 y- J3 J4 r: E o5 o
pycharm里面安装 terminal 输入安装命令: pip install 模块名 回车
+ S# P% \3 e3 q9 R5 Y+ t* ]0 L
如果模块安装失败了,可能是这些问题:
% V X6 l* j$ x+ z7 a% v- I
, T5 V# L1 P$ u& P
" {& ~- j2 g: z
提示:pip 不是内部命令
0 Z9 t$ K% Q: T) D
你python环境变量可能没有设置好
1 B- P6 I- S; b% x8 w. a( v: Z" K/ `
有安装进度条显示,但是安装到一半出现报错了
6 x+ y! r# d' V! A& k0 a3 t: d; b: D
因为python安装模块都是在国外的网址进行下载安装的, 国内请求国外 网速很慢,下载速度大概只有 几KB
% }+ w- ]% }' _2 o
read time out 网络连接超时 你可以切换为国内的镜像源
$ S1 K' }; L. h+ D- O% }
明明在cmd里面安装好了,但是在pycharm 提示我没有这个模块
3 t1 o4 i: ^4 a
你pycharm里面python解释器没有设置,你在pycharm设置里面重新设置一下
, c( C; l5 ~! r& f' j" `3 a# A/ ?
可能安装了多个python版本
- [! T- [& w8 S+ `7 U1 L$ x
安装一个版本即可
8 x7 t& I8 `4 n
Python做爬虫到底可以做些什么呢?
1 Z ^- v3 S2 U/ ^& w
) b, W' H2 f3 }6 A% H1 O
7 F2 }5 F: P0 T; ^% m7 P
常规: 爬取网上的数据 / 我可以批量下载图片/文字/音频 视频…
/ }9 L* ]3 d: K; K1 D! U
12306抢票 / 京东商城电商网站抢购脚本 / 朋友圈刷票 / 一些问卷调查自动填写… / 文章刷阅读量 / 音频 视频 播放量
" Y) X. n8 c4 h7 c, J0 O+ M8 O
可以刷课 可以刷网课 自动 还能自动批量注册账号
; ^9 ~5 O4 H3 F! I* E- x8 H5 H
模拟点击 >>> 游戏辅助 >>> 修改游戏内存(单机) …
& a- |& a5 a4 Z5 Q
普通B站视频可以爬 番剧是需要会员的
. c/ Z5 [7 b6 w
. q7 n m' b8 m5 e
2 f# j& J1 L$ r& V/ v" u c
爬虫都是通过开发者工具进行抓包分析 查询数据来源 ( 静态页面 / 动态页面 ajax异步加载)
/ P0 e( Y e7 ^, G$ i; S/ a5 p
2 I8 T- W# i/ }7 H$ ?
R. v+ R# z1 p2 B6 ?; r: ]. i
1. 确定目标需求 (弹幕数据 那个视频弹幕)
# A" I9 N! }7 }4 t5 S9 z* B, C
确定了
2 J7 q) i( n5 p0 ]
2. 找数据 (数据的来源分析)
h# h& Y9 Y9 O0 B
简简单单 找到了
+ f& T8 v8 e; _ d
3. 对于数据来源的url地址 发送请求 (请求方式 / 请求头)
( i- s! }3 Z/ X/ ~- U5 ^7 B1 ?/ F, i
请求方式: get / post
6 b. ?. B! Z9 |& }6 G ^
请求头:
( Z+ E- ~: S* ~- V/ D$ g( O. O# Q
https://api.bilibili.com/x/v1/dm/list.so?oid=376200196
6 u# `5 @+ o- R" q5 U
(通过开发者工具去看一下数据的具体来源,是否是来自有这个网站)
8 S( v) `. I. R* M" {: u' ~
4. 获取数据
' y, j" _! b/ P2 G
文本数据 response.text 获取网页源代码
( ?+ Y4 q f2 T, q! R
json字典数据 response.json() 通常一般情况是 动态网页 ajax异步加载 用的比较多
+ T# @8 y# x, E
二进制数据 response.content 保存图片 音频 视频 或者 特定格式文件
6 y0 ~9 Y0 \# C4 I) q
5. 解析数据
* I) u" i9 J9 m& ]3 _, J/ h# N
正则表达式 .*? 解决一切 遇事不决 .*? 通配符 可以匹配任意字符
# ]) s4 t+ y8 F# [) @
6. 保存数据
- D- o* }- v/ K3 ~/ {6 f4 B
1
. m+ i: O& a' r7 c- n
2
7 T9 K7 c4 q3 Y, T. G9 ]
3
2 i V, d% M/ ?- |9 X; w
4
' X* O. b( a2 j8 o4 C. J: e
5
) s4 c2 x. U/ d( k# P+ m, r$ C
6
0 S/ y1 y: [* i& t; X
7
; a+ T9 q# W4 t* s
8
* k/ [+ b4 w. E2 O/ k9 R9 {2 i
9
5 I; \/ K% T. D( Z
10
& t% G' U8 X$ j( L8 y! M
11
, ~7 r, D* I; }# r+ _- Z; W
12
6 y e0 K6 a; z" K( R8 T! Z2 R
13
2 h/ f: S' a8 A& j
14
, R9 t: z4 M! _* P( a& I
15
! w' q0 d9 b& r
16
6 y+ v" E( O3 D
python除了做爬虫数据采集,还可以做什么?
! W5 E. w) v Q- L" `
兴趣学习 还是 通过python技术赚钱 (就业找工作 / 外包)
# D( I, c# l( U) J: S, @+ \' e
# G. C N2 v' e$ n; s9 E% O' z
5 g, @: }) C( l$ D- T
网站开发(就业/外包) >>> 我们课程是教授的全栈开发 薪资 13K-15K
$ S) E/ f! C |
比如: python开发网站: Youtobe / 豆瓣 / 知乎(以前版本) / Facebook / 美团 ;
, W* F7 G( _- ~6 O* }+ r$ i
我可以做到这样么?
- F! D* R8 t" W t. _; e `
0基础 初学者 从零开始学习,上线 通过 域名 服务器 数据交互,4个左右的时间 就可以独立开发这个项目 类似知乎的网站;
+ y' ?0 J- e( n
如果你做去外包(团队): python开发就业 大多数也是进入外包公司 一个 10-20K左右;
$ k; H6 x0 p( G( L+ T
$ R; j# g' }& O' _9 a
9 n& u1 F& j* _% B, G/ v$ P
爬虫开发(脚本)(就业/外包) 可见即可爬
7 z9 e+ i7 k' w( I" i
虽然爬虫什么都可以爬,但是获取用户的个人隐私(信息 电话 身份 贩卖 )、国家信息、商业机密(未公开数据,或侵犯版权)、色情等违法信息用来盈利,就基本上人无了!
+ L) h3 k8 @1 t$ L
很多兄弟问我,可以帮我淘宝用户数据吗? 我都是告诉他们,这个我还想多活几年,这玩意涉及隐私,个人信息,你可以自己学了悄悄爬,爬完记得删了,用来实践问题不大,但是别用来盈利!!!
; H! \, s+ d! P3 T" J3 U
之前有个兄弟爬取微博上面军事武器航母图片买给国外, 然后就进去了!所以奉劝大家,切记切记,别乱来!
1 s' A% i: v% m$ V- S& M- d
" Q, ~1 p; |5 }: U
3 w' }1 R7 F7 n2 y/ O N8 S- w/ Y
数据分析(就业/外包)
' R4 Q3 {2 R- L4 {+ C
v4 \# ~8 N0 a; r% l* a9 I2 ^
% ? {$ K3 f& n6 b2 J } a
自动化(脚本)
" X8 `; \. `2 p# `) e" k
1 ?6 B1 z" ~2 M' L3 Y/ |& ^, W
- `+ `& X" k9 B/ t5 S/ [3 o' @
游戏开发/辅助(脚本)
: P& O4 T: n$ ?, z0 h1 H/ }: A
3 c8 s' F* K. P4 [" E; t
' e, M. M% J+ t; k
人工智能(研究生以上学历 要求很高)
9 F: q5 m5 h0 | j, L" {; j# @
0 [/ [% U4 n7 V6 W/ w" N4 N
/ P5 ^: n4 x1 D5 d
等等方向还有很多,我就不一 一述说了,那些方向对于一般人来说作用不大。
+ K% I9 T2 `- y1 x! J$ Z
0 g" E9 b/ J6 u4 `
, ?% z3 R& a; N1 G1 F. f
我们开始正题吧
1 [6 l) H1 w' }! K s
7 D: H7 x0 F- r, ?- w
$ }2 Y# n/ h. X0 f8 k5 O4 n0 C
爬虫部分:
! B! D. u9 J6 E6 l
发送请求 第三方模块 需要pip install requests
5 {' H" L& p3 l3 v4 A
( a2 i4 A8 {0 D8 ?$ d
& K) ?& n8 {7 G% w' X4 o$ V
import requests
" W/ A3 E) G% D* s, ^0 G* x
import re # 内置模块
4 E9 v( z7 d4 m7 n a
0 H4 |, U) ~! p: q, J
9 M X2 a" F) }! z
url = 'https://api.bilibili.com/x/v1/dm/list.so?oid=376200196'
9 D# p* F$ x+ L- a) D% I
1
' J, d3 H0 c/ [1 h+ n
2
" U/ U- w. \8 S0 A- L o/ d
3
" O; b* S* p& K, J$ c
4
3 _ K5 f2 I X3 x
请求头的作用就是伪装
* e w9 w' }, P! N
* W5 N! Y7 d' C3 v9 h
! Q) m2 N/ \3 {
headers = {
! S7 G$ c6 x( U" \" U. W2 {
'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'
% Y, N9 t6 V7 K: w
}
9 @6 E, ^7 }5 K7 b+ F
1
g, f5 e V- ^6 e$ J8 {& P
2
R! h: [" M; @8 I% J
3
2 z' Y/ m- H1 V1 C/ }# Y6 }
模拟浏览器对服务器发送请求, 服务器接收到请求之后,确定你没问题 然后会给你返回 response响应体数据
. l8 Y: \+ a- p2 {8 k, b
函数传参
" Z3 }. N3 U2 n! b( N
. K, t" Q. g9 e7 R/ O0 x* W% z
' _" M% F+ V+ p/ D( k: L
response = requests.get(url=url, headers=headers)
D! i* Z0 L( n8 e, m
1
) U+ Y% _$ E K8 C$ j" W6 C
<> 对象 对象意味着你可以调用里面的方法或者属性
' S. W" x& h$ O9 x! B5 g* f
200 状态码 请求成功
$ z/ _# s! L, }6 |
获取数据 文本数据
- I: k6 ?' c! H- J! v
自动识别编码
$ @; `% \' s4 g" Y0 z$ m( o
8 [; \) w$ r& J$ i
5 h" b; C4 u) U% h- X, ^
response.encoding = response.apparent_encoding
3 C2 Q8 V! I) r f8 ~8 Q% N" y
html_data = re.findall('<d p=".*?">(.*?)</d>', response.text)
1 @8 D2 q `2 g7 Z4 V1 N' _
1
) d9 n$ G/ {( D0 r, F z8 e
2
+ x2 R3 k$ X7 I3 v9 g+ `
content_str = ‘\n’.join(html_data)
& j8 h, g) k: C# o/ t
$ \6 e" W5 o W- N' m
0 b( N0 |& _7 t* a6 x( J& S8 ^6 T
要列表转成字符串 ‘’.join()
8 J# R$ l( i: X# R6 k( C
for 遍历
% b7 f2 X% H% o9 o/ h' ~
保存数据 保存字符串
! ]' _! C3 }( i Q
for content in html_data:
- H" U0 ~9 k9 r
# mode 保存方式 w 写入会覆盖 a 追加写入
) K+ n+ l/ b4 L
with open('弹幕1.txt', mode='a', encoding='utf-8') as f:
& b/ n2 n, K% X- {. G8 X+ O* k# ^
f.write(content)
# q' K( D3 E- C; D, c
f.write('\n')
1 M. P$ L' c2 m6 ]1 t* ]
0 O! G# E D3 H& p% C8 }
1 n' g# h3 O# c# Y) c
# print(content_str)
; Q' a+ B( n# S6 t( ?
1
* [5 C3 C6 Z! o8 A: @. L/ t
2
: c$ \/ k, M. @+ l% \
3
& r! z$ X2 Y# h, V2 j! F
4
2 k, F! [) o& Q/ l7 S& x
5
. w Z8 v+ i6 b: B
6
; k4 D } G# r' O9 ^
7
2 @3 h ?/ s2 h* x @7 o+ j
爬取结果
0 Q# ~5 ^8 W0 a
8 e# D I3 g, Q1 `2 U& m' W
6 ], f' F7 U# X. u( a
3 m$ g# L. C- z7 n m: v- T& a
" `1 p4 f7 [9 W9 X; \
然后我们再来实现制作词云图部分
2 N* n9 |& g# B8 p
, C1 n! e- e# h3 I" P
) W& M! k F& H
首先要安装这两个模块
- Y Z9 }) g- e9 R! C7 Q# a& z+ B
$ K2 t5 E, D& _) F1 ~" F
* s1 D# I/ t$ _& ]1 y" _
import jieba
6 o+ E2 ?5 @5 a& X' b
import wordcloud
l/ w- }: i: O' r8 v& A- X* Q7 o
1
* y5 a* u5 b* j; ^1 P
2
7 G# }8 l' F8 ?+ P2 @+ D# h
一个相对路径 一个绝对路径,保存好的txt文本名字要注意看一下,不对的话,记得改一下保持一致。
, l' ]) [: D1 j) U1 L; f7 n
" N! J5 t) v! p4 }# M
4 l) K' j8 v& E1 P
f = open('弹幕.txt', mode='r', encoding='utf-8')
1 d9 f+ b( `, ?" J& |
text = f.read()
9 v/ x- c! V" A, H
txt_list = jieba.lcut(text)
# W# ]9 p* V" l @: A4 M* q% [ V. [) p
# print(txt_list)
& V% J- H# i3 D* ^& M) o& P
1
8 P; u) R+ z8 R' Z
2
1 i: x# T6 ^* I# A: p
3
# p8 V8 L+ N2 ]' Z: w
4
) |9 _! N6 I! B
列表整合成一个字符串
" G# {* d) A8 {
( c$ M* q: G: W2 V
4 Z3 [! n3 G4 E9 @0 b7 u
string = ' '.join(txt_list)
* ^) C f6 ~, d$ v3 H
print(string)
* j7 L2 k0 s3 {( V, u7 o
print('---'*50)
' x: x/ \1 [3 S5 l1 d7 j
print(str(txt_list))
% |( s8 j, d4 e7 m4 {0 r
1
6 B! u1 ]: @- o4 ^3 H
2
/ {6 t! Y# D; W( f
3
% R/ k5 W( y v+ F2 f& F
4
; ~6 i: J+ C( p/ [5 G! g) D; \
词云图设置
2 c8 Q& [/ c. ^+ g" @$ J
, C" G1 e' C2 V; d' a4 l- i
% q, P/ C* s0 C( O" }; B
wc = wordcloud.WordCloud(
2 j" x0 y0 X' d0 h& T( V4 B
width=1000, # 图片的宽
2 w D: e6 L* v3 n
height=700, # 图片的高
4 E* j0 c$ s ?' x
background_color='white', # 图片背景颜色
& I; W' r$ x+ l g! c
font_path='msyh.ttc', # 词云字体
# U9 q) ?) k. r/ M
# mask=py, # 所使用的词云图片
$ J0 B& Y; ^/ ?) g* J' I- R' K2 @
scale=15,
5 ^: O7 X! ^% F5 T0 s
# stopwords={words}, # 停用词
0 z0 l L( P/ G) I" ^
# contour_width=5,
# N& @- ^% J- _8 E& Q7 W0 U
# contour_color='red' # 轮廓颜色
2 c. G/ `: l7 ~ v; I9 T7 V5 l
)
d' ]7 z" d' A, D( C& k5 l, \% n
1
3 v2 `. H, t, p) {
2
+ b" L7 m# X7 \5 D! ^7 }; m
3
9 F( z" d( T6 S6 A# ?
4
5 |. Z F( b4 b3 }
5
; ^. D( W9 Y0 F5 y: o
6
3 s3 ~3 k! v, \: I$ R$ m2 F" T
7
) [8 p1 O: W$ K+ h% i* F
8
) X0 a3 p2 {: \
9
- c6 H( }0 i# _, p0 {7 o% e! P
10
: U0 e9 u8 B% E. R9 v
11
5 a& X+ M) c7 V' u6 \8 t
给词云输入文字
/ q! K- `0 Z7 z% D
9 k$ H6 C7 k$ C9 @
5 j, W9 F! b& H
wc.generate(string)
6 n9 f+ A# f1 v0 U, O7 m8 X9 w
1
% s' @5 E2 z# _* n2 |# U/ H$ V
词云图保存图片地址
; \( i5 I# c% b: h p; H
5 F5 e: p$ N$ }$ G0 U
. X2 Q4 z9 Q5 ~$ z
wc.to_file('output1.png')
4 `) k P) h' r2 h+ f
1
0 o% X$ y4 A, E% K
词云图的过程中有点慢,大家不要心急
2 j. ] B* }, Q" a4 O. l4 ]" W. n; e
3 m! `2 \9 y( d5 F( O3 |
# e2 [; x& e4 \. @1 s, p! k
这是最后的结果
+ T- X8 x) d8 e7 M) H
. V d* e4 H, Z" `% n1 k& B
4 K+ |6 }6 ?& U) \( B
没有加停用词,所以一些无用的词比较多
' S8 y" J8 D+ a
2 ?1 B0 q& r4 b% y( T3 q
% V2 B$ Q+ Q% f4 D, Q; V
stopwords={'了', '啊'}
; b3 Z# }- R' g
1
7 A4 r, _' G/ |' N) h% ~" p
把这个部分的代码加入要屏蔽的词就OK了!比如我现在把 了 跟 啊 这两个字屏蔽了。
( m/ j; @# L) Q: H J
我们再来看下
0 ]9 M* B4 \8 d) _! @; t e
. T/ Q* I5 {' K, v
" Z3 T$ m3 x4 m* T7 \- S$ S
不知名网友:666666 牛批 老哥我要学!!!
9 N' Y! K* F- w+ F7 U2 p/ U9 {
1 f7 k2 f. H' |! |* M( y" p% m
9 ?1 G$ B5 E# ]0 p- }! ?5 ]
: A0 S+ c( I" u8 d/ `* {2 |0 q
# S& Y/ ~# J& e3 _. o* Z. N( G
————————————————
0 w+ Y$ Y, n5 T: m/ I! s7 v' [
版权声明:本文为CSDN博主「编程界的泥石流」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
$ a) ] w6 {+ S5 r3 v/ P7 s
原文链接:https://blog.csdn.net/ooowwq/article/details/119211907
5 k; W. U: S. R- a* l7 V
) E/ e- T2 n2 f1 A8 L! m3 b( p
, t% M. u2 ?' m0 b5 [
欢迎光临 数学建模社区-数学中国 (http://www.madio.net/)
Powered by Discuz! X2.5