数学建模社区-数学中国

标题: 用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 Vpycharm里面安装 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安装模块都是在国外的网址进行下载安装的, 国内请求国外 网速很慢,下载速度大概只有 几KB5 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: b0 ^; ^/ 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 N1. 确定目标需求 (弹幕数据 那个视频弹幕)8 @5 f5 E8 ~5 P3 Q& r
    确定了
. W3 @+ R1 h8 F2. 找数据 (数据的来源分析)) 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, B5
* Q+ n# z0 r8 J6 G6
, o/ b# c4 {/ _  L; m7
$ t" ~5 Q6 K/ j- u6 k+ {7 C88 p9 p- r" p+ J9 u7 h" E7 A" P; B
9
" e; V5 n9 W6 R7 t# c/ U  N10/ @; f, m7 y! C+ P9 x# r7 [
11
- p7 `$ M6 g8 g4 n4 u; w: i12
: T! ?2 J( b3 N; E6 I0 Z13
) v4 E& }" m- s146 Q9 t( P$ X' X6 @! e
15
6 ~& Q* A, l! Y' O. z16
. O9 y, P# e0 z9 opython除了做爬虫数据采集,还可以做什么?
) 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* u2 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 fimport 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. n2
7 |5 I9 n5 _3 R2 V37 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 eheaders = {
% |' 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. `+ a1
! i! B& z$ z! f4 L! I2 S2
8 X/ }6 z% B* u3
& 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 vresponse = 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; Mhtml_data = re.findall('<d p=".*?">(.*?)</d>', response.text)
3 J5 E" s' P& ~9 f1
& L3 }3 D) y* x% C0 y: _23 _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 pfor 遍历
$ K# Z* y! s: X9 N8 }保存数据 保存字符串
/ x5 A6 `3 R  J* n0 f( ?. Ofor 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$ z5 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! H2! s( [3 j. C6 e  L" \9 h. ^0 G' I, y
3
* [. j! C: y5 ^! r2 T7 R4
( M& L6 O: \2 Z) q7 l5
, A7 U8 {' s6 c% L( X& \63 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 jieba9 N! d* D! _- S8 @. j5 `
import wordcloud$ U1 \2 f% d# h" }  K7 U: ^
1
2 C4 S; O6 B6 N, }8 M+ M2 S2. ?- 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$ b3
( F5 m8 p9 y6 m43 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% dstring = ' '.join(txt_list)
. T  B/ [; a+ Lprint(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
32 `# 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 ywc = 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 X1
; @. l3 _3 J1 D2 j. f4 S21 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) b5
3 n/ Q! D1 [' u9 m0 W5 ~" z6 P' a* ^* v6
! L  s/ L; B  w- A  g7& b! y! u, Y' H8 ~9 w2 W) h  H
8
; d/ L# |1 R% p96 r9 w: N- E! }! r, i4 C
10
+ \2 P( h% w  @8 B11
/ 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/ Zwc.to_file('output1.png')
" s% x7 k* a% P- M1
+ 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# u6 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