数学建模社区-数学中国

标题: 用Python把B站视频弹幕爬下来,绘制词云图看看大家最关心什么! [打印本页]

作者: 杨利霞    时间: 2021-7-30 16:25
标题: 用Python把B站视频弹幕爬下来,绘制词云图看看大家最关心什么!
7 `) g6 p+ s* ^0 G
用Python把B站视频弹幕爬下来,绘制词云图看看大家最关心什么!0 F2 _3 |3 I/ T, R! ?/ l1 O( q; t
今天带大家做点好玩的,把B站热门视频弹幕爬下来制作词云图!7 w1 t; k$ M& o% X2 B+ h
康康大家都怎么说!
* `$ ~, P4 T4 }6 d
$ A# E" o) j2 j" l/ I

& {1 A$ q2 f8 ?  N
6 V$ ?9 V8 S7 _3 y7 h
+ t$ v) e) J. u6 [
开始之前先给大家啰嗦几句,可能有些兄弟不会安装模块,我大概讲一下。( Y# s1 f& E( i# W  w( m; ?

7 V1 O; \# c2 ^+ A: }/ b3 U. t
% s8 g" d& z$ s/ D1 M
如何安装模块:! q3 ^6 E$ j/ }7 a* p, G# n9 {# i
) @% A: l! J- ?9 [) N

