数学建模社区-数学中国

标题: 用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 Wwin(键盘左下角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 Jread 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# VPython做爬虫到底可以做些什么呢?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 R3. 对于数据来源的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( e5. 解析数据
4 w' d5 A7 u: W2 M$ T# l/ r    正则表达式 .*? 解决一切  遇事不决 .*? 通配符 可以匹配任意字符
& C3 d& U+ h' d: X8 p8 H6. 保存数据
9 ~4 W" |6 B6 b1
; }: |$ A* X8 s" @: u% Q; ~5 H21 B' Y/ h  u! m, R
3
' \; _# z# T3 y" w, E4( {/ e( g" x2 S3 P
5# k$ I% d% F# m' D5 k
6: |' d# m6 r# L% B
7
- |- [" ]8 c! u/ ~/ t8
% e& q; r% a# j  S93 P( X7 e3 y, x) g3 s1 g
10
% G  Z5 V: H; m5 r8 c9 a11
9 \" i& ?4 d$ T. B0 ?4 I: T12
5 X, T8 t  X3 E3 O5 s- J13
  [1 h) t1 ~! `. e7 V* G14! R$ [& c+ f' }5 @
15
9 o) h4 ], B' i' K3 x16  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. g5 o9 a  B2 @5 z4 S

% O" r' r+ j* w; Aimport requests
5 b; I' Z% W/ E1 K5 `1 |& Gimport 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% }. Y3
' l& Q+ E+ Z6 v. w4
, O8 f5 P% F8 \5 [: ]3 W7 j) A请求头的作用就是伪装
0 S. [: X3 d7 C9 u. f6 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 ~' d34 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& L5 A) v9 Q: V( v
7 o9 [$ E; \$ P4 c- X5 M
response.encoding = response.apparent_encoding
6 W0 y' l2 |: S! P# L, ~' fhtml_data = re.findall('<d p=".*?">(.*?)</d>', response.text)
5 q+ E9 |1 R/ u, u1
8 T: m7 O+ t6 {# m1 v5 D8 i2
: B; f/ N/ k5 rcontent_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* Qfor 遍历
0 H8 ]6 h6 |& R. u保存数据 保存字符串
+ i' n/ j* v4 X# A8 X! sfor 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 b28 D% l2 J. @! c" y  q/ Q0 t
30 ^  V% m9 F: u( U& e7 j0 M
4
9 f/ e% b/ u8 \# W. H  `1 d5
( e4 S: e( e0 M6 e) _+ F6
' R8 H1 x) M! q  b" T* r6 H9 Q0 X74 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& a3 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* uimport jieba) ?: b- `' z3 \  q
import wordcloud
8 o# n$ ~) F( V# `6 L1
! u; z( @. R% w/ q6 U2
" 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) ttext = 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 f1
% k+ A- q7 G; u- X  Z2, 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+ tstring = ' '.join(txt_list)
' h% S' Q. A! Y; H  \print(string)
  m( \6 T2 I4 k8 B. N- eprint('---'*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
32 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 Twc = 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 @20 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 `* E5
% B5 Q$ S, Z/ j/ L, L# T3 z6
& s4 ]. e8 m) v77 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* g117 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- ewc.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 }& Kwc.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 t5 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  ?) mstopwords={'了', '啊'}
& _% ?% \  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