- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 559188 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 173129
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 18
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
Python 爬取b站热门视频信息并导入Excel表格
9 Y( J8 v' ?, @. w' n" u/ x效果图:$ }6 [ }% f* i8 Z! [6 y% Y
- A9 q! @. U$ D, B B1.工先利其事必先利器,首先我们得下载相应的库:# b8 y& F: @' o8 P1 F' W( G/ q. H
pip install requests6 i' v& Y: V7 n* r9 o
pip install lxml, Y w9 D8 o" ~+ @
pip install xlwt
5 u/ L9 Q; A. G- {2 ?+ p2 n4 A( q; r0 W! T& w! y3 H
& z9 J$ a8 n, E- h) h( T: b
requests 向网页发送请求- g" D7 g9 U+ A3 z, x
lxml 处理xml文件(xpath)
* i( p5 C) I6 G1 @ [xlwt 对Excel做写入操作% d6 H+ r9 n4 K! i- C
2.爬取b站热门视频的信息:3 r1 D& n3 |( P. A( f. {
打开b站热门视频页面:' z% y! o9 f: x1 {4 C
7 s' ~" S) g- c5 l 按f12进入开发者选项,然后点击选中你要获取的页面信息,即可找到该信息在该HTML文件中的什么位置(这对我们用xpath获取元素属性和元素值很重要),例如:
0 p7 n$ d0 F8 c+ r
; u) X: L7 f# i# I* c
代码如下:$ A: H8 a6 G& v" A5 N6 ?3 [$ p
# 爬取b站热门视频信息
; F1 q) N! t" T- q6 Edef spider(video_list):! m4 D) @! E" H: G2 C7 j
url = 'https://www.bilibili.com/ranking?spm_id_from=333.851.b_7072696d61727950616765546162.3'9 C; ~/ P9 U& _9 j/ f! Q
html_data = requests.get(url).text) M& G1 w5 D3 i, s, S, g" D' T3 D
selector = html.fromstring(html_data); e- N# B; B* N% @8 N: e* |, F* z
infolist = selector.xpath('//li[@class="rank-item"]'). Q! h, y7 q+ H+ k3 `# h7 ?
for item in infolist:4 L7 t/ e* X0 q4 s8 }1 z S
rank = "".join(item.xpath('./div[@class="num"]/text()'))/ S' V- h! ~5 l' m6 w8 e; p
videolink = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/@href')); p l4 k1 W- U. A+ S- b
title = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/text()'))
& s2 D( s3 f+ }& r9 a. [7 { playinfo = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/span/text()')).split("万")
' }( E9 f1 v S% p. [4 q play = playinfo[0] + "万"
! g+ [ ?1 E2 @2 w comment = playinfo[1]
# T- J$ Q. J& b* b if comment.isdigit() == False:
/ b! b- |+ f1 k% o4 _ comment += "万"6 b7 S6 V$ ?$ [+ K" o* x
upname = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/span/text()'))0 C' ]5 s1 m# Z/ z
uplink = "http:" + "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/@href'))/ `/ `" m+ D# t o
hot = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="pts"]/div/text()'))
, a# S# g S& g0 m5 c video_list.append({
1 W. U: b8 T1 n1 B& c 'rank': rank,0 d! y- Y9 M0 |3 j s/ P. s
'videolink': videolink,/ h+ B8 I B0 y( t! W G1 s
'title': title,
& t$ m) A( {1 y. O 'play': play,
* o5 f1 r( Y. z+ r3 q8 r- o$ | 'comment': comment,
# x: T- Q4 s9 f 'upname': upname,1 v5 @ e I8 H2 K' y/ e3 }
'uplink': uplink,% W6 \# Y8 z d+ B7 Y, v& g j
'hot': hot
# O! v" f0 o, c! q+ x. ^4 ~( Z5 X })
( V5 n% J$ |! V; `2 [" E return video_list/ C* ]8 \" O: }9 s' z' G
2 ~! j3 T x% [, o2 [: N3 s. E1 F D7 j$ d: p
3.将我们拿到的信息集合(video_list)写入到Excel表格中:
0 U9 V; i& a% W& } xlwt的基本使用方法:7 w* g2 T6 W$ ~* ^: }; k; f+ Z
import xlwt/ {$ ~! M P' f @4 K) o% T2 v2 x
# 创建一个workbook (并设置编码)
7 N" @& [. q8 t0 A5 Gworkbook = xlwt.Workbook(encoding = 'utf-8')
# I4 K. y+ Y* }8 p: I# 创建一个worksheet; U/ l( k6 B( X0 _2 d/ G
worksheet = workbook.add_sheet('My Worksheet')+ K1 q8 h- t9 N" Q4 k* D' J
Y1 g0 x6 W6 D/ n0 ?6 R6 U# 写入excel6 ^2 H& S" n; a" K t
# 参数对应 行, 列, 值,(格式)9 [: `3 w1 T6 Z5 X7 N
worksheet.write(1,0, label = 'this is test')
7 g: y3 M5 C* i$ N' t# 保存
3 Z1 Z5 m$ h m& O1 u, t2 z6 n" V1 B#参数为你保存该Excel文件的路径
' r- z9 a/ H F9 W( iworkbook.save('Excel_test.xls')
' ~' W7 d, P+ V6 ~- D5 {, g C' h9 `
* V$ a, c/ R! I: j5 H
如果我们想要点击视频名或者up的名字可以跳转,那么我们就要使用Excel表格的HYPERLINK方法:- T( D( E0 U: l
HYPERLINK(“http://www.baidu.com” ; “百度”)5 Z6 [. y7 ~! |/ F; s
百度为显示在单元格的信息,而前面的链接为跳转链接。
2 L" T- S: {) E$ l" jxlwt.Formula()方法需要传入一个字符串s,s=‘HYPERLINK(“http://www.baidu.com” ; “百度”)’。. A3 G) ]9 J& ? r' c7 i
代码如下:
4 F" R# {/ W6 V! c! _" ]' i% Z9 P$ K7 {# 将爬取到的数据写入Excel表格4 y) [7 u6 P$ e/ z
def write_Excel(video_list):& y: |) |( z( \& O& j: Y a5 j
print("将b站热门视频信息导入到Excel表格:")3 ~3 n; R" [; _/ Y/ f3 e
workbook = xlwt.Workbook() # 定义workbook) E' `2 C, N' W6 t( O4 N4 d
sheet = workbook.add_sheet('b站热门视频') # 添加sheet) G0 V0 f& m/ Z* A: T/ j
xstyle = xlwt.XFStyle() # 实例化表格样式对象
$ H& C+ }: I6 b1 E xstyle.alignment.horz = 0x02 # 字体居中5 W9 z( B# H3 T( ~, }8 o' h% i
xstyle.alignment.vert = 0x01 # 字体居中
7 G4 X! g- P+ ]. Y8 a J# V9 ? J head = ['视频名', 'up主','排名', '热度','播放量','评论数'] # 表头: o; ?) f( {- G0 D+ ?3 G6 w
for h in range(len(head)):, C2 S0 J. x( d" y o! G
sheet.write(0, h, head[h],xstyle) # 把表头写到Excel里面去
j7 P4 ]- Y1 b0 ]( t% h: R i = 1: v K0 I" v! \% P
for item in video_list:
, P& f, ` o# y( t5 l" t0 N # 向单元格(视频名)添加(该视频的)超链接
( ^3 J& U: {5 z title_data = 'HYPERLINK("'+item["videolink"]+'";"'+item["title"]+'")' # 设置超链接
& X) V. m V6 k- q( ^% N sheet.col(0).width = int(256 * len(title_data) * 3/5) # 设置列宽) K; Y- r2 \. r
sheet.write(i, 0, xlwt.Formula(title_data), xstyle)
1 F9 g) X* i, G- Q" l: }1 ] M! ~) S. Q name_data = 'HYPERLINK("' + item["uplink"] + '";"' + item["upname"] + '")' # 设置超链接: f2 a- P1 `9 R7 o% y: J- K
sheet.col(1).width = int(256 * len(title_data) * 3 / 10)2 D( f" z& e0 L, r
sheet.write(i, 1, xlwt.Formula(name_data), xstyle); {* d4 t9 U. X# Q
sheet.write(i, 2, item['rank'], xstyle)9 c0 @. C$ B( b' u: b4 n
sheet.write(i, 3, item['hot'], xstyle)
4 _% m; D% g% A' C sheet.write(i, 4, item['play'], xstyle)
- q4 Q" C% c4 t- Z$ i0 W sheet.write(i, 5, item['comment'], xstyle). X% a: t4 f& n& N
i += 1
. h9 U9 c5 C2 D! a # 如果文件存在,则将其删除1 S) [% e% G8 d, y) {1 z; @. L5 e! v
if os.path.exists('D:/Test/b站热门视频信息.xls'):
# f1 h8 J7 v _ os.remove('D:/Test/b站热门视频信息.xls')
6 f' E1 k7 v; k$ Y workbook.save('D:/Test/b站热门视频信息.xls')" H, h; _( d$ [0 B
print('写入excel成功')" L' {( W. B1 ]6 `9 o/ V6 V
print("文件位置:D:/Test/b站热门视频信息.xls")
# Z% g m6 p U* |0 }2 A2 O( z- \4 s0 C( p- Z
# g2 B; b7 Y! c, `4.在入口main中调用上面两个函数
- H& `/ k8 B& ]' W7 u# J+ Z0 l0 i完整代码如下:+ w, @1 R) n" h& ]! H
import requests
* i- l- n7 J; L* y3 o" f8 [from lxml import html! O3 ~# K0 ?9 u: F& x% S Z
import xlwt
) j6 S# c0 O) H+ r Simport os
; r) d! U+ O- r; {5 M% g4 v U, m+ @& i: y
# 爬取b站热门视频信息) a' l9 l! f) Y, ]0 x
def spider(video_list):6 a/ r+ l2 H9 l5 P! t
url = 'https://www.bilibili.com/ranking?spm_id_from=333.851.b_7072696d61727950616765546162.3'
6 Z; k2 _+ n$ {7 g html_data = requests.get(url).text+ i+ G1 P% Q! v1 A k
selector = html.fromstring(html_data)
" w$ P% i& I% }; v; b# z" U: J infolist = selector.xpath('//li[@class="rank-item"]')
9 P% ~% ^) C5 ?, F for item in infolist:1 f% {3 `1 C1 E( C; s7 K" b# p
rank = "".join(item.xpath('./div[@class="num"]/text()'))
+ m8 ^" L- P8 p, o, m videolink = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/@href'))& H* V: J. s* ?# R4 |' x# M. t
title = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/text()'))
- Q" {1 Z9 |- G" f" g, {2 B8 q8 ^ playinfo = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/span/text()')).split("万")
9 X: V& a& B. J9 D play = playinfo[0] + "万"8 @) Q \/ q" _
comment = playinfo[1]
( U3 u4 I0 a" u! P if comment.isdigit() == False:' x, _+ ]% [! f* p' D
comment += "万"* M, J% W; ^- ^* g
upname = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/span/text()'))
8 W2 m3 }, B7 M( u1 D" z uplink = "http:" + "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/@href'))% B" ?6 F; ]5 R4 U$ z
hot = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="pts"]/div/text()'))
m/ h: {) d! q- x0 @2 T7 O; J7 E video_list.append({
, D6 s- w( ]2 Q, u7 H% r 'rank': rank,
% N2 n9 l! z1 ]3 U# h7 W 'videolink': videolink,5 o9 N$ h; e0 d
'title': title,
8 }2 i+ r' v: j, ` 'play': play,
; Z5 e% {- U9 K) ?0 d: @: h+ Y* x 'comment': comment,
7 j! w0 Q4 ?& l% Y @# m 'upname': upname,9 W. B2 f/ v; L: ]" z
'uplink': uplink,
& j y4 f( @; v+ u 'hot': hot
5 `$ G3 S% e4 m) H' K5 {. |. x: E) z })
& b7 ?8 r( _9 n9 G& `+ X return video_list
4 S: y) ^! d/ Q( E V2 g5 _9 P
" ]' v- f1 p3 k/ V' b# 将爬取到的数据写入Excel表格
. E' a' z) f3 L. K( u( e3 pdef write_Excel(video_list):
: X+ u9 F9 O( S0 J print("将b站热门视频信息导入到Excel表格:")
4 p2 D4 o5 t- a$ s workbook = xlwt.Workbook() # 定义workbook: F# j# P! l5 M% Y' ^
sheet = workbook.add_sheet('b站热门视频') # 添加sheet4 X/ b2 e1 {4 |" `
xstyle = xlwt.XFStyle() # 实例化表格样式对象# y7 S: s5 V- @, j( E6 g
xstyle.alignment.horz = 0x02 # 字体居中5 F" J$ q! s$ Q. {7 d; @
xstyle.alignment.vert = 0x01 # 字体居中+ s1 c: j/ {+ p1 P
head = ['视频名', 'up主','排名', '热度','播放量','评论数'] # 表头9 l8 k+ w6 y# H* l
for h in range(len(head)):; u+ Y) H; h1 D% N
sheet.write(0, h, head[h],xstyle) # 把表头写到Excel里面去
; a( _# L2 Z z( V/ k* q i = 1, a$ X6 X/ t: d9 X! S& M
for item in video_list:
- i9 z H& p1 X1 C- q # 向单元格(视频名)添加(该视频的)超链接
" V5 x. b9 w( T/ M/ }7 | title_data = 'HYPERLINK("'+item["videolink"]+'";"'+item["title"]+'")' # 设置超链接 j& W% A9 a, z3 u. n
sheet.col(0).width = int(256 * len(title_data) * 3/5) # 设置列宽3 `; I4 y' o, u; l8 x7 k: A
sheet.write(i, 0, xlwt.Formula(title_data), xstyle)
! ?6 M! I# a$ t7 C0 [, D" G4 Y name_data = 'HYPERLINK("' + item["uplink"] + '";"' + item["upname"] + '")' # 设置超链接
8 n% |+ J* e! z0 I4 ] sheet.col(1).width = int(256 * len(title_data) * 3 / 10)
7 v6 l" C2 M1 t sheet.write(i, 1, xlwt.Formula(name_data), xstyle)
0 T' }6 M: j* o2 S sheet.write(i, 2, item['rank'], xstyle)6 e! c; K; T0 Y+ |7 O( K
sheet.write(i, 3, item['hot'], xstyle)
1 P+ B1 K. d+ m( Y. [* Q' m sheet.write(i, 4, item['play'], xstyle)
Q" {9 {" M) v# L- _ sheet.write(i, 5, item['comment'], xstyle)
: k; u V, ~4 \1 ]3 w. m i += 1. ]8 N) m5 f$ ~1 W& C* w3 O
# 如果文件存在,则将其删除
. x2 k4 ^6 V4 }, C if os.path.exists('D:/Test/b站热门视频信息.xls'):
5 O$ L2 N7 V/ X" n' P os.remove('D:/Test/b站热门视频信息.xls')
t* `- F7 P0 y workbook.save('D:/Test/b站热门视频信息.xls')
: S' T' F7 `6 g, c+ z) I6 Q" K" E print('写入excel成功')
# Q a4 G3 X3 `6 |7 V* T print("文件位置:D:/Test/b站热门视频信息.xls")' Y1 e" b7 N+ w0 r& r2 k5 x/ P
8 }) S4 S! n( T; eif __name__ == '__main__':7 b1 _; i6 X' e
video_list = []
5 n" C/ w* |% @ write_Excel(spider(video_list))9 Q: u+ u" `- j, s5 }# \
: ~' w5 E- C K. K$ e4 e: Q: D+ J& k" w: S; F/ e: \
6 p5 E7 X2 t6 [: L: z" ^5 M
8 ^% ^2 q4 L' [" Y$ g
4 X( a2 a" s# l |
zan
|