# O7 j, [( v0 X2 k9 wwin(键盘左下角ctrl 和 Alt 中间那个键) + R 输入 cmd 输入安装命令: pip install 模块名 回车. ~" [; c& [0 c0 \* I' V8 ^- b4 z
pycharm里面安装 terminal 输入安装命令: pip install 模块名 回车
" v% I0 ]0 R: I' x如果模块安装失败了,可能是这些问题:
. e( A# L( R' e
+ \! |9 u& A1 [0 P* \. i

7 o/ |( g& H  N% I2 m! J6 o提示:pip 不是内部命令
# C1 b! R1 s$ k  ~5 _" c你python环境变量可能没有设置好7 [; a: ]2 T7 E
有安装进度条显示,但是安装到一半出现报错了' T$ E5 F. a' }0 R
因为python安装模块都是在国外的网址进行下载安装的, 国内请求国外 网速很慢,下载速度大概只有 几KB# u5 H, h5 @! [
read time out 网络连接超时 你可以切换为国内的镜像源' j! G% K  e# C9 H5 x  D( }3 C; |: a5 X
明明在cmd里面安装好了,但是在pycharm 提示我没有这个模块6 b9 D3 |9 l5 q1 _
你pycharm里面python解释器没有设置,你在pycharm设置里面重新设置一下
) y3 q7 Z. e! R: C可能安装了多个python版本
# M9 Y4 M5 R: i( F. W/ _: g安装一个版本即可5 R5 K; m2 @) B  T: [
Python做爬虫到底可以做些什么呢?2 ~: l3 J5 {- B$ \

' J1 b$ |7 \: a: {8 T% O( W7 x
6 K  U2 M7 [5 ?1 s" ]& s. f
常规: 爬取网上的数据 / 我可以批量下载图片/文字/音频 视频…
# _/ ]. P) Y( A( T12306抢票 / 京东商城电商网站抢购脚本 / 朋友圈刷票 / 一些问卷调查自动填写… / 文章刷阅读量 / 音频 视频 播放量6 T  A1 V. [, P2 ^  _7 q
可以刷课 可以刷网课 自动 还能自动批量注册账号% L3 x6 v! X$ k; h, M( u) @3 G
模拟点击 >>> 游戏辅助 >>> 修改游戏内存(单机) …+ D4 E. w* s" X: i. s' L, [' Y4 u
普通B站视频可以爬 番剧是需要会员的
- j" U! y' f) N% A+ f2 w2 P
/ H" {+ y: K1 U! N3 ^* `9 F$ }
6 V  O9 b3 M) p5 ]5 C2 M( u4 y5 S
爬虫都是通过开发者工具进行抓包分析 查询数据来源 ( 静态页面 / 动态页面 ajax异步加载)3 `% Z- e  Z+ x( n

2 q) d4 \. \( \
% x# X$ a# l: }; U- Y& K
1. 确定目标需求 (弹幕数据 那个视频弹幕)  z  F3 T7 ~% A6 l1 _" ^
    确定了# O* r  S1 t4 g$ C7 c5 E
2. 找数据 (数据的来源分析)- f/ `  m! g9 M- @$ U: E4 [) g0 `) I
    简简单单 找到了
1 l# [7 g+ j- c4 n6 r% I3. 对于数据来源的url地址 发送请求 (请求方式 / 请求头)1 [" \" h' B8 J+ P. D* \
    请求方式: get / post
1 w( L: Q: z1 o$ D& W    请求头: 3 R2 Z5 _7 k. V! @
    https://api.bilibili.com/x/v1/dm/list.so?oid=376200196
$ [9 h" r% U  g+ e    (通过开发者工具去看一下数据的具体来源,是否是来自有这个网站)& T7 H, z! l) c) I5 L% `- d& B
4. 获取数据 $ V* X" u( E" k9 F
    文本数据 response.text 获取网页源代码. H! C( x5 Z: P( _) E' k
    json字典数据 response.json() 通常一般情况是 动态网页  ajax异步加载 用的比较多
" T: ~! |$ T) J* L    二进制数据   response.content  保存图片 音频 视频 或者 特定格式文件
# S  J/ y8 \) x5. 解析数据
1 v) F: f* C& t4 s2 i6 _2 F! g7 S8 a    正则表达式 .*? 解决一切  遇事不决 .*? 通配符 可以匹配任意字符 3 P3 G* C# r5 s' K* E. `
6. 保存数据9 O5 A0 l" S% G' u
1: w' T( e: |$ b6 i0 c3 ^; O
26 \3 ?$ L) o; U' t$ D" E3 U- ]. T
3. V) L7 K. p" ^! ]+ }& }
44 j; T1 L, L6 v$ Z4 j
5! o8 ~1 }# A  H+ N3 y1 T
66 |) G9 X$ `+ c; \9 O. V$ A
7
6 ?( Z# |" t$ X! D8" ~5 r$ c3 U$ E6 S5 {
9
/ B% J7 o3 g; |6 k/ m" W" m10
: D  d) q; v& [$ s* @- `11
& N0 f5 U9 h. Z/ Z3 e. m12
0 E' W; f0 g. D+ \$ E13& J" N) J9 m2 r# y  \4 b
14
6 o0 N2 }: K+ ^& I3 B% S, U8 J15
: R- z2 N" `/ D% _5 l" V, e- o  ~16
* Z. ~3 P, u$ c3 Y/ Kpython除了做爬虫数据采集,还可以做什么?. S  w- x6 s/ H$ _
兴趣学习 还是 通过python技术赚钱 (就业找工作 / 外包)0 d; Q( C+ {# |- M4 a* L

# j8 I) R, Y  {7 g

+ b( u! ^$ A3 i/ N; H网站开发(就业/外包) >>> 我们课程是教授的全栈开发 薪资 13K-15K, e5 I; G* i) L
比如: python开发网站: Youtobe / 豆瓣 / 知乎(以前版本) / Facebook / 美团 ;# K8 E3 e: D  E* i6 j) N; ?( a
我可以做到这样么?
+ m% x; J  m9 P' a1 U# U7 S0基础 初学者 从零开始学习,上线 通过 域名 服务器 数据交互,4个左右的时间 就可以独立开发这个项目 类似知乎的网站;. M+ L# L( x; P3 L8 k: s* z
如果你做去外包(团队): python开发就业 大多数也是进入外包公司 一个 10-20K左右;
" u5 A- g. D1 U
# g, V: y9 j. |0 d+ e
8 {1 ]7 _* S/ v9 b. D
爬虫开发(脚本)(就业/外包) 可见即可爬% F# n4 @! c9 \' J( F# k
虽然爬虫什么都可以爬,但是获取用户的个人隐私(信息 电话 身份 贩卖 )、国家信息、商业机密(未公开数据,或侵犯版权)、色情等违法信息用来盈利,就基本上人无了!
/ M$ H# o" M) H' N1 u+ Q1 `很多兄弟问我,可以帮我淘宝用户数据吗? 我都是告诉他们,这个我还想多活几年,这玩意涉及隐私,个人信息,你可以自己学了悄悄爬,爬完记得删了,用来实践问题不大,但是别用来盈利!!!* [9 a; q8 N  r* p$ j. Q
之前有个兄弟爬取微博上面军事武器航母图片买给国外, 然后就进去了!所以奉劝大家,切记切记,别乱来!! A" q) u+ p4 @% v# _

7 Z, Q. ^7 m9 q2 N
1 X# @( l5 \  q% n5 b# z
数据分析(就业/外包)
$ x& n9 I+ A- I) \+ m
# O1 \6 S' U& c5 _. q9 x" D
; ~4 S2 U8 S4 _3 b& }+ O7 S0 s
自动化(脚本)
! ]! r. ?# ~! m/ _6 F8 o
7 ^) }# b9 |5 {% }

