数学建模社区-数学中国

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

作者: 杨利霞    时间: 2021-7-30 16:25
标题: 用Python把B站视频弹幕爬下来,绘制词云图看看大家最关心什么!
, W+ Z) ]7 U7 q  j
用Python把B站视频弹幕爬下来,绘制词云图看看大家最关心什么!( s# u* ~2 g, A9 e! Q8 V% z6 i
今天带大家做点好玩的,把B站热门视频弹幕爬下来制作词云图!# C" z6 E7 Z7 W- E" t
康康大家都怎么说!. }" V3 I, o* \" \3 I. p) D
' r  v* h% ]9 z$ o9 @

. v8 p* O8 ~  p3 D/ U; r6 \- |7 v
7 `8 q* O8 a" D/ ?, ?
% e$ W. y) x3 b' W- n0 `: Z( p
开始之前先给大家啰嗦几句,可能有些兄弟不会安装模块,我大概讲一下。
/ u% E! V% R, j7 m0 c1 ^
6 N1 s: O  m1 ?) K& J' b( b

$ D& X( l7 T& ?) ~如何安装模块:- P! {- r# Q( I* Q4 B2 f3 f5 n/ ]
  I6 a  S2 @  m  S6 A
4 c& Q% D3 K, u# X3 E/ Q
win(键盘左下角ctrl 和 Alt 中间那个键) + R 输入 cmd 输入安装命令: pip install 模块名 回车
* n, Z% {  W7 y- J3 J4 r: E  o5 opycharm里面安装 terminal 输入安装命令: pip install 模块名 回车+ S# P% \3 e3 q9 R5 Y+ t* ]0 L
如果模块安装失败了,可能是这些问题:
% V  X6 l* j$ x+ z7 a% v- I, T5 V# L1 P$ u& P
" {& ~- j2 g: z
提示:pip 不是内部命令0 Z9 t$ K% Q: T) D
你python环境变量可能没有设置好
1 B- P6 I- S; b% x8 w. a( v: Z" K/ `有安装进度条显示,但是安装到一半出现报错了6 x+ y! r# d' V! A& k0 a3 t: d; b: D
因为python安装模块都是在国外的网址进行下载安装的, 国内请求国外 网速很慢,下载速度大概只有 几KB
% }+ w- ]% }' _2 oread time out 网络连接超时 你可以切换为国内的镜像源$ S1 K' }; L. h+ D- O% }
明明在cmd里面安装好了,但是在pycharm 提示我没有这个模块3 t1 o4 i: ^4 a
你pycharm里面python解释器没有设置,你在pycharm设置里面重新设置一下
, c( C; l5 ~! r& f' j" `3 a# A/ ?可能安装了多个python版本- [! T- [& w8 S+ `7 U1 L$ x
安装一个版本即可8 x7 t& I8 `4 n
Python做爬虫到底可以做些什么呢?
1 Z  ^- v3 S2 U/ ^& w
) b, W' H2 f3 }6 A% H1 O
7 F2 }5 F: P0 T; ^% m7 P
常规: 爬取网上的数据 / 我可以批量下载图片/文字/音频 视频…
/ }9 L* ]3 d: K; K1 D! U12306抢票 / 京东商城电商网站抢购脚本 / 朋友圈刷票 / 一些问卷调查自动填写… / 文章刷阅读量 / 音频 视频 播放量
" Y) X. n8 c4 h7 c, J0 O+ M8 O可以刷课 可以刷网课 自动 还能自动批量注册账号
; ^9 ~5 O4 H3 F! I* E- x8 H5 H模拟点击 >>> 游戏辅助 >>> 修改游戏内存(单机) …
& a- |& a5 a4 Z5 Q普通B站视频可以爬 番剧是需要会员的
. c/ Z5 [7 b6 w. q7 n  m' b8 m5 e

2 f# j& J1 L$ r& V/ v" u  c爬虫都是通过开发者工具进行抓包分析 查询数据来源 ( 静态页面 / 动态页面 ajax异步加载)
/ P0 e( Y  e7 ^, G$ i; S/ a5 p
2 I8 T- W# i/ }7 H$ ?
  R. v+ R# z1 p2 B6 ?; r: ]. i
1. 确定目标需求 (弹幕数据 那个视频弹幕)# A" I9 N! }7 }4 t5 S9 z* B, C
    确定了
2 J7 q) i( n5 p0 ]2. 找数据 (数据的来源分析)  h# h& Y9 Y9 O0 B
    简简单单 找到了+ f& T8 v8 e; _  d
3. 对于数据来源的url地址 发送请求 (请求方式 / 请求头)( i- s! }3 Z/ X/ ~- U5 ^7 B1 ?/ F, i
    请求方式: get / post6 b. ?. B! Z9 |& }6 G  ^
    请求头: ( Z+ E- ~: S* ~- V/ D$ g( O. O# Q
    https://api.bilibili.com/x/v1/dm/list.so?oid=376200196
6 u# `5 @+ o- R" q5 U    (通过开发者工具去看一下数据的具体来源,是否是来自有这个网站)
8 S( v) `. I. R* M" {: u' ~4. 获取数据
' y, j" _! b/ P2 G    文本数据 response.text 获取网页源代码
( ?+ Y4 q  f2 T, q! R    json字典数据 response.json() 通常一般情况是 动态网页  ajax异步加载 用的比较多
+ T# @8 y# x, E    二进制数据   response.content  保存图片 音频 视频 或者 特定格式文件
6 y0 ~9 Y0 \# C4 I) q5. 解析数据
* I) u" i9 J9 m& ]3 _, J/ h# N    正则表达式 .*? 解决一切  遇事不决 .*? 通配符 可以匹配任意字符 # ]) s4 t+ y8 F# [) @
6. 保存数据
- D- o* }- v/ K3 ~/ {6 f4 B1
. m+ i: O& a' r7 c- n27 T9 K7 c4 q3 Y, T. G9 ]
32 i  V, d% M/ ?- |9 X; w
4' X* O. b( a2 j8 o4 C. J: e
5
) s4 c2 x. U/ d( k# P+ m, r$ C6
0 S/ y1 y: [* i& t; X7
; a+ T9 q# W4 t* s8
* k/ [+ b4 w. E2 O/ k9 R9 {2 i95 I; \/ K% T. D( Z
10& t% G' U8 X$ j( L8 y! M
11, ~7 r, D* I; }# r+ _- Z; W
12
6 y  e0 K6 a; z" K( R8 T! Z2 R132 h/ f: S' a8 A& j
14
, R9 t: z4 M! _* P( a& I15! w' q0 d9 b& r
166 y+ v" E( O3 D
python除了做爬虫数据采集,还可以做什么?! W5 E. w) v  Q- L" `
兴趣学习 还是 通过python技术赚钱 (就业找工作 / 外包)# D( I, c# l( U) J: S, @+ \' e
# G. C  N2 v' e$ n; s9 E% O' z

5 g, @: }) C( l$ D- T网站开发(就业/外包) >>> 我们课程是教授的全栈开发 薪资 13K-15K$ S) E/ f! C  |
比如: python开发网站: Youtobe / 豆瓣 / 知乎(以前版本) / Facebook / 美团 ;
, W* F7 G( _- ~6 O* }+ r$ i我可以做到这样么?
- F! D* R8 t" W  t. _; e  `0基础 初学者 从零开始学习,上线 通过 域名 服务器 数据交互,4个左右的时间 就可以独立开发这个项目 类似知乎的网站;
+ y' ?0 J- e( n如果你做去外包(团队): python开发就业 大多数也是进入外包公司 一个 10-20K左右;
$ k; H6 x0 p( G( L+ T
$ R; j# g' }& O' _9 a

9 n& u1 F& j* _% B, G/ v$ P爬虫开发(脚本)(就业/外包) 可见即可爬7 z9 e+ i7 k' w( I" i
虽然爬虫什么都可以爬,但是获取用户的个人隐私(信息 电话 身份 贩卖 )、国家信息、商业机密(未公开数据,或侵犯版权)、色情等违法信息用来盈利,就基本上人无了!
+ L) h3 k8 @1 t$ L很多兄弟问我,可以帮我淘宝用户数据吗? 我都是告诉他们,这个我还想多活几年,这玩意涉及隐私,个人信息,你可以自己学了悄悄爬,爬完记得删了,用来实践问题不大,但是别用来盈利!!!
; H! \, s+ d! P3 T" J3 U之前有个兄弟爬取微博上面军事武器航母图片买给国外, 然后就进去了!所以奉劝大家,切记切记,别乱来!
1 s' A% i: v% m$ V- S& M- d" Q, ~1 p; |5 }: U

3 w' }1 R7 F7 n2 y/ O  N8 S- w/ Y数据分析(就业/外包)
' R4 Q3 {2 R- L4 {+ C  v4 \# ~8 N0 a; r% l* a9 I2 ^
% ?  {$ K3 f& n6 b2 J  }  a
自动化(脚本)" X8 `; \. `2 p# `) e" k

1 ?6 B1 z" ~2 M' L3 Y/ |& ^, W
- `+ `& X" k9 B/ t5 S/ [3 o' @
游戏开发/辅助(脚本)
: P& O4 T: n$ ?, z0 h1 H/ }: A3 c8 s' F* K. P4 [" E; t

