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