( h- _; L/ A$ S0 w2 [' W9 N- }+ Q游戏开发/辅助(脚本)9 r2 C3 [1 R: _# z

+ u% s: [3 Y! L4 L& ~) i

  U* u* o1 B( B人工智能(研究生以上学历 要求很高). u! Y! U9 E5 s7 c

. B0 g* k* y+ b% K5 j; ]

+ q4 `1 r0 G4 V' e( b6 x9 z" s等等方向还有很多,我就不一 一述说了,那些方向对于一般人来说作用不大。
. I  g7 q. |5 t% q- \* p0 n; U5 H$ b/ `: [( Q5 u$ t" O# A7 E
. v& y/ l$ \2 D/ M) N) Q2 Y
我们开始正题吧
- J" g) z) L* `
) x2 m& M0 n& ]3 m' w

7 \, m- z' a. X/ ^1 F爬虫部分:5 D8 d8 f1 d/ ?
发送请求 第三方模块 需要pip install requests- @( f7 l4 J: U
8 p; t/ f4 ?, I2 V
5 h% P& _$ [- L& i" `
import requests
; t$ n* ]; B. ^. }* Q1 Yimport re  # 内置模块, q- C# ~8 J* O  q4 `  e

4 g0 f( n: g# k! F- t1 G

; M! `, y+ r+ }3 N3 furl = 'https://api.bilibili.com/x/v1/dm/list.so?oid=376200196'* _1 o! o2 [$ s  R* ]
1
3 S% f' L1 \0 T2 h2
% x: }$ X5 {3 D# R  m& H. Y4 [% n3/ s! k: A0 U% S( D! U
4
. v# p5 X9 j" ?, A  D" I请求头的作用就是伪装; y# E" y8 I+ w7 E, c: U: X6 w) D1 K

1 O% m) E% _& H9 S4 p

1 f  _1 e& E- c0 P4 F; ?" Kheaders = {
/ W0 z; ~# ?  Q! y' ?0 X* [. e9 R    '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', K! p9 j0 B$ \; x0 `# i$ y
}8 }& J1 b( y6 H; e- s( P. t; _
1
. _/ D3 i5 b/ c2
/ _2 T' G. c% r0 Y7 c: b" E36 ^1 E& O) A! Q6 Z" E4 c9 U% k
模拟浏览器对服务器发送请求, 服务器接收到请求之后,确定你没问题 然后会给你返回 response响应体数据
! M8 m) v; y2 l3 k函数传参
' Q/ e% g, h, a' l0 i& T
" A1 a2 B9 C" t

9 a5 g( f  T+ h$ [" z+ tresponse = requests.get(url=url, headers=headers)
3 Y& h) D. d* C0 \# i/ I2 [1
* Q% g/ a* ^6 W) \! D<> 对象 对象意味着你可以调用里面的方法或者属性6 a; l: i% v3 k; E! T& x& L. @
200 状态码 请求成功6 G. Q" Y) B' q  o+ \
获取数据 文本数据( C0 W9 C  C( V$ t7 R
自动识别编码' f$ _4 A/ `- J. P: H% i' m
2 o  f# k" H" {; y
* i: D* g) P* f" \5 r/ q
response.encoding = response.apparent_encoding. d1 a$ v6 W  y3 I0 v
html_data = re.findall('<d p=".*?">(.*?)</d>', response.text)$ M5 F, o( Z  u$ _4 X9 q6 Z" z/ W
1. g- t5 F) e$ o( W6 F; y2 h5 P
2
: V' e. r0 H% X9 ?+ fcontent_str = ‘\n’.join(html_data)
+ Y+ U* Q7 n7 |) i) r  v. }. b  J: K: j0 Q" E& z) H+ E7 w; e