' e, M. M% J+ t; k人工智能(研究生以上学历 要求很高)
9 F: q5 m5 h0 |  j, L" {; j# @0 [/ [% U4 n7 V6 W/ w" N4 N
/ P5 ^: n4 x1 D5 d
等等方向还有很多,我就不一 一述说了,那些方向对于一般人来说作用不大。+ K% I9 T2 `- y1 x! J$ Z

0 g" E9 b/ J6 u4 `
, ?% z3 R& a; N1 G1 F. f
我们开始正题吧
1 [6 l) H1 w' }! K  s7 D: H7 x0 F- r, ?- w
$ }2 Y# n/ h. X0 f8 k5 O4 n0 C
爬虫部分:
! B! D. u9 J6 E6 l发送请求 第三方模块 需要pip install requests
5 {' H" L& p3 l3 v4 A
( a2 i4 A8 {0 D8 ?$ d

& K) ?& n8 {7 G% w' X4 o$ Vimport requests" W/ A3 E) G% D* s, ^0 G* x
import re  # 内置模块
4 E9 v( z7 d4 m7 n  a
0 H4 |, U) ~! p: q, J
9 M  X2 a" F) }! z
url = 'https://api.bilibili.com/x/v1/dm/list.so?oid=376200196'9 D# p* F$ x+ L- a) D% I
1
' J, d3 H0 c/ [1 h+ n2" U/ U- w. \8 S0 A- L  o/ d
3" O; b* S* p& K, J$ c
4
3 _  K5 f2 I  X3 x请求头的作用就是伪装* e  w9 w' }, P! N

* W5 N! Y7 d' C3 v9 h
! Q) m2 N/ \3 {
headers = {! S7 G$ c6 x( U" \" U. W2 {
    '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'% Y, N9 t6 V7 K: w
}
9 @6 E, ^7 }5 K7 b+ F1  g, f5 e  V- ^6 e$ J8 {& P
2
  R! h: [" M; @8 I% J32 z' Y/ m- H1 V1 C/ }# Y6 }
模拟浏览器对服务器发送请求, 服务器接收到请求之后,确定你没问题 然后会给你返回 response响应体数据
. l8 Y: \+ a- p2 {8 k, b函数传参" Z3 }. N3 U2 n! b( N

. K, t" Q. g9 e7 R/ O0 x* W% z
' _" M% F+ V+ p/ D( k: L
response = requests.get(url=url, headers=headers)
  D! i* Z0 L( n8 e, m1) U+ Y% _$ E  K8 C$ j" W6 C
<> 对象 对象意味着你可以调用里面的方法或者属性
' S. W" x& h$ O9 x! B5 g* f200 状态码 请求成功$ z/ _# s! L, }6 |
获取数据 文本数据- I: k6 ?' c! H- J! v
自动识别编码$ @; `% \' s4 g" Y0 z$ m( o
8 [; \) w$ r& J$ i
5 h" b; C4 u) U% h- X, ^
response.encoding = response.apparent_encoding3 C2 Q8 V! I) r  f8 ~8 Q% N" y
html_data = re.findall('<d p=".*?">(.*?)</d>', response.text)1 @8 D2 q  `2 g7 Z4 V1 N' _
1
) d9 n$ G/ {( D0 r, F  z8 e2
+ x2 R3 k$ X7 I3 v9 g+ `content_str = ‘\n’.join(html_data)
& j8 h, g) k: C# o/ t$ \6 e" W5 o  W- N' m
0 b( N0 |& _7 t* a6 x( J& S8 ^6 T
要列表转成字符串 ‘’.join()8 J# R$ l( i: X# R6 k( C
for 遍历% b7 f2 X% H% o9 o/ h' ~
保存数据 保存字符串
! ]' _! C3 }( i  Qfor content in html_data:- H" U0 ~9 k9 r
    # mode 保存方式 w 写入会覆盖 a 追加写入) K+ n+ l/ b4 L
    with open('弹幕1.txt', mode='a', encoding='utf-8') as f:& b/ n2 n, K% X- {. G8 X+ O* k# ^
        f.write(content)# q' K( D3 E- C; D, c
        f.write('\n')1 M. P$ L' c2 m6 ]1 t* ]

0 O! G# E  D3 H& p% C8 }

1 n' g# h3 O# c# Y) c# print(content_str); Q' a+ B( n# S6 t( ?
1
* [5 C3 C6 Z! o8 A: @. L/ t2: c$ \/ k, M. @+ l% \
3
& r! z$ X2 Y# h, V2 j! F4
2 k, F! [) o& Q/ l7 S& x5
. w  Z8 v+ i6 b: B6
; k4 D  }  G# r' O9 ^72 @3 h  ?/ s2 h* x  @7 o+ j
爬取结果
0 Q# ~5 ^8 W0 a
8 e# D  I3 g, Q1 `2 U& m' W
6 ], f' F7 U# X. u( a

3 m$ g# L. C- z7 n  m: v- T& a

" `1 p4 f7 [9 W9 X; \然后我们再来实现制作词云图部分2 N* n9 |& g# B8 p
, C1 n! e- e# h3 I" P

) W& M! k  F& H首先要安装这两个模块- Y  Z9 }) g- e9 R! C7 Q# a& z+ B
$ K2 t5 E, D& _) F1 ~" F

* s1 D# I/ t$ _& ]1 y" _import jieba
6 o+ E2 ?5 @5 a& X' bimport wordcloud
  l/ w- }: i: O' r8 v& A- X* Q7 o1* y5 a* u5 b* j; ^1 P
27 G# }8 l' F8 ?+ P2 @+ D# h
一个相对路径 一个绝对路径,保存好的txt文本名字要注意看一下,不对的话,记得改一下保持一致。, l' ]) [: D1 j) U1 L; f7 n
" N! J5 t) v! p4 }# M
4 l) K' j8 v& E1 P
f = open('弹幕.txt', mode='r', encoding='utf-8')
1 d9 f+ b( `, ?" J& |text = f.read()
9 v/ x- c! V" A, Htxt_list = jieba.lcut(text)# W# ]9 p* V" l  @: A4 M* q% [  V. [) p
# print(txt_list)& V% J- H# i3 D* ^& M) o& P
1
8 P; u) R+ z8 R' Z2
1 i: x# T6 ^* I# A: p3
# p8 V8 L+ N2 ]' Z: w4) |9 _! N6 I! B
列表整合成一个字符串
" G# {* d) A8 {
( c$ M* q: G: W2 V
4 Z3 [! n3 G4 E9 @0 b7 u
string = ' '.join(txt_list)* ^) C  f6 ~, d$ v3 H
print(string)* j7 L2 k0 s3 {( V, u7 o
print('---'*50)
' x: x/ \1 [3 S5 l1 d7 jprint(str(txt_list))
% |( s8 j, d4 e7 m4 {0 r16 B! u1 ]: @- o4 ^3 H
2/ {6 t! Y# D; W( f
3% R/ k5 W( y  v+ F2 f& F
4
; ~6 i: J+ C( p/ [5 G! g) D; \词云图设置2 c8 Q& [/ c. ^+ g" @$ J
, C" G1 e' C2 V; d' a4 l- i

% q, P/ C* s0 C( O" }; Bwc = wordcloud.WordCloud(
2 j" x0 y0 X' d0 h& T( V4 B        width=1000,         # 图片的宽
2 w  D: e6 L* v3 n        height=700,         # 图片的高4 E* j0 c$ s  ?' x
        background_color='white',   # 图片背景颜色
& I; W' r$ x+ l  g! c        font_path='msyh.ttc',    # 词云字体
# U9 q) ?) k. r/ M        # mask=py,     # 所使用的词云图片
$ J0 B& Y; ^/ ?) g* J' I- R' K2 @        scale=15,5 ^: O7 X! ^% F5 T0 s
        # stopwords={words},         # 停用词0 z0 l  L( P/ G) I" ^
        # contour_width=5,# N& @- ^% J- _8 E& Q7 W0 U
        # contour_color='red'  # 轮廓颜色
2 c. G/ `: l7 ~  v; I9 T7 V5 l)
  d' ]7 z" d' A, D( C& k5 l, \% n1
3 v2 `. H, t, p) {2+ b" L7 m# X7 \5 D! ^7 }; m
3
9 F( z" d( T6 S6 A# ?45 |. Z  F( b4 b3 }
5
; ^. D( W9 Y0 F5 y: o6
3 s3 ~3 k! v, \: I$ R$ m2 F" T7) [8 p1 O: W$ K+ h% i* F
8
) X0 a3 p2 {: \9- c6 H( }0 i# _, p0 {7 o% e! P
10
: U0 e9 u8 B% E. R9 v115 a& X+ M) c7 V' u6 \8 t
给词云输入文字
/ q! K- `0 Z7 z% D
9 k$ H6 C7 k$ C9 @

5 j, W9 F! b& Hwc.generate(string)6 n9 f+ A# f1 v0 U, O7 m8 X9 w
1% s' @5 E2 z# _* n2 |# U/ H$ V
词云图保存图片地址
; \( i5 I# c% b: h  p; H
5 F5 e: p$ N$ }$ G0 U

. X2 Q4 z9 Q5 ~$ zwc.to_file('output1.png')
4 `) k  P) h' r2 h+ f10 o% X$ y4 A, E% K
词云图的过程中有点慢,大家不要心急2 j. ]  B* }, Q" a4 O. l4 ]" W. n; e
3 m! `2 \9 y( d5 F( O3 |

# e2 [; x& e4 \. @1 s, p! k这是最后的结果+ T- X8 x) d8 e7 M) H

. V  d* e4 H, Z" `% n1 k& B

4 K+ |6 }6 ?& U) \( B没有加停用词,所以一些无用的词比较多' S8 y" J8 D+ a

2 ?1 B0 q& r4 b% y( T3 q
% V2 B$ Q+ Q% f4 D, Q; V
stopwords={'了', '啊'}
; b3 Z# }- R' g17 A4 r, _' G/ |' N) h% ~" p
把这个部分的代码加入要屏蔽的词就OK了!比如我现在把 了 跟 啊 这两个字屏蔽了。
( m/ j; @# L) Q: H  J我们再来看下
0 ]9 M* B4 \8 d) _! @; t  e
. T/ Q* I5 {' K, v

" Z3 T$ m3 x4 m* T7 \- S$ S不知名网友:666666 牛批 老哥我要学!!!
9 N' Y! K* F- w+ F7 U2 p/ U9 {
1 f7 k2 f. H' |! |* M( y" p% m

9 ?1 G$ B5 E# ]0 p- }! ?5 ]
: A0 S+ c( I" u8 d/ `* {2 |0 q

# S& Y/ ~# J& e3 _. o* Z. N( G————————————————0 w+ Y$ Y, n5 T: m/ I! s7 v' [
版权声明:本文为CSDN博主「编程界的泥石流」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。$ a) ]  w6 {+ S5 r3 v/ P7 s
原文链接:https://blog.csdn.net/ooowwq/article/details/1192119075 k; W. U: S. R- a* l7 V
) E/ e- T2 n2 f1 A8 L! m3 b( p

, t% M. u2 ?' m0 b5 [




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