- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 565364 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 174832
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 3
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
|---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
Python 爬取b站热门视频信息并导入Excel表格. X7 k8 U( M+ n' Q0 Z0 I, u
效果图:/ m& C5 w( _ M$ }, A) z
5 ], ^. r7 ^' N
1.工先利其事必先利器,首先我们得下载相应的库:/ k& E* Y& {% c& ]4 |
pip install requests
- j) [* u+ }+ Z7 G6 Hpip install lxml
: t/ y& g% C6 bpip install xlwt: h+ Z1 U0 J E: V
0 w g+ @: K6 I# T, g' f7 P5 t" m' u9 Z- K. {8 ?% z
requests 向网页发送请求
: I' Z' L$ n" t! O' ~6 F9 nlxml 处理xml文件(xpath)
7 B9 }2 S) B2 U5 K$ [/ ]xlwt 对Excel做写入操作
* N( s! l$ U; g9 [! W& `. ^/ \2.爬取b站热门视频的信息:
; F4 r( ~$ ?6 H5 v 打开b站热门视频页面:& g" F" _4 E! j: Z+ E
& I% A% c6 P$ j- N( \2 @$ X% X6 ?
按f12进入开发者选项,然后点击选中你要获取的页面信息,即可找到该信息在该HTML文件中的什么位置(这对我们用xpath获取元素属性和元素值很重要),例如:
* h+ m: c H5 f0 Z2 f
, G# r; ^. W9 r5 r- G- P
代码如下: N' P9 R" A5 [1 N$ {
# 爬取b站热门视频信息9 s5 Y. ]! y+ b& R
def spider(video_list):
* B) T9 `* P4 U! i$ l3 K- R' O& u url = 'https://www.bilibili.com/ranking?spm_id_from=333.851.b_7072696d61727950616765546162.3'1 j, S- r1 \' ~# m: ]$ C' ]; Y
html_data = requests.get(url).text
& w' P( d$ ]! h4 K& i# m selector = html.fromstring(html_data)* G w: g: l$ h5 H" `% l
infolist = selector.xpath('//li[@class="rank-item"]')8 S, [/ D/ d' ?0 z
for item in infolist:" l: s. h6 I: b8 i
rank = "".join(item.xpath('./div[@class="num"]/text()'))3 m0 P- X; r/ d7 J! I4 S
videolink = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/@href'))
7 g- ^! | K' F1 m title = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/text()'))
. n, S1 H6 d: K) y- D; z1 u# j1 o% g( i playinfo = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/span/text()')).split("万")" {( h: Q% i P1 i! d
play = playinfo[0] + "万"
8 H% x! s, N8 J comment = playinfo[1]1 P! i, e# R' I; ?& D8 \% [- {
if comment.isdigit() == False:
; k8 Q" y t/ b* I1 Q! | comment += "万"4 [/ h* h' T6 W' ^6 V' X
upname = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/span/text()'))
2 P. O! E; J% K8 [5 ]) n; w uplink = "http:" + "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/@href'))% a V8 b% ?; J1 w4 d$ U
hot = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="pts"]/div/text()'))4 D3 ?" V3 R$ v) O7 |: X
video_list.append({
+ V. Z5 V+ r' v1 `6 N b 'rank': rank,
. c5 T. r3 c3 r: g# g/ P 'videolink': videolink,
8 u+ U$ e+ T: b1 `9 K 'title': title,) v7 P9 u9 b |% M3 t9 l
'play': play,
, U) H6 e* D6 d0 n 'comment': comment,( c6 V; r/ p) B4 V5 |7 E9 u) {
'upname': upname,: }4 l3 t! `0 `% T0 @4 Y
'uplink': uplink,
* T M1 K. i; l* J7 S9 d7 l 'hot': hot
5 r0 A5 l0 R( G" z. C })
9 k0 l- _% r, v& Q2 P return video_list
6 K' R9 ~6 X& D( o' m! }- m* c
% n7 T7 g9 L- H- f4 d8 U) K" j# w) W% h7 p/ t
3.将我们拿到的信息集合(video_list)写入到Excel表格中:2 k! W& w- ^& V5 D( k0 l; t
xlwt的基本使用方法:
( X+ @) o( u7 Kimport xlwt
, M, @* }) z- b# 创建一个workbook (并设置编码); C" [8 D* J9 I& |( C% N& H
workbook = xlwt.Workbook(encoding = 'utf-8')- M9 e4 E; s6 n
# 创建一个worksheet
6 c# s# C" |4 w$ ~* y8 A& }& Mworksheet = workbook.add_sheet('My Worksheet')
M% O- N& S9 u8 B+ U
* J/ S( Q$ Q3 k! X# 写入excel; i) i1 g3 U) z: j f6 Z
# 参数对应 行, 列, 值,(格式)
: q% \/ { `- d/ R+ ?+ {worksheet.write(1,0, label = 'this is test')2 }" }. K$ B# }* H7 X# ?
# 保存
, \7 f# ?0 Q, D; C6 H9 t H#参数为你保存该Excel文件的路径
# N2 ]+ s- `5 h. Y1 qworkbook.save('Excel_test.xls')+ Y' p# }, q4 V& L* p4 V( A* w w! {
0 I% v; [* H3 T6 u- ?% L; a' m/ {% N; l/ P& m& P$ p5 l! z
如果我们想要点击视频名或者up的名字可以跳转,那么我们就要使用Excel表格的HYPERLINK方法:4 ~) ^3 |( P/ M) r
HYPERLINK(“http://www.baidu.com” ; “百度”)
0 b3 G/ E; H: R2 \# j百度为显示在单元格的信息,而前面的链接为跳转链接。1 O9 C5 Z. {: Q. k) r0 f
xlwt.Formula()方法需要传入一个字符串s,s=‘HYPERLINK(“http://www.baidu.com” ; “百度”)’。2 G$ \- N' [9 t7 s9 h: [6 p
代码如下:9 Q2 P0 [( {, Z) q/ h
# 将爬取到的数据写入Excel表格) m0 Q* J- h/ M: b
def write_Excel(video_list):
5 n/ i: G- r6 { print("将b站热门视频信息导入到Excel表格:"); S' k( N7 j J
workbook = xlwt.Workbook() # 定义workbook9 f2 {! i$ R! G, |% k! \
sheet = workbook.add_sheet('b站热门视频') # 添加sheet
* p$ _- e9 j$ m1 C2 _ xstyle = xlwt.XFStyle() # 实例化表格样式对象
5 E4 {/ v. ~' [6 B+ k: q xstyle.alignment.horz = 0x02 # 字体居中# y5 x: G( @7 x. r3 C- q
xstyle.alignment.vert = 0x01 # 字体居中
U3 c9 j0 M8 X. g! z3 ? head = ['视频名', 'up主','排名', '热度','播放量','评论数'] # 表头
9 H f- f# M- _! W$ s for h in range(len(head)):2 |9 H( _9 a& X6 i; F b
sheet.write(0, h, head[h],xstyle) # 把表头写到Excel里面去
0 {+ u7 P8 b4 M7 Z+ J( Q2 t i = 1
) B9 R- A( e. b3 q6 V) s+ b for item in video_list:, q. u3 ~* n* W& U
# 向单元格(视频名)添加(该视频的)超链接, Y' Y3 }& Y" H1 b4 @4 ~8 d
title_data = 'HYPERLINK("'+item["videolink"]+'";"'+item["title"]+'")' # 设置超链接
3 A, J) Z9 A4 x2 C& f- W sheet.col(0).width = int(256 * len(title_data) * 3/5) # 设置列宽
) r- m1 s) V' M7 k( p sheet.write(i, 0, xlwt.Formula(title_data), xstyle)
6 u: D# l# a! s2 I) g name_data = 'HYPERLINK("' + item["uplink"] + '";"' + item["upname"] + '")' # 设置超链接
, \, T! D+ s8 @+ W; i" ` sheet.col(1).width = int(256 * len(title_data) * 3 / 10)
/ s. S7 |8 ^1 U sheet.write(i, 1, xlwt.Formula(name_data), xstyle)
9 g% Q) ?6 d {# ^ sheet.write(i, 2, item['rank'], xstyle)) D! f5 s. _( U% B5 E+ d
sheet.write(i, 3, item['hot'], xstyle)
; t" ?. K+ F+ `; i) k, G9 h2 e sheet.write(i, 4, item['play'], xstyle)
/ \0 N p- Y I$ M2 o4 c sheet.write(i, 5, item['comment'], xstyle)
5 E. m7 l% \) [* B* y+ r i += 1; F/ S- D' E6 q" w0 S
# 如果文件存在,则将其删除
5 P' }6 w" Z$ x/ J if os.path.exists('D:/Test/b站热门视频信息.xls'):, t& N6 ^* k. w# v
os.remove('D:/Test/b站热门视频信息.xls')
. y/ u1 S: k" j0 u9 s; ?; W workbook.save('D:/Test/b站热门视频信息.xls')+ E7 s+ i, ~6 L: d, k. q
print('写入excel成功')
" @9 _( t+ N& b3 c. J print("文件位置:D:/Test/b站热门视频信息.xls"). _! g) M, O9 j
* O! ~; ~6 h) i7 a- ^
2 M) F& B. {3 Q6 A& b# O$ F4.在入口main中调用上面两个函数" _ A- m @8 ?
完整代码如下:, [: c) @5 L: i6 ]! h1 N; g
import requests
' M8 `( h6 W% f( p! Z" J: afrom lxml import html% K! v9 a0 y3 C. F4 f1 }9 g
import xlwt
/ [ c: K' s! ?9 _; Nimport os4 z. o9 [1 G( h" j' P3 j; W3 S
4 `/ E0 M/ @# v+ j3 K! e# 爬取b站热门视频信息
" Z$ Z5 p P9 J* w" Tdef spider(video_list):
9 A) f% o6 K% Q& W) b. u url = 'https://www.bilibili.com/ranking?spm_id_from=333.851.b_7072696d61727950616765546162.3'
3 U& {) e p, M" u5 H html_data = requests.get(url).text
: {8 ~% u/ [( u2 E selector = html.fromstring(html_data)1 N8 ?: u5 A4 F
infolist = selector.xpath('//li[@class="rank-item"]')
( z0 r4 j# a+ L5 j# R' t for item in infolist:
5 O3 ]4 L$ o6 o rank = "".join(item.xpath('./div[@class="num"]/text()'))
: N. i2 _ u! _ videolink = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/@href'))$ W* g: u; b! r5 n# p; y
title = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/text()'))! n& F( N; @0 T: E' q! [+ h
playinfo = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/span/text()')).split("万")
* _$ O7 d/ r# } v% M- J" T$ B) E6 Y" J play = playinfo[0] + "万"/ x9 w/ X p; a/ m: v; d$ \# a4 u
comment = playinfo[1]
8 i$ @( q& B, k: x' F' o if comment.isdigit() == False:
2 x3 x7 k2 c4 Y! }9 R comment += "万"1 B2 q. |9 X" h' E$ m5 c$ [
upname = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/span/text()'))7 y8 v* t, ~# l4 S% V
uplink = "http:" + "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/@href'))
L* R+ S' n5 E7 z; S6 h( U2 q/ z hot = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="pts"]/div/text()'))
+ ^: x" l+ q( A video_list.append({( G" N! F; `) e1 K7 X& p
'rank': rank,, U5 B1 q1 M- I* y3 m) A
'videolink': videolink,8 H" u- h" { @% R x
'title': title,
, Q1 y' C; A9 K- W# ]6 I 'play': play," T- {2 T; a9 o* ~
'comment': comment,
. w( {" A. p8 z0 u' C8 |. a( Z+ p 'upname': upname,
( d2 ~( T4 V: m. A% e 'uplink': uplink,. O {2 P. J9 z# t" e
'hot': hot
: p ~2 o7 x/ K }): t0 `3 H& l! A0 g+ ]
return video_list
# d4 N$ q; B$ B3 x6 N, q
6 A2 D G! y5 p' g# 将爬取到的数据写入Excel表格
: K" |, o4 _! O/ T% r6 S+ ]: qdef write_Excel(video_list):3 |6 i$ t! B1 U% {- G0 p0 U
print("将b站热门视频信息导入到Excel表格:")
: ~5 L' W2 j4 D workbook = xlwt.Workbook() # 定义workbook& n7 n' h5 A' a" T$ E9 ]
sheet = workbook.add_sheet('b站热门视频') # 添加sheet
6 ^2 y+ N& E& z xstyle = xlwt.XFStyle() # 实例化表格样式对象
9 z, p; k/ Z" a xstyle.alignment.horz = 0x02 # 字体居中
6 @+ H! j$ ^. N+ c6 n" L xstyle.alignment.vert = 0x01 # 字体居中
4 f2 @( Q5 z7 V, w1 _; o0 b0 V- o; E( E head = ['视频名', 'up主','排名', '热度','播放量','评论数'] # 表头
7 Z* W, g8 B x# H g$ {" W% A for h in range(len(head)):
- O( w9 A& r, s8 {& l; v sheet.write(0, h, head[h],xstyle) # 把表头写到Excel里面去. t- T2 s6 z/ c' T
i = 1
; C/ Q: }4 L7 Y for item in video_list:
2 b- K! L g9 P% D" o # 向单元格(视频名)添加(该视频的)超链接2 D2 E F1 Y2 W- }& R
title_data = 'HYPERLINK("'+item["videolink"]+'";"'+item["title"]+'")' # 设置超链接/ y+ h$ {2 f7 F
sheet.col(0).width = int(256 * len(title_data) * 3/5) # 设置列宽
- \1 N7 }+ D } sheet.write(i, 0, xlwt.Formula(title_data), xstyle)2 ~1 P8 t( {# V9 b7 b9 R7 n4 w( G9 o
name_data = 'HYPERLINK("' + item["uplink"] + '";"' + item["upname"] + '")' # 设置超链接9 G( M6 e2 V" X$ [3 X7 `0 |
sheet.col(1).width = int(256 * len(title_data) * 3 / 10)1 F& F' _% s5 ?0 x; `
sheet.write(i, 1, xlwt.Formula(name_data), xstyle)
# X6 O* V) ^9 [% Y" {9 P sheet.write(i, 2, item['rank'], xstyle)& k" V8 [3 @5 P5 u8 L( h
sheet.write(i, 3, item['hot'], xstyle)
# p. G( i G0 o$ O8 G, H& }' ], b9 G/ Y sheet.write(i, 4, item['play'], xstyle)6 _$ H3 R7 c% v
sheet.write(i, 5, item['comment'], xstyle), b5 q2 S/ G4 D8 I# @# O9 ?
i += 1
* @$ M# z" _: S5 W6 o* Z # 如果文件存在,则将其删除: K; B2 s; ?6 J7 k9 U5 v
if os.path.exists('D:/Test/b站热门视频信息.xls'):
/ p* j- g$ _8 g5 W4 t os.remove('D:/Test/b站热门视频信息.xls')9 b- [6 }7 A& o: P6 ]$ l0 m
workbook.save('D:/Test/b站热门视频信息.xls'): @2 e: D: \( L5 I! u" L
print('写入excel成功')
* d& x; u7 t8 ~& y; ~ print("文件位置:D:/Test/b站热门视频信息.xls")
|. H6 k: ?* z0 [& n3 ?5 G' }1 E" K8 h+ X) F
if __name__ == '__main__':, ~ V2 x2 i- A: X. r3 G: Y
video_list = []
2 ~ s/ q3 ]+ \. s write_Excel(spider(video_list))
) j: x9 k" K" p
. n: r+ t C/ r7 q5 F _$ p3 H' E j3 v1 C! E6 @/ }( _% S2 m4 } X8 N4 ]
# h, ~- f5 _3 ~1 Y5 ?7 z' k1 o
: \& J }) U I% ?
s+ s4 g5 O1 p1 R6 M7 m0 X
|
zan
|