, _3 X$ B) e9 e$ s要列表转成字符串 ‘’.join()
. ~! p$ q9 B, `# Dfor 遍历
8 P' ]& k1 g4 h( o- M保存数据 保存字符串
6 h7 r" e% Y+ p0 a( o+ Y; n9 Kfor content in html_data:; L) S4 [8 E4 h; c' f( u7 o
    # mode 保存方式 w 写入会覆盖 a 追加写入7 C. ^7 C' y, p
    with open('弹幕1.txt', mode='a', encoding='utf-8') as f:3 l# z0 S% Q2 x1 D
        f.write(content): S  ?. c& v' e" M1 z. _; M& B
        f.write('\n')& H3 T. w! _  j6 o' W. p& l' z

1 D" F8 u8 @5 _# Q) k, ?5 p: k

0 |0 V4 T6 c( R9 ?, W4 {, U# print(content_str)* Y8 s4 G! `) ]/ s$ g
1! E  b% Q( u6 H4 X1 j( H
2
5 o( Q, ^# N* j: T' a, v2 Q3
1 l+ P( C4 J, b4* g- ~4 ~* R8 T  N4 a2 a
5
3 T9 ^2 H6 j9 E$ t: @6
8 E8 w. l; y$ @/ e70 e* g1 f$ v+ M3 U& ]
爬取结果# F. J1 Y1 k1 Z4 \" }8 z

/ ]2 `% m; g- w* D! |: b. q9 h
( @. O- I9 V5 Y& a( K

. }6 R2 @. I, ~6 E6 }

3 a& ^0 D3 {8 h5 V% H! l然后我们再来实现制作词云图部分8 Y/ Y+ j. c( n

  ^% C! R& `2 h/ Z

# N* A7 z$ T! `; T' R& [首先要安装这两个模块: m% R7 L3 p# ~/ ~' K5 A/ k- A
9 r1 z# Z9 R" g( j5 U# ?
+ F, E9 o7 Q( ~$ s) I0 C# A$ t
import jieba) a! }. q* f  T4 r
import wordcloud
! r- l) v- d% I6 m1
  G% h) o' D3 A+ d29 f" g3 c. G. u2 b* U+ h) D8 p
一个相对路径 一个绝对路径,保存好的txt文本名字要注意看一下,不对的话,记得改一下保持一致。
1 ]2 E5 v/ r# D2 A- P0 e7 j. X" w5 [: r$ N2 T

