数学建模社区-数学中国

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

作者: 杨利霞    时间: 2021-7-30 16:25
标题: 用Python把B站视频弹幕爬下来,绘制词云图看看大家最关心什么!

" v4 B( o& C3 V5 x! G, E用Python把B站视频弹幕爬下来,绘制词云图看看大家最关心什么!
/ Z; L7 r# y9 M) j9 w今天带大家做点好玩的,把B站热门视频弹幕爬下来制作词云图!$ k. q: q  Y  [4 P7 I7 }. O, F; _7 [
康康大家都怎么说!7 j. F# ^4 n8 B. q5 G, O
  ?( J1 j& f  e& N4 l1 M- \
2 l- O: S! U# d  R8 t5 t0 H6 Q
' F/ q/ q% t) S6 Z9 G, W- x
' c0 }4 \3 K3 |% k' ~
开始之前先给大家啰嗦几句,可能有些兄弟不会安装模块,我大概讲一下。- z# M* W, L* i+ J
2 O+ _/ N3 m+ o! o4 l1 j3 M0 z+ w

. d/ O8 R- _( n如何安装模块:1 s( b- R2 I- S  `8 B

$ Z" f( q% u. G& t( A
* T  J) d, h2 J; w: c
win(键盘左下角ctrl 和 Alt 中间那个键) + R 输入 cmd 输入安装命令: pip install 模块名 回车
& s7 ~! W( h+ H* Q0 m$ gpycharm里面安装 terminal 输入安装命令: pip install 模块名 回车; p7 @: m& ?6 ^/ }7 l1 M
如果模块安装失败了,可能是这些问题:& L- J0 U* Z4 Y3 ]4 U* X! k* w: H

  s3 u$ \  _5 i- n2 Z8 }) ?( f

  c; T- ?9 W# z' ]8 u提示:pip 不是内部命令
6 U/ `; [* V: j6 v/ O6 H5 K1 V你python环境变量可能没有设置好! |& l5 R$ E- M1 p" f6 _
有安装进度条显示,但是安装到一半出现报错了
* @) l4 l- X; Y- v* v9 U( ]因为python安装模块都是在国外的网址进行下载安装的, 国内请求国外 网速很慢,下载速度大概只有 几KB. B& ^) y- ~+ S& q
read time out 网络连接超时 你可以切换为国内的镜像源
8 w: [0 ^* G; Y  m4 I明明在cmd里面安装好了,但是在pycharm 提示我没有这个模块
3 M' e5 n# v$ q. L# Y0 x$ v+ B你pycharm里面python解释器没有设置,你在pycharm设置里面重新设置一下
! J5 b/ R/ ?7 j7 O: s5 Y可能安装了多个python版本( x) `5 S) Z( \
安装一个版本即可2 E3 B7 G0 L8 [9 _% z
Python做爬虫到底可以做些什么呢?
  M$ V( o: T2 y. K
2 y% Z) R- O: X$ @& G: J$ _: J; m

& h0 q% V- u6 u- Q7 W3 c" P常规: 爬取网上的数据 / 我可以批量下载图片/文字/音频 视频…6 ~/ t8 {% c6 Q' ?" L
12306抢票 / 京东商城电商网站抢购脚本 / 朋友圈刷票 / 一些问卷调查自动填写… / 文章刷阅读量 / 音频 视频 播放量
- Z/ k9 v! K! Q, m9 b  v' W1 r! }8 @可以刷课 可以刷网课 自动 还能自动批量注册账号
0 E, \0 G- L& A$ D" O模拟点击 >>> 游戏辅助 >>> 修改游戏内存(单机) …
, w: l( ~+ @) ~: \$ }普通B站视频可以爬 番剧是需要会员的( D2 r7 p  ]" c* X/ }

" b4 ~9 m. E; D/ p5 P
1 ]+ d; @9 Z: u( a6 F# I' c
爬虫都是通过开发者工具进行抓包分析 查询数据来源 ( 静态页面 / 动态页面 ajax异步加载)$ X% X+ n( V5 M8 O* C$ g/ r6 [
: o! u+ g2 E3 O

4 o& T" s; h2 }1 W1. 确定目标需求 (弹幕数据 那个视频弹幕)
$ A: j( w' j. [" m# X    确定了
& u7 o# \) ]2 K8 v7 W& L2 i! w2. 找数据 (数据的来源分析)% o* A. @/ F5 ?7 c7 X* d6 o* }
    简简单单 找到了6 e8 W9 R1 o, m# O
3. 对于数据来源的url地址 发送请求 (请求方式 / 请求头)8 V5 R( k6 M! e; E, j
    请求方式: get / post
/ w& ~8 K7 O6 R7 i7 Y" ~5 D    请求头:
( l* @5 L7 y) D  E% N    https://api.bilibili.com/x/v1/dm/list.so?oid=376200196
- s) X0 q& U5 v7 c, p0 o0 ?    (通过开发者工具去看一下数据的具体来源,是否是来自有这个网站)
9 @' x9 O! ?6 k- u' a4. 获取数据 4 W' K! D( X3 |9 T  P/ F" p8 t! R
    文本数据 response.text 获取网页源代码' Q" E+ O+ b! u: `0 C% @0 Y
    json字典数据 response.json() 通常一般情况是 动态网页  ajax异步加载 用的比较多
8 `0 w- h) ]1 V2 K    二进制数据   response.content  保存图片 音频 视频 或者 特定格式文件
/ I7 Y7 g# r  B% A+ @! U5. 解析数据# m, }$ a+ s- }. `
    正则表达式 .*? 解决一切  遇事不决 .*? 通配符 可以匹配任意字符
3 d+ Y6 t6 H6 ~+ H1 A6. 保存数据
7 D4 o% ^, s- X& l1 ~; k% ^+ B; R1
8 o: f9 R* p9 E" ^2
1 `8 y, l2 F9 v3. o0 j3 y% w% {7 Z2 W7 @
4
+ P5 x( O9 x3 b& N59 F0 N- l( f) H9 w
6
5 C2 W' L: |) m* Q6 M2 X7- Z9 w4 X) Q7 O
84 H8 j1 N$ t; g
9
5 j7 I" U+ i" J' q/ L10% f' j" k# q& e1 `6 a1 e. j
11" ~/ J8 t" E; f- }* `
12
" J+ v4 ]. q/ V+ {; ~+ f+ v13
; s( |/ m- b5 Z$ m* r7 _2 e$ H14
/ l* _# F: B0 S/ f) g15
5 |2 |9 b9 o) [' B2 q7 h. t& ]& v16
7 l+ W- A: h4 q% r3 Ypython除了做爬虫数据采集,还可以做什么?! C1 U4 Y5 k$ o' M
兴趣学习 还是 通过python技术赚钱 (就业找工作 / 外包)
9 B& Q8 e" B8 @# V/ |4 Z2 s' l0 r2 @

. g( k4 ^/ ~: h5 N$ l! e, d0 V网站开发(就业/外包) >>> 我们课程是教授的全栈开发 薪资 13K-15K( T% z5 m5 y* W% L. q& p
比如: python开发网站: Youtobe / 豆瓣 / 知乎(以前版本) / Facebook / 美团 ;3 i' O: e& m2 k
我可以做到这样么?& D* C- C( \$ D$ @; X
0基础 初学者 从零开始学习,上线 通过 域名 服务器 数据交互,4个左右的时间 就可以独立开发这个项目 类似知乎的网站;
+ ?$ ^% ?7 X3 Z如果你做去外包(团队): python开发就业 大多数也是进入外包公司 一个 10-20K左右;9 z# S9 ^4 T3 v+ m1 u

# B7 @+ ~7 ^) W8 i4 G$ o7 a
- m2 d# q0 I5 R0 K
爬虫开发(脚本)(就业/外包) 可见即可爬  y% A# L1 Z( _% Y6 l" F$ v" Z% T
虽然爬虫什么都可以爬,但是获取用户的个人隐私(信息 电话 身份 贩卖 )、国家信息、商业机密(未公开数据,或侵犯版权)、色情等违法信息用来盈利,就基本上人无了!
/ g; P6 [5 f/ P5 d* V1 \" l+ m很多兄弟问我,可以帮我淘宝用户数据吗? 我都是告诉他们,这个我还想多活几年,这玩意涉及隐私,个人信息,你可以自己学了悄悄爬,爬完记得删了,用来实践问题不大,但是别用来盈利!!!
: u. y4 k& g" S7 g& @6 e. U之前有个兄弟爬取微博上面军事武器航母图片买给国外, 然后就进去了!所以奉劝大家,切记切记,别乱来!  K2 x$ w4 P5 ^' L4 W
/ }" C9 {3 r0 [  d* \' s

  W! u" e+ a, _$ w* Y) O1 d数据分析(就业/外包)+ _. g+ U+ R2 y+ n+ G9 T
' ?9 p6 j; V* a/ P1 {& k
3 Y" m. [5 ^2 Z2 f4 n9 g
自动化(脚本)2 G7 m: J1 e: c$ x

5 ~- t7 W% r7 R) P* ^. S, S/ P8 ]

0 w( m0 c! a$ m0 }游戏开发/辅助(脚本)
9 v# r  U' c3 B2 A" ]; q
9 c- [2 Y1 I+ h& C2 W

! Z/ w( c. Y9 t5 B# U人工智能(研究生以上学历 要求很高)2 Q4 ^% {: }2 e+ x: k' x
/ p( ?2 g  N/ @9 {
" |* o/ }5 m- o, ]$ Z. b
等等方向还有很多,我就不一 一述说了,那些方向对于一般人来说作用不大。4 K/ G$ O: C! @1 v5 ?; d
; o6 \* L7 m! }( v+ G
) I& [" i* i- _" D3 k% l
我们开始正题吧
$ c& x+ Z2 L1 c' @! Q. i6 V$ `+ M" g9 A5 d6 x/ h$ n. ?4 L. ~- t
- }" i% a; ^2 l, o0 [4 l* w  u
爬虫部分:
" e7 J* n# S$ E4 @8 o3 B发送请求 第三方模块 需要pip install requests
6 C7 s- d' o( D+ G+ a" S; B6 v' `) F$ p! w7 Z/ v! w- t; a1 V8 |
: H3 q& A5 H1 U9 i. F
import requests1 y! {+ e" F1 Z& N
import re  # 内置模块
' C- j) j% n. W
: h3 L+ j9 j) M% R! p

1 \( ]9 N5 W' I" m$ N& a: s! ?5 uurl = 'https://api.bilibili.com/x/v1/dm/list.so?oid=376200196'2 `1 V0 P0 ^; \  b6 [4 _" |
1
2 ^* p+ k& D4 F. [5 q2
& ~, m3 m' p. N5 z, ]5 [, b5 m3
5 T2 H2 U3 `0 b8 t6 x6 h( x4
9 M$ w, I; v3 l4 G3 w请求头的作用就是伪装
# V. _+ g  A) C; r
6 c8 @  @/ k; g+ i/ K+ B1 |

6 ^, T* _0 B) @+ k+ L( aheaders = {
+ W& V; v. v1 S! b3 \    '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'. \- J4 `7 l4 J* i  q3 V/ d
}
5 v3 d6 D1 O7 t1* O! b9 B* y# v$ _& Y
2
! s5 e8 e* F( z4 l' h33 l/ G* b2 H4 t. D
模拟浏览器对服务器发送请求, 服务器接收到请求之后,确定你没问题 然后会给你返回 response响应体数据% A6 M* E* S, F; p5 |7 {+ e
函数传参
& ]8 J% i$ Y" \$ o: w, P6 u4 m- w- f6 S9 ]7 d2 S! D9 x
8 Q: |' K  a* \) `
response = requests.get(url=url, headers=headers)
8 Z/ F+ @8 {' B0 i  O- k1& n" B2 S: r8 z: h
<> 对象 对象意味着你可以调用里面的方法或者属性9 k1 K1 {  X/ I$ g1 ]
200 状态码 请求成功
% q6 V. u, W0 E+ F" v) |- P获取数据 文本数据5 _" ?2 x8 @# D2 f5 K! {
自动识别编码# g6 l; c4 ], {- \/ \8 Y
8 J3 }' h6 m9 K6 [" k1 A

# n! j" O* y3 L' I( ~; e/ p. ?! gresponse.encoding = response.apparent_encoding
- H, t/ u$ w% P: I" r6 ohtml_data = re.findall('<d p=".*?">(.*?)</d>', response.text)
/ U6 X! L4 O& X6 b2 B" M) W1  L* j# A  C5 l0 d0 x
2
3 _# V$ k  Z  W- _0 q' Lcontent_str = ‘\n’.join(html_data)/ b! \, C; q0 M4 i

; J, |$ X' n+ I* Q: q# r3 R. T

( ^5 w. ?1 V9 Y! O要列表转成字符串 ‘’.join()
( w2 ~& H$ s) @/ a. _% W9 b0 d' X" Mfor 遍历
3 u7 V! ]5 `1 e5 q% z% @! _保存数据 保存字符串* _. ~2 t7 b0 a  R0 o
for content in html_data:/ F/ x) {! ~5 u/ s8 o. o( o
    # mode 保存方式 w 写入会覆盖 a 追加写入2 g  @6 L' R5 @% x+ l% O
    with open('弹幕1.txt', mode='a', encoding='utf-8') as f:9 D/ l- |( n- E5 o+ D: u
        f.write(content)
5 N! o) r' C8 Y& |% Z        f.write('\n')3 D, n" m$ P& x$ \
* ?. h& n4 f3 P+ t3 A
& f/ q& f8 _5 n; c) c* D# c
# print(content_str)3 i+ b: N! ]5 n, V" h5 A% \
1
5 X" B9 k; h* {3 [7 B  a2
/ x: t: ~! ^, t- S7 z  V) D2 Z3
5 K* L$ U/ p; z& w1 {# v47 X8 ?8 K" {. K- K2 u, a
57 M) ]& U- X) T: k4 B! x' O" `- q6 W  [
6
7 x- C& E8 R4 ?% z6 {79 ~% q- o. g+ s0 _, d
爬取结果; y6 }8 ~* H; r0 W, t) G( i

# y. V7 a5 K1 `
+ e+ h9 }& Q' Q' B5 M0 t9 j

) C$ K" y* ^) y( F5 Y4 L$ p) f5 u& u
* O& U* w2 m+ m- A
然后我们再来实现制作词云图部分$ G; v4 B1 G1 Y, s7 m

1 M/ x/ f4 T# p' E" s# T
! g2 K- m) s/ ?3 O: z7 ^4 ]& m; H
首先要安装这两个模块
! b5 ]4 b, C! d0 T* v4 K2 \1 V. U) d! S
! ^6 v: [$ ?! |. \2 `! k& s
3 @+ q1 N# {9 G0 N
import jieba9 h1 Z9 R) v% b% d. r$ `
import wordcloud* N6 r& w" m# h. p( w
19 y, X# Z1 x7 |7 @) T
2$ C+ F% m1 U- u  j5 F
一个相对路径 一个绝对路径,保存好的txt文本名字要注意看一下,不对的话,记得改一下保持一致。" J# b! h5 r* X  Z) R
2 S5 P4 U7 E5 y! [# f* J

# k4 O1 {$ q$ l" x: K7 V7 Yf = open('弹幕.txt', mode='r', encoding='utf-8')$ o6 I, G. p& Z# `! o1 H
text = f.read()8 J" ~4 Z  J9 q, o7 ]
txt_list = jieba.lcut(text)
' f; I& }/ I; h4 c+ U+ r# print(txt_list)
. M# Q, h% H% w' B3 y1
1 j! ]' l# l# Z: n$ v0 ]2
5 m! f, I+ D' n; s* U' U3
! p+ z4 U2 E# n0 N4
) e% _6 Y. B: L- n" e# p列表整合成一个字符串
( `' b3 t: U1 \" N$ F% j0 e
9 _8 j3 u5 R! Z3 \! t2 L" B2 {
; j( w2 S6 b3 J# H4 I
string = ' '.join(txt_list)" n) E2 `7 N  d/ W* w3 @
print(string): p; {9 z$ b; |% a9 u
print('---'*50)
, ~$ F5 D- {0 L2 X9 Pprint(str(txt_list))
! L4 q; p) n/ ?, r6 f% x0 ]1# @1 J; K! D7 }
2# J, ~( x7 u) x6 y
3
! \* y+ A8 U% \  }0 H/ l3 a) p4
! d6 L: V" Q7 o7 K8 H词云图设置9 c: f7 s$ S+ f

) Z, K! _) _. G. b' {( h! k$ w

