数学建模社区-数学中国
标题:
用Python把B站视频弹幕爬下来,绘制词云图看看大家最关心什么!
[打印本页]
作者:
杨利霞
时间:
2021-7-30 16:25
标题:
用Python把B站视频弹幕爬下来,绘制词云图看看大家最关心什么!
6 p8 @9 P+ I9 N0 a/ Q/ A. r
用Python把B站视频弹幕爬下来,绘制词云图看看大家最关心什么!
0 l( r' x2 V" T0 W4 \. }
今天带大家做点好玩的,把B站热门视频弹幕爬下来制作词云图!
5 z: R: T6 {: x$ b n4 M8 k2 U4 d
康康大家都怎么说!
, V& D& q% Y. R+ ?
- H6 I C0 \" Y8 m
0 \9 h8 [& y- t6 \5 s
- Z% S/ T$ z' b0 h1 X
9 k* }$ V, U4 l3 [; D6 m" }
开始之前先给大家啰嗦几句,可能有些兄弟不会安装模块,我大概讲一下。
+ x* B/ H) a* R( R% m/ U# b+ F* v
- d5 P/ M# l$ A& J
3 R+ h) i; V' Z' R+ j; U X, \
如何安装模块:
+ U( O* _5 i& b( l- [8 D
P3 l/ i; d1 `% A
' J. C h$ N: `. Z, d* x
win(键盘左下角ctrl 和 Alt 中间那个键) + R 输入 cmd 输入安装命令: pip install 模块名 回车
8 t: c: k6 e* N+ F" U
pycharm里面安装 terminal 输入安装命令: pip install 模块名 回车
# m2 R8 I$ _$ g4 b$ R2 G
如果模块安装失败了,可能是这些问题:
% K: `. i7 v4 Q/ I0 l8 n
8 F5 e: U8 p5 f8 E( C' U
9 Q9 q& T7 Z7 }0 W C# {
提示:pip 不是内部命令
" @0 Q) @: s4 j
你python环境变量可能没有设置好
}# c8 i0 D* \' }. N% V8 i
有安装进度条显示,但是安装到一半出现报错了
% ]8 {, v3 x _+ k
因为python安装模块都是在国外的网址进行下载安装的, 国内请求国外 网速很慢,下载速度大概只有 几KB
2 K/ H% B* F' H# a, h u
read time out 网络连接超时 你可以切换为国内的镜像源
' u+ k+ J+ F0 y' `) U. w( Z. P
明明在cmd里面安装好了,但是在pycharm 提示我没有这个模块
0 y) C- p8 @& M9 b
你pycharm里面python解释器没有设置,你在pycharm设置里面重新设置一下
" [5 g6 a' {( w6 g* [, u1 g
可能安装了多个python版本
% C" \/ M1 V2 f( w6 e1 c% M
安装一个版本即可
# L. x( [* z% \* m! A& Z
Python做爬虫到底可以做些什么呢?
4 s- y- s$ b: X) m. X
; X* @( l% T* @. l$ r
5 m( L& i `1 N) H# Y0 {- T% L
常规: 爬取网上的数据 / 我可以批量下载图片/文字/音频 视频…
; L- M; a$ j8 R6 q9 s/ A
12306抢票 / 京东商城电商网站抢购脚本 / 朋友圈刷票 / 一些问卷调查自动填写… / 文章刷阅读量 / 音频 视频 播放量
+ y2 \+ `# E! z8 s/ R. x/ v
可以刷课 可以刷网课 自动 还能自动批量注册账号
+ G4 c4 p5 s9 s6 \- y7 T2 _
模拟点击 >>> 游戏辅助 >>> 修改游戏内存(单机) …
* `# h* `" z$ `! i9 ^; {- \
普通B站视频可以爬 番剧是需要会员的
, g( g3 [! N+ r- V( O
! H# n9 ~& ^/ H \% ^
, Z2 L" E: d5 q2 c) N, ?
爬虫都是通过开发者工具进行抓包分析 查询数据来源 ( 静态页面 / 动态页面 ajax异步加载)
& e C# e, Q1 W0 ~% v
4 E* C6 V$ z5 y$ Y4 ^ I2 u
$ p3 ]1 s, k! J, M `. B1 Y3 a
1. 确定目标需求 (弹幕数据 那个视频弹幕)
0 {1 Z7 @& }# r8 X0 N8 \+ Z
确定了
) A u, y" F& E* C g; z7 f: ^! H
2. 找数据 (数据的来源分析)
; u' o4 v k8 X3 x- o
简简单单 找到了
; ~! O0 [, l& V, n8 k; D
3. 对于数据来源的url地址 发送请求 (请求方式 / 请求头)
# R# d( V8 _# l( k }% T
请求方式: get / post
8 t. x1 V" ?0 y" f3 u3 p
请求头:
/ c& M8 L5 M( M8 o! E- K) Q0 g
https://api.bilibili.com/x/v1/dm/list.so?oid=376200196
: j& c. p' f5 P4 L) `, A/ R
(通过开发者工具去看一下数据的具体来源,是否是来自有这个网站)
' ~4 p$ ?. O: Q. K' g3 y
4. 获取数据
, d2 {/ e* r, b; W/ w u4 l
文本数据 response.text 获取网页源代码
# B0 e( K1 _- ^9 f# A) K' X' o; Y! N
json字典数据 response.json() 通常一般情况是 动态网页 ajax异步加载 用的比较多
9 O q% Y( q! c
二进制数据 response.content 保存图片 音频 视频 或者 特定格式文件
" h+ l+ u' E1 u
5. 解析数据
" s3 \$ k! {2 `- m9 m7 H
正则表达式 .*? 解决一切 遇事不决 .*? 通配符 可以匹配任意字符
5 n6 F0 S/ [* K
6. 保存数据
6 t7 y" q% Z4 c: I4 P$ O" Q2 g
1
6 j9 J3 Z2 O+ P1 \: y7 c
2
" W7 S W' S" V; A2 R
3
' o" }1 }2 m5 s/ v3 K" ?
4
4 J8 R/ n1 b5 ^# D! U
5
" Z9 ?* R5 n, L) T% M+ r
6
$ ]% [( y0 e$ v8 K
7
: m$ X6 K3 k* P) @# Q. Y
8
) i. c: r0 b V7 M
9
( W5 A/ [$ Z3 f
10
, P5 D; D* D( {/ v/ q# u
11
5 u5 L& X6 a5 l8 a/ Y" l6 A; P% f
12
3 c1 B9 O9 l5 J( h7 t
13
6 Z& K; U, }8 S' z0 e
14
F' O9 U1 R, x$ P: j7 ]5 X
15
6 v) I. Q$ [& [$ Z
16
; z9 }% C# [8 m8 H' R6 I
python除了做爬虫数据采集,还可以做什么?
" c# P6 M' i7 l1 @1 T. D& ^
兴趣学习 还是 通过python技术赚钱 (就业找工作 / 外包)
3 J& d& A+ N1 c, D. ^ M4 r
) e8 b/ R) j7 H6 A; ~; g8 ]0 M
3 B- J! Y5 V0 ]' O! D3 C; B
网站开发(就业/外包) >>> 我们课程是教授的全栈开发 薪资 13K-15K
- E8 t" I* D+ R [5 Z' o
比如: python开发网站: Youtobe / 豆瓣 / 知乎(以前版本) / Facebook / 美团 ;
; ^" V* o$ g- y u7 {8 H9 E
我可以做到这样么?
( @' I4 L4 y- e1 t, A, q
0基础 初学者 从零开始学习,上线 通过 域名 服务器 数据交互,4个左右的时间 就可以独立开发这个项目 类似知乎的网站;
Q% l$ F" h# M. z2 P9 K
如果你做去外包(团队): python开发就业 大多数也是进入外包公司 一个 10-20K左右;
4 Y6 k+ I7 _) M$ F. _
: O9 q; L4 G/ L! k$ z
% [0 T4 x0 b/ c1 z' B7 c
爬虫开发(脚本)(就业/外包) 可见即可爬
$ @$ V' j3 ?5 g6 s# i! | A. f0 d
虽然爬虫什么都可以爬,但是获取用户的个人隐私(信息 电话 身份 贩卖 )、国家信息、商业机密(未公开数据,或侵犯版权)、色情等违法信息用来盈利,就基本上人无了!
8 v& a, S- P: _2 r
很多兄弟问我,可以帮我淘宝用户数据吗? 我都是告诉他们,这个我还想多活几年,这玩意涉及隐私,个人信息,你可以自己学了悄悄爬,爬完记得删了,用来实践问题不大,但是别用来盈利!!!
1 O' I' ^* k: J. U6 x. n
之前有个兄弟爬取微博上面军事武器航母图片买给国外, 然后就进去了!所以奉劝大家,切记切记,别乱来!
5 h, z, V5 I! u9 ]/ i, f4 `
1 m; o' D. \' h, A8 Y( [
2 @, |6 H+ K- G8 H
数据分析(就业/外包)
( N5 b& ~3 b1 w) b
. S6 D3 x8 G1 L1 X
$ h# B4 L" D ^ Y$ [$ }0 Z
自动化(脚本)
$ p$ m* i, D1 z0 a l& |" E6 j
) J z; M: _5 I$ T: a+ }
% t, h2 H7 l- e* ]" h# [: N/ m
游戏开发/辅助(脚本)
8 Z% s4 c) s0 [! _6 P
1 L/ U% y$ ?9 W* Y5 F
$ L+ b( z, i5 J1 w% T% ^ |- ~' a
人工智能(研究生以上学历 要求很高)
5 D, W' N- A8 w0 z1 r! Q% E3 x ?
' i, d8 s/ F$ S0 n, c; B
# V; X% `9 Y+ h; @: f% X0 y
等等方向还有很多,我就不一 一述说了,那些方向对于一般人来说作用不大。
4 m* w2 s5 O0 ?3 H
( ~- R3 ^5 P0 ~' C
0 S5 G: H( W9 [1 Y- ]. s
我们开始正题吧
% J6 `+ Z2 F3 S2 |1 e
# d% m( A( n2 d5 t8 L4 R9 A
. L! H* ]' j4 G
爬虫部分:
5 ?( C! l) K) f% a' D/ y
发送请求 第三方模块 需要pip install requests
; T) Y7 `0 O" o% O
4 s, [6 J. v, z- i0 O
: A' N7 w+ g: W& @; }
import requests
8 X8 u+ E* _2 a9 {- K0 o, ~
import re # 内置模块
: e6 X$ Y4 B0 L% A3 r; B
0 `1 Y, J s% F& o! \# v1 G& X
6 }/ ^' W8 b! G# x
url = 'https://api.bilibili.com/x/v1/dm/list.so?oid=376200196'
% @# C/ C& D) ?, u, z% G
1
8 V4 R$ y/ L5 I" i
2
- L" V3 c" g' R2 [* L1 T) Q
3
' s# H4 U! J" a5 m& H
4
+ X- S+ s& s# w/ L- ~9 W& g. x
请求头的作用就是伪装
/ s8 R: \( r0 z) t& Z& F+ w$ G* d
2 i8 w: H( @" O$ u5 D+ L
0 u: Z, H* s( W6 n3 O0 p
headers = {
5 ]! D0 u/ A& Q0 m+ v2 |7 l
'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'
7 N1 U$ \9 U7 ^8 w) S
}
+ P8 U! N# f& w1 {6 ]
1
5 ^3 i* A- n6 v4 _8 w2 b9 u4 Y
2
8 L6 j. [9 n8 ^* s; C% a2 ] ~
3
% S4 \7 p+ ^6 Y
模拟浏览器对服务器发送请求, 服务器接收到请求之后,确定你没问题 然后会给你返回 response响应体数据
! t( t; t) J8 @, O0 W& M0 m% w
函数传参
1 T* t0 k. a3 k+ g: F8 |
7 j: I9 }4 L6 _ J w" A ^
' k6 J9 D( W, U! o
response = requests.get(url=url, headers=headers)
2 W7 s/ |1 q& B) J S" B
1
$ M! n. m$ L) N
<> 对象 对象意味着你可以调用里面的方法或者属性
r' N& H3 N$ G" T: U7 L
200 状态码 请求成功
" K- G$ P8 { K$ C) j
获取数据 文本数据
1 I; p# S1 B0 H3 L. Z# g. E; [- i
自动识别编码
5 R) q1 t2 ?9 J7 c$ H
* F8 m* f/ h9 b4 _; J6 { F. b( U7 x1 [7 A
' H9 ~ C' a7 a$ [5 Y
response.encoding = response.apparent_encoding
1 t0 s }7 W# C* O
html_data = re.findall('<d p=".*?">(.*?)</d>', response.text)
% w6 a* Y+ r& R f& G) O# _6 I
1
7 W6 K- b5 U* d
2
1 u: u U$ D) v& B
content_str = ‘\n’.join(html_data)
1 p, x' g% b! \$ U* ^
2 ~: ?7 L+ J5 u# b
$ @, h# f( I4 n. C) N
要列表转成字符串 ‘’.join()
1 [+ H, l) ?0 x4 {$ M+ b1 k% x3 M
for 遍历
! K9 t/ X0 u% c0 x4 x9 c
保存数据 保存字符串
5 r+ B5 E# l( o3 ]8 Y' q; i
for content in html_data:
* V- L v. Q) E8 y0 N
# mode 保存方式 w 写入会覆盖 a 追加写入
4 n6 F0 E7 p$ t" P2 P% y
with open('弹幕1.txt', mode='a', encoding='utf-8') as f:
7 f$ `$ g2 D5 \2 p
f.write(content)
. `6 a+ z' _ C, E3 o+ c9 S* R, C
f.write('\n')
- O- i' y3 d8 B) o
5 F! i! {! y, y6 H9 l2 o, v7 ]
% t- ~' s( ~" t# u* x& M
# print(content_str)
) [% H7 M( R8 U2 q; u& B
1
3 L9 l% S" L" w! |" L
2
2 \: w- R( _! `( x- |. R# w1 k$ }3 Y& ^
3
' ^+ x n- W4 ~0 @5 b; e F
4
' B& W& M! Q& u% a2 G/ X( _- s
5
5 Z! s8 M; ]1 r1 J3 B
6
6 H6 S C2 i4 Z8 ~- V4 ^4 h
7
0 D, m) {6 J H" Z% \7 v
爬取结果
2 W H" d. ~) z. K1 o
. o( M$ d/ r) A; [! ]+ z5 A
* A8 ?( b N4 [6 f: _; N% H* v
/ A) ^0 f5 l" ]1 i% h8 H
1 N1 Q* [+ S, q- y2 o4 r* y- {
然后我们再来实现制作词云图部分
0 V5 i6 u) n x$ U& H) ?. [' D1 x
* D7 P$ o1 i6 i8 t* s3 E7 ?( m
& U+ m+ M+ X9 l# u5 p5 h# p7 a5 q
首先要安装这两个模块
- b5 l6 y+ T, R' W
4 C- y) u! L5 I* p) S- L7 |( V3 u
3 }4 x/ p9 X4 q! ?! I0 z
import jieba
* Z! v! I! e/ O( D8 c# y' k
import wordcloud
! `# b) y C. Y$ [! q2 X/ U
1
' Q& @" O, I- P& c
2
1 z, f/ `! _/ S( |
一个相对路径 一个绝对路径,保存好的txt文本名字要注意看一下,不对的话,记得改一下保持一致。
7 T1 k: Z6 b) a7 ~) S Y
5 x2 B5 r0 R3 k
& ]2 d \! i. X, u7 @9 y
f = open('弹幕.txt', mode='r', encoding='utf-8')
2 ]& i. i9 }2 F& t5 e
text = f.read()
' [, G9 X4 V) B8 {6 C- j
txt_list = jieba.lcut(text)
. F$ x$ ]; D" u8 {/ |& K
# print(txt_list)
& B- ^5 J) p- n' ]. r
1
, J$ Z3 z( v* r; t: D0 r* b
2
/ D3 |/ A) U# ~
3
4 W! z) E( T' q) F' W
4
" o/ d: V2 a4 }9 M( {
列表整合成一个字符串
! N- @7 s! ~9 a! J) H& I
, z! v& m$ b0 m2 }* [: o& o
; F! l; ]. ~6 E# d' z. H; w
string = ' '.join(txt_list)
* E O: V5 W; U$ n5 K0 r% x
print(string)
& }7 o1 ~" I0 O* Q q. ^3 [
print('---'*50)
4 T7 I/ @; s& ^/ v3 a9 h
print(str(txt_list))
9 T9 ^. @% ~4 E& r
1
) ^: n0 b7 r. Y( o: C
2
! a% x7 y3 h6 l4 I* T5 s
3
; N/ ^9 X# q9 s0 V
4
+ {! L9 S6 ^( ]! {4 ~: R
词云图设置
, J/ Q; B% \ b/ t& `
% H1 Y- R( u8 M! b
0 W0 V+ S2 X2 C9 |" d! _# p
wc = wordcloud.WordCloud(
" Z# A2 S [1 j. `3 ~( h& v
width=1000, # 图片的宽
* ^4 W4 j0 Z* Z9 w
height=700, # 图片的高
0 L: K, x! e5 H
background_color='white', # 图片背景颜色
# F4 T$ ?1 K: L& J7 }) [* _+ ^
font_path='msyh.ttc', # 词云字体
3 y3 |8 ]9 p) E5 u6 |( r
# mask=py, # 所使用的词云图片
+ \+ A# q/ R( r6 r
scale=15,
% h8 @5 v. i0 t; y
# stopwords={words}, # 停用词
8 S2 H! L! x2 |4 L; _2 ?& a
# contour_width=5,
; B- f/ J7 }+ h% `
# contour_color='red' # 轮廓颜色
. M- U4 I% _6 v$ j: F6 L9 {
)
! f. S- _: o F& {
1
6 T- I0 G) W5 `. @" S
2
# {6 c4 V$ @* t% R
3
. u- D# p) {! H. [$ O/ y* j
4
( o8 ^2 q- k; H' Q- T
5
0 g* y1 d7 V: `/ e# d1 N# H0 X
6
7 D: H2 w( Y8 P- h1 _
7
! r! i6 [3 s# ~* S: q5 l: h! M7 ~5 y
8
5 |4 h1 R n" E, q2 u
9
. @3 A0 u. j4 x8 g# ?
10
) L* q7 r( P& K8 I
11
% j/ s+ v( P3 R0 [) Y3 e7 Z8 c3 n
给词云输入文字
- f2 W/ X- p2 a& c& O5 `3 p
7 p8 v& L& u! h" r0 i: t
/ k" ^* u0 r! @5 m X1 p7 B
wc.generate(string)
9 c; D6 B" C' Y% a# \
1
3 H9 F8 I' V2 b, b9 S. P
词云图保存图片地址
! o) D/ P+ V% x, U0 w! J9 ]- G5 c! n
! ?) W9 c: t# N
6 }& V( R6 d; r1 A. T# L$ K
wc.to_file('output1.png')
1 @4 b5 p* o" @5 G
1
* H0 N/ p- f, F* x/ C3 ? N. ^
词云图的过程中有点慢,大家不要心急
4 A0 U2 N, }4 @$ I
4 k9 l. ?% t4 W9 d. j$ N* a
/ ` O# I2 g4 O1 l
这是最后的结果
# \3 y! h y3 E2 v! {
' q5 {# {/ T S. [& q, \5 U: f
0 z: c% A. F" E) X4 E
没有加停用词,所以一些无用的词比较多
9 z$ ^) @! a3 s7 w. t8 J% u8 ?3 M
) \) [9 P& i% e; C( Q) D
8 q* `$ c% _7 P$ L# t0 Y3 Q
stopwords={'了', '啊'}
0 W& \( w& t# ]1 F4 l' N9 @/ b
1
: _( U2 _6 r# o0 c) @
把这个部分的代码加入要屏蔽的词就OK了!比如我现在把 了 跟 啊 这两个字屏蔽了。
8 Y; w7 b# L7 A# y6 W; y7 y7 ~% U6 `
我们再来看下
2 x% K# |' u6 f8 m" Y% U
; m) z" [1 [0 k0 a" i; x
z M& G* m/ e3 D5 V
不知名网友:666666 牛批 老哥我要学!!!
+ ~* Y% s& i# E# O0 _& [. d
+ F$ ~1 W) R+ i; Z9 E
4 e; ?- u! J' X
1 M. M- l9 E, m3 a
$ t z2 \, w# e
————————————————
) F% { {6 f' X2 P* B
版权声明:本文为CSDN博主「编程界的泥石流」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
- U8 W5 y& p: A. V+ M7 ^
原文链接:https://blog.csdn.net/ooowwq/article/details/119211907
' a4 E- y9 M) B( [- [
/ A* c0 c3 A7 G! W9 @
, b0 G0 I# [$ A. o
欢迎光临 数学建模社区-数学中国 (http://www.madio.net/)
Powered by Discuz! X2.5