9 Z5 W# u1 n& W: B* N  Gf = open('弹幕.txt', mode='r', encoding='utf-8')' y  p3 k0 @. V% X9 b/ y* `
text = f.read()
- V; F- U8 b& z0 b# ftxt_list = jieba.lcut(text)& W, o  Y! I/ |& k! ]5 U3 j0 Y
# print(txt_list)
$ C2 f! X5 e# \& C( o& l# `1
: I3 m% r( f5 B" j+ P/ \5 M6 Q2: q) A/ I- }3 B: S8 G, m
3
8 Z) a: o, ~3 |% R' K4( x. b0 I* K! [! X" t
列表整合成一个字符串1 V' O' _8 o) z, n6 d
/ g6 g6 g+ f) U% e; ]5 n
+ J# o; ]+ Q1 |
string = ' '.join(txt_list)0 V- h" ?! k! X* P( a" \! I( s
print(string), n& ^8 p1 H' I. `! e- Z
print('---'*50)4 d: S' A8 J8 p
print(str(txt_list))
  ~  E1 M  K! ?4 z19 j7 n* [5 ~8 U5 R
24 w. ~7 {9 [0 h( M8 Q! y' I) Z
3
* {9 I! a( |- v# {2 A+ I4) z: b" j+ T8 ~7 `
词云图设置* Z( ?4 f" h% Z) F# h$ r- r+ w
$ P; q8 V, c$ P2 F

5 ?9 J9 l9 W# ~* [' u, w3 xwc = wordcloud.WordCloud(
! S  X9 j# x# o4 }% ?5 u. r( w+ h        width=1000,         # 图片的宽
. N, |! E) c# P/ e8 h        height=700,         # 图片的高- N2 y8 _  o& ^
        background_color='white',   # 图片背景颜色
3 ]( u5 @1 e* P        font_path='msyh.ttc',    # 词云字体
. z! l) N5 C+ G4 F        # mask=py,     # 所使用的词云图片
( |+ s1 u6 H, z8 V$ p9 v        scale=15,' o% f2 h2 f* ]. I
        # stopwords={words},         # 停用词8 N0 }# |) ]6 r# S
        # contour_width=5,9 D7 h# w; m" y, l" o- O- b
        # contour_color='red'  # 轮廓颜色8 A  u2 W: s! i+ J, ?9 p* F
)/ f& M9 u  B* `- i; Q
1
8 p' {5 h' b' \! |8 a6 B% w2
" }- |, [$ f7 Q8 B% m3
$ E) J7 h- t1 t1 x) {: z6 q4
7 b8 W- I4 ]( v7 I0 N- r5
1 ^4 ~* u# \& m- e# o6% A# c" [1 k9 M0 h& n' i7 p
7$ h) L4 s& d6 i% _
80 y- g1 {/ T1 k% w& O1 E/ B8 U* ?
9
8 U$ i% n: o. s, i/ H10
' s0 A9 P( Z" w: N4 v. ~11# _( ~8 Z- G2 o- U
给词云输入文字
% o8 {* _! ?9 v, d: W0 m7 d. J- c# I( o) `0 b8 ~

, W, O9 U) Y" m1 _1 Jwc.generate(string)6 E5 U) w# }! Y5 [. j1 t  e7 w9 G
1
/ K% A+ X  |+ M" M词云图保存图片地址
; c/ x" `5 I- d$ l8 g: U, B0 H# {7 N8 ]

0 p; D1 J* }: i; z& F2 C; |wc.to_file('output1.png')
/ O9 D: B! w$ V2 v& o1: ^9 z/ m- G6 i. j
词云图的过程中有点慢,大家不要心急4 a+ Y; r4 P& Z; [6 U& @
% Z6 j+ r* w7 c6 E

6 P! j9 r& B: z* e' O这是最后的结果1 P( y0 a3 y- e$ S. V

3 [  r3 l( e( @: q  Z0 W$ t" ]3 K

+ Q( x' D" b$ V( ^9 h没有加停用词,所以一些无用的词比较多
, T& `6 p) B2 ~- T# B
1 O) a. V5 W8 k9 v8 X' ?

: I* d$ }7 C4 [6 ~( G2 O7 S0 ?stopwords={'了', '啊'}) W! T  @9 S7 G  _
1
  j" c/ E; P  \1 X  M把这个部分的代码加入要屏蔽的词就OK了!比如我现在把 了 跟 啊 这两个字屏蔽了。7 t2 l' {* D9 U
我们再来看下
8 Q3 n; o3 F& z: {
' @, W4 e, u, k, a* Z" b

0 _/ D- P; {- P% ^; J2 C' r不知名网友:666666 牛批 老哥我要学!!!
- a8 ^; Y* F: I
4 z2 q1 \& E" t
2 ~6 C" m  V" y6 e* v% V
2 }( O$ N% O* l$ c: @% c+ @6 e
( k( V0 F, y9 Q2 \- E
————————————————
4 ?& c1 U6 T* I! O* T+ S4 Q版权声明:本文为CSDN博主「编程界的泥石流」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。  Q% @2 ^, q7 `# F' a* m1 t! e
原文链接:https://blog.csdn.net/ooowwq/article/details/119211907
6 A* P$ z2 S# b) h7 T) |- ?- e8 n/ i; W) M- S5 |
4 X' s" e0 T2 i. M3 J$ O





欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5