8 k4 g) y8 {7 H6 D% p/ _wc = wordcloud.WordCloud(
6 [% V. J% W, Z' j1 Q, k        width=1000,         # 图片的宽& a( s* t) }; W& [, W& F) I% g
        height=700,         # 图片的高
. B/ U* u5 r. P. Y% ?* y/ W! ?        background_color='white',   # 图片背景颜色7 Z5 C3 v% j8 G! @4 c
        font_path='msyh.ttc',    # 词云字体, F% X0 y7 Z9 {7 @) i# l
        # mask=py,     # 所使用的词云图片
3 Z$ h2 ]( n0 C0 s; l3 j, w& x        scale=15,4 R( }* Z; k) O6 V7 q  h% o
        # stopwords={words},         # 停用词
0 I3 g3 q1 ~8 H        # contour_width=5,# ^" w# u0 H) {4 V% k7 s5 ^" W
        # contour_color='red'  # 轮廓颜色0 c& h1 T/ N, Z* Q* B
)
7 k, g: E# ?1 q2 G4 p+ ]1. S: c* {, Q. M# A7 F
2
, P3 Z9 Y, T- W1 }9 i3
* Q' X, R& T: B# d1 H. e4$ M7 n- B, y/ p, ^" y& O/ {
5+ a8 O- P! D$ R8 p6 [9 l: [
6) H# t9 K% o- T7 W( U4 E1 y
7
. d5 E4 d1 Y8 ^% G' V8
4 O+ q; u4 l  K: n/ ^" X9
% p7 P; ?" s' b+ {4 ?109 k& f7 X& y( _  K, {  C
11* h5 ?! p# s$ F& ?
给词云输入文字
* |; C! H9 E$ c+ z6 k# m+ @5 v
4 x$ q  `' m3 i: I+ p
+ `2 H  I0 s4 e
wc.generate(string)2 w% c; B/ D+ F9 ^2 D6 ]. {" F( b
10 c! ~( U' [9 W1 v
词云图保存图片地址/ O* F  @: P) o( g0 H( E, u  T

5 d0 f: L  u$ B( G7 J
$ f. V0 S. m2 }- C4 w, S9 g! u/ e1 b
wc.to_file('output1.png')
% k4 q7 X6 F7 H1 x. l10 F% r" Q- Z1 T/ A
词云图的过程中有点慢,大家不要心急0 v+ O  v8 D( N3 k9 H: ~
0 P. Z: ~" c  Q* o2 n9 j2 Y, b
4 |* N+ k7 M& {' j5 q4 V
这是最后的结果# l0 s! Y" [2 M( Y. i+ v
: h" }* y' y9 J" |
: T3 U0 F' E2 v
没有加停用词,所以一些无用的词比较多5 @" k& d' A, x+ N. S; r

( \4 l* _& e+ v* {* |: `
* X( ]: h! o# m; D
stopwords={'了', '啊'}3 [; @+ _! F5 X" I5 l. o
1- ]& a0 H. l, t1 i% z
把这个部分的代码加入要屏蔽的词就OK了!比如我现在把 了 跟 啊 这两个字屏蔽了。" L# f7 t. k3 b' K  K
我们再来看下
( b& A8 E9 L; S) o0 j" x; m' w! [  y  K! `/ K5 L5 i; n* l

6 B$ P* }9 l$ s. l不知名网友:666666 牛批 老哥我要学!!!
+ r0 N( R1 n3 T; a/ y3 u, O* l- b3 p
" q1 O8 m/ V, A; n' Z( A3 d
4 B5 y0 L& N& T' j' D$ z* V

, E# G. O# e1 @————————————————
) A4 V9 C+ q4 W0 m' u0 Z% A% R版权声明:本文为CSDN博主「编程界的泥石流」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
; [2 B% y; E8 P# @: d2 H' [% W原文链接:https://blog.csdn.net/ooowwq/article/details/119211907
. `. F# H/ Y# w+ y: _1 Y) ~- l! y+ i) i- I: `2 W& R% F, o/ M

6 F- \* `: c2 f- C0 s




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