数学建模社区-数学中国
标题:
用Python把B站视频弹幕爬下来,绘制词云图看看大家最关心什么!
[打印本页]
作者:
杨利霞
时间:
2021-7-30 16:25
标题:
用Python把B站视频弹幕爬下来,绘制词云图看看大家最关心什么!
! n8 d& F7 K7 g) P. K/ H; q/ F) Q i
用Python把B站视频弹幕爬下来,绘制词云图看看大家最关心什么!
2 `$ D! n# ?9 A+ P8 r9 h
今天带大家做点好玩的,把B站热门视频弹幕爬下来制作词云图!
, p; @. V! D a( x
康康大家都怎么说!
; N7 }. i6 [- q. S9 l8 G
& Q! o8 ~/ _( g' S+ |- d3 X
0 m6 u f& K) Y' C
* }. o' J/ y# W, u0 n5 E7 q
1 d# O, m# g4 j
开始之前先给大家啰嗦几句,可能有些兄弟不会安装模块,我大概讲一下。
* Y; K* M+ i, y( W% L+ N
/ r9 i( j/ q" k. A+ v# h
5 W0 D; x6 |5 h- j8 N, _ @0 y. [
如何安装模块:
! t0 b: e2 ? e! O$ g: ~
6 e( ~& p- F; \/ U
1 M8 L8 n( S* T: H4 ]. ]
win(键盘左下角ctrl 和 Alt 中间那个键) + R 输入 cmd 输入安装命令: pip install 模块名 回车
8 w: k0 u% F7 R) o; ?
pycharm里面安装 terminal 输入安装命令: pip install 模块名 回车
6 q) F' M! y6 _6 T& O' w% g
如果模块安装失败了,可能是这些问题:
8 r$ V* Z) F( j# F ~
& I; J' _/ Z) v7 e% w, G
5 x0 w$ v. T# Q( ?
提示:pip 不是内部命令
0 \& I# ?8 I7 C- |
你python环境变量可能没有设置好
& g# S$ P5 n2 B3 h2 A
有安装进度条显示,但是安装到一半出现报错了
' R0 k# _0 M5 _# T, F7 e4 ^
因为python安装模块都是在国外的网址进行下载安装的, 国内请求国外 网速很慢,下载速度大概只有 几KB
! I4 Q5 J6 N; C+ M! s
read time out 网络连接超时 你可以切换为国内的镜像源
J1 C X4 s8 Q5 P% x4 v H
明明在cmd里面安装好了,但是在pycharm 提示我没有这个模块
* T7 M0 H7 S# S7 w& [3 O
你pycharm里面python解释器没有设置,你在pycharm设置里面重新设置一下
- X' W& p% f! X% x
可能安装了多个python版本
, v* {. d. e1 J6 f2 \
安装一个版本即可
6 D) D& O2 G1 ~1 C
Python做爬虫到底可以做些什么呢?
8 g: X. F( Y$ B: i: L/ L
) h4 z6 ^) y8 n9 B
/ E: ^- B" @* L7 t0 U
常规: 爬取网上的数据 / 我可以批量下载图片/文字/音频 视频…
& U6 P/ }5 d, v; r% c; h a
12306抢票 / 京东商城电商网站抢购脚本 / 朋友圈刷票 / 一些问卷调查自动填写… / 文章刷阅读量 / 音频 视频 播放量
8 a- P- o2 s& z F, ~1 Z0 r4 F
可以刷课 可以刷网课 自动 还能自动批量注册账号
# m3 r- Y$ ?5 @
模拟点击 >>> 游戏辅助 >>> 修改游戏内存(单机) …
2 X2 j9 c% E( c" D
普通B站视频可以爬 番剧是需要会员的
' U0 K9 M: Q$ l" I/ ~
0 D9 I6 i K* x( `
; f5 U J8 P/ b7 D2 V( z" W& Z
爬虫都是通过开发者工具进行抓包分析 查询数据来源 ( 静态页面 / 动态页面 ajax异步加载)
, \ l! V3 y, B$ X% ~/ }; v: i3 [
9 U. U) o4 C, _: }
- E7 ^7 K5 R1 d, j5 N8 ?
1. 确定目标需求 (弹幕数据 那个视频弹幕)
1 [ } ]1 e! R6 E2 q: ?* k3 e! A i& e
确定了
, d' c' I/ L% Y( Y/ ]$ P
2. 找数据 (数据的来源分析)
- ?+ c: ?. h# b1 ]3 F ]
简简单单 找到了
( h) Y) h3 }2 s% C8 N- B9 Q
3. 对于数据来源的url地址 发送请求 (请求方式 / 请求头)
: ?: J- P3 W6 l! U S9 v- V
请求方式: get / post
* C* X6 Y E9 Q( _) ?$ c5 x
请求头:
2 F: R* a2 q5 E) K6 l$ \: R8 ^4 s1 Q
https://api.bilibili.com/x/v1/dm/list.so?oid=376200196
/ ?8 A8 Q8 `8 d) t- k& O
(通过开发者工具去看一下数据的具体来源,是否是来自有这个网站)
+ P7 H2 T6 q5 M/ ~6 K
4. 获取数据
3 c, `. s5 C* \: P( j2 V
文本数据 response.text 获取网页源代码
8 z8 S& J( G/ y. `' Y1 ?
json字典数据 response.json() 通常一般情况是 动态网页 ajax异步加载 用的比较多
5 @1 h# a* Z U+ v
二进制数据 response.content 保存图片 音频 视频 或者 特定格式文件
' u& M# x# c1 R- D# T, r0 J$ V
5. 解析数据
, \* G* i( D8 W h& @
正则表达式 .*? 解决一切 遇事不决 .*? 通配符 可以匹配任意字符
) Z5 }# D$ I: ]% l1 H$ D) C. F( t
6. 保存数据
( Q% Y+ \) x. U/ Q3 V5 s& @
1
* G$ c1 G) S T
2
& M# c; g$ Z) t ^7 i, U
3
+ H) h6 i1 v# X3 N I* A
4
5 H3 K2 d# R" j) U
5
/ a& B* b4 Q4 c3 E
6
4 c* k& ^9 K$ x! h7 ?
7
; c6 C) Z! i8 a3 o6 Z
8
4 t. ^5 i1 f: p- f9 ?& r
9
( D3 ~8 ~& c& B7 H
10
* ^# W/ ^' y2 P* s- L" P
11
8 X! M& Q- z8 g- |+ n9 N
12
7 H3 A! @- s0 `8 y" p
13
( ^+ M9 r7 U6 ?2 v1 V" Z
14
3 J& U" d2 E) o: N/ e) D
15
" M$ H: h) `6 q B4 t3 [7 O
16
9 M! P& ^8 l7 n+ V( s3 [
python除了做爬虫数据采集,还可以做什么?
! B' f) W& s+ X; A! Q, B
兴趣学习 还是 通过python技术赚钱 (就业找工作 / 外包)
/ N: R0 r) n/ F4 i/ z8 M
( H6 O# M9 a: c8 L
j6 \: v4 ]# ~2 [
网站开发(就业/外包) >>> 我们课程是教授的全栈开发 薪资 13K-15K
6 s, y9 L0 E; V8 R1 S. v
比如: python开发网站: Youtobe / 豆瓣 / 知乎(以前版本) / Facebook / 美团 ;
* D! N6 U! p7 L0 x
我可以做到这样么?
p- a$ q2 t% f2 M
0基础 初学者 从零开始学习,上线 通过 域名 服务器 数据交互,4个左右的时间 就可以独立开发这个项目 类似知乎的网站;
* o) Q% O5 g1 x J5 e2 p- H
如果你做去外包(团队): python开发就业 大多数也是进入外包公司 一个 10-20K左右;
+ [9 g% {) R: j- A
- @( L! s7 z1 @6 v, S- ~
8 {& R! K! u$ [5 a" X; b3 C* ]
爬虫开发(脚本)(就业/外包) 可见即可爬
9 |+ t. X% K9 v; Q5 d% K
虽然爬虫什么都可以爬,但是获取用户的个人隐私(信息 电话 身份 贩卖 )、国家信息、商业机密(未公开数据,或侵犯版权)、色情等违法信息用来盈利,就基本上人无了!
0 `, H' q5 Y1 f& X, w& c9 u4 n
很多兄弟问我,可以帮我淘宝用户数据吗? 我都是告诉他们,这个我还想多活几年,这玩意涉及隐私,个人信息,你可以自己学了悄悄爬,爬完记得删了,用来实践问题不大,但是别用来盈利!!!
6 m6 U2 h; `% ]# L8 n" H
之前有个兄弟爬取微博上面军事武器航母图片买给国外, 然后就进去了!所以奉劝大家,切记切记,别乱来!
8 w# B: L* P& g% k3 }
, H$ J ~$ k1 G1 d/ {; N) e
( d$ @5 @( Z" G0 m' ?6 T
数据分析(就业/外包)
7 S7 y2 v5 h' t! J: Z" S. C* s. ?
n' N9 P7 N3 ?
. D! Q6 B+ N& U% m
自动化(脚本)
" h* B n3 a. M9 x$ K; I
/ Q0 p; J2 \6 C: b. x
* J/ r, U2 L+ }$ T
游戏开发/辅助(脚本)
' i0 W/ v4 @7 c% N" o$ n$ H; h
0 a5 x+ M8 a: T: `: K/ @
$ @, ]1 k7 ?/ ~* R$ I
人工智能(研究生以上学历 要求很高)
. Y# _1 Z1 r- k" Y
( T% R! }/ n% Z) c
* ]8 Y* R$ q% M2 V" e1 u, b* J( p
等等方向还有很多,我就不一 一述说了,那些方向对于一般人来说作用不大。
' F$ Z ~. l7 I! K0 R5 h! _
# ?6 z' [0 @3 ^) K
1 Z. J# y5 p4 g4 H6 q
我们开始正题吧
5 G1 V) O+ C2 z4 e
& J8 X3 i. d7 i1 R4 F2 u
2 Z' O" l+ }1 B! {8 @, a
爬虫部分:
% B4 [8 p* N5 |% m. h7 a8 Y: M
发送请求 第三方模块 需要pip install requests
. U2 @3 T# n h2 u7 }% W7 s: L" r7 r
: j1 ^' Q u' a# k- y" X
& M& o5 D3 U3 D; z) G. c4 [, u
import requests
G0 o h# _/ u# X. Z* V; ]
import re # 内置模块
`! p) c T& e* F
6 `7 S4 N* G7 t) {
" s2 n# q7 y" v7 y% g
url = 'https://api.bilibili.com/x/v1/dm/list.so?oid=376200196'
: K# z+ U. g! o* d3 d3 X% D
1
+ i0 ]- }7 n, z' u
2
3 H. c- Q2 e4 s2 t4 [* J
3
& t1 P4 Y" f. |: y$ Z
4
~. x! U9 U# O7 S+ E7 g1 e
请求头的作用就是伪装
M, {/ x8 `7 n$ e9 N; i
: N/ ?( c3 Q" K, w
4 }# F0 H9 t* k6 p
headers = {
+ E/ d3 g3 z: x4 j& f5 {
'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'
2 i6 I, x( ^( F7 G: A
}
- n4 v% ^8 |7 d$ K) v: q
1
4 F% g6 V" j" @+ |* c" j
2
5 Q; C b$ U# D; [/ T5 D; s# s0 r
3
1 p/ K) N; V7 L
模拟浏览器对服务器发送请求, 服务器接收到请求之后,确定你没问题 然后会给你返回 response响应体数据
9 t) |8 ]) z% q
函数传参
, Z! x; @+ ?. g" ?4 M+ ^
* h( D2 S0 D1 c. A( s
; @ M2 _! p1 s0 w( o* h
response = requests.get(url=url, headers=headers)
& Q6 N5 L7 o8 Q0 D6 q8 S+ f
1
7 A0 A. q" m8 e' v7 S4 r0 h7 I
<> 对象 对象意味着你可以调用里面的方法或者属性
r9 J2 I! D' K: g
200 状态码 请求成功
+ @2 ]' t( I6 R8 ^
获取数据 文本数据
1 `) h+ T( _4 L s
自动识别编码
' u. _" k. c! t' Q0 B! D# @
' D/ ^6 Q* _& X% L- q
5 r6 @/ G; m2 D2 I/ N+ C7 B* N% _
response.encoding = response.apparent_encoding
4 `3 l: x7 Y. J4 {
html_data = re.findall('<d p=".*?">(.*?)</d>', response.text)
, Q0 ]/ I# L" u& I# `0 x
1
0 W! U" E* I( D2 A
2
# c) s2 H$ D$ ^6 s3 F1 y" y
content_str = ‘\n’.join(html_data)
9 D5 S7 t% X7 D7 Q0 k
. @* Z' [" \0 E( s8 B5 X/ t
! t( T. s- m3 k
要列表转成字符串 ‘’.join()
% I3 U, y: g1 @: v6 k
for 遍历
" e' q) T( p) M c& s
保存数据 保存字符串
! V8 _4 |( x- @: P
for content in html_data:
& F% g& b1 H4 Q1 D7 Y) Q3 Y
# mode 保存方式 w 写入会覆盖 a 追加写入
- j2 n4 E) H! u: }" T
with open('弹幕1.txt', mode='a', encoding='utf-8') as f:
" O% z) d+ f4 w* L- o
f.write(content)
! z7 G& z0 [4 Q: C6 J5 R
f.write('\n')
% x* u. a. k7 c( x/ U3 v
1 d( e/ H, O- J t- e
* r* T/ a3 Z" f4 k7 E
# print(content_str)
8 ?: J9 H4 J3 E, \
1
* k' ]! t0 F. D8 R5 ]0 K( r
2
" g% |) V5 B4 K: C Q2 {- f
3
; ^8 R3 K6 e% }* J1 M7 j
4
7 j! {% P9 }# P: G% K1 Z% `
5
1 v, d' c& R8 J9 n) C
6
0 g* g, ~3 r1 J1 v: C) V- ~& g I l
7
7 f' E4 F; a6 I, X- @* Z5 w
爬取结果
: e+ D# S) O; a/ y
% [" X! O' l( @9 g
# X$ ^, Y" {: b6 p g; E9 K4 D
% b- E4 C1 E6 |0 U
* Z% P: O+ N( r2 \$ R
然后我们再来实现制作词云图部分
! ?5 t, _( x' H/ h
) A1 N1 |6 U7 L+ R" R4 Y. g
% Y& w+ l! Y" Q1 i+ V; v1 w) z9 B
首先要安装这两个模块
' k$ }# a+ c! ~1 u% q5 U
: i3 k( N5 f9 c
8 i+ \& r& x% V! J- t1 U9 X
import jieba
. O& [) u8 H1 _1 F3 n# a9 f
import wordcloud
' I1 ~9 Y) x7 l% E' f/ W) k4 z
1
$ l* _ b; ?/ c; v' g
2
9 x% @% V* f( R$ k
一个相对路径 一个绝对路径,保存好的txt文本名字要注意看一下,不对的话,记得改一下保持一致。
( r3 e1 x4 g) p3 }4 a& u6 e$ G! e
+ u4 P( l& p; W _0 N7 t
1 W! n8 z& w. }8 U" M7 `1 ?
f = open('弹幕.txt', mode='r', encoding='utf-8')
+ \6 l q" Y6 e* c4 D
text = f.read()
$ x) H/ T, A- P4 ]; h6 ^; S8 L
txt_list = jieba.lcut(text)
3 v% q4 \" w6 o
# print(txt_list)
0 Y- S5 P$ W* a" _" L5 X7 W* q
1
: W$ z0 _ R: p. {! g t5 E: {
2
T' b" D0 U! s/ P
3
`5 o; ]# Q" ^6 r' G" Z2 T
4
* s. z- N, I- J
列表整合成一个字符串
, O" v; A7 `+ J1 M% U! P* Y3 |4 `
0 E. V0 Y7 K: |, G3 \8 ^
& f9 t; j: [/ X0 E% O5 g* c' u- g
string = ' '.join(txt_list)
4 c" G n2 q" j [% ?% h2 s' S
print(string)
( Z3 d* H" G' j# v& x! J
print('---'*50)
: {- Y% J) C0 p
print(str(txt_list))
$ ?( B. R/ M8 C) \. \
1
! O- Y+ V# [* H' ~9 k
2
, x. E+ a' P! ]6 C8 u' e- v
3
) {, b3 w. F1 U: v4 R
4
7 f9 Z: p( T2 k/ ]6 ~! n; ]
词云图设置
% j( `) `) q% p* N0 U7 L2 G
0 Y! O3 c: Q8 |, H
! j3 e' ^5 w' F/ y% r- Q
wc = wordcloud.WordCloud(
. |( N+ V4 v5 h' S7 m
width=1000, # 图片的宽
4 z0 u M! n1 R/ l$ u; v
height=700, # 图片的高
3 i2 u( _" V1 C
background_color='white', # 图片背景颜色
. N# L* Q1 e) M( ~* J% d X
font_path='msyh.ttc', # 词云字体
, b# g' Z/ z7 Z7 X0 t$ p# [' G, W- E
# mask=py, # 所使用的词云图片
$ {" g& u. ]3 {8 M1 l+ n
scale=15,
, l1 ` T+ @7 s+ }
# stopwords={words}, # 停用词
, |$ ], L/ ~- k0 k! z
# contour_width=5,
- n' o" y2 a" l- {/ M" {, Y
# contour_color='red' # 轮廓颜色
1 N6 E- r0 R- L7 u! b' p( B
)
; P5 K; B! R% r8 I+ l
1
6 n) _, |! m# t! o
2
5 z$ i+ s" g' R+ k: ^+ ]) N
3
/ p% \: H. n. q3 j( V) _+ f/ Q+ T; z
4
( @. A x/ D" a. O4 j% n
5
9 L& l* L8 Y4 b% y" ?
6
. ?$ h" O" C1 z2 ?8 r
7
# ]* m Y0 x0 J+ z: p
8
8 Z! J" d, _$ R D" Y" Q
9
: ]+ ]9 j2 h' ~
10
6 O4 o' _" [# i. P2 a
11
/ V3 {/ D s2 m6 v! g: ]
给词云输入文字
5 }, i6 ], e% Z
# O& X- s$ a4 d
2 {9 `/ F2 N/ g8 [2 t1 D
wc.generate(string)
5 K/ H, Z8 ^0 ~4 x
1
( A( T6 v U! B
词云图保存图片地址
- c [/ ~3 n8 Z9 ^, D7 R
9 w2 b, G" f9 Z9 T% C; ]
/ ]+ A5 |! `0 F& S$ C# S) h' p3 u) i( ?
wc.to_file('output1.png')
9 S0 `% o; T/ i) @! J: ]
1
+ |; X% e+ S4 Y6 \ k* |+ V
词云图的过程中有点慢,大家不要心急
* Z4 X: g$ k; W; \! m
7 u2 n. [" o5 {8 r. Q9 m* Y+ O
( T; [9 w5 F- }& P& v! G5 u; \8 Z3 A
这是最后的结果
, M# G( a! Q; f; Q
: c( l( X4 j1 g/ {+ m
+ X8 V D' t# t+ |# B3 m! ]
没有加停用词,所以一些无用的词比较多
0 q3 ~/ G' [3 |, j3 Q' s: q
1 c" L$ X: C4 G5 e5 A
% E ?# v0 N) T0 b
stopwords={'了', '啊'}
* l4 V# A& K7 I5 a% W" n! Y
1
/ V. _( ?2 E4 ~3 a
把这个部分的代码加入要屏蔽的词就OK了!比如我现在把 了 跟 啊 这两个字屏蔽了。
& a$ M1 H2 ^/ B" W( c" A
我们再来看下
9 l+ F: T, P+ k
0 V4 L0 v$ s3 ?; V: j
# ]9 p# R5 n- f- p* {
不知名网友:666666 牛批 老哥我要学!!!
3 ~; t1 a7 Q3 t! Y% X
5 q7 W4 E9 E+ [7 Y
7 L+ U7 q5 K/ B3 e; j/ f% U! I8 y& E
1 Z% w+ p4 `2 _: s! p
1 L0 q: {$ I0 m! j @# ]1 h% V
————————————————
9 [: U+ q6 t. y+ W
版权声明:本文为CSDN博主「编程界的泥石流」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
4 ^9 K+ E8 @; p! w: h
原文链接:https://blog.csdn.net/ooowwq/article/details/119211907
, Y( z+ [9 L; D3 F& a
$ t1 J5 }7 b. i0 E
. x( G$ m' y \6 x3 S
欢迎光临 数学建模社区-数学中国 (http://www.madio.net/)
Powered by Discuz! X2.5