- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 566428 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 175151
- 相册
- 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表格% _6 V& I' v1 x* ?% r1 q+ \
效果图:
. N4 o! @9 {' E
+ g" n+ p- T- T4 ]0 F2 `! `' t
1.工先利其事必先利器,首先我们得下载相应的库:
% _0 d. @9 [$ p, i/ \+ spip install requests+ Z5 j! U0 h: M" \
pip install lxml
1 `% x- ]5 C P( Z' `* R; _pip install xlwt
$ s. Q! d& U0 f2 F' O7 k2 U: b/ Y- \" a- e9 Z5 K0 b9 w
0 g5 G( Y; o! S0 a5 R
requests 向网页发送请求; t F, D* N' J9 g
lxml 处理xml文件(xpath)
, _$ l3 m5 q' nxlwt 对Excel做写入操作
6 o+ X, B0 T8 K9 V9 ?# I# E2.爬取b站热门视频的信息:
6 ?6 E/ F% j9 w4 [+ e 打开b站热门视频页面:; E' G5 D: q R0 x
7 m8 w4 g6 S0 M( U- p+ Y2 }' v 按f12进入开发者选项,然后点击选中你要获取的页面信息,即可找到该信息在该HTML文件中的什么位置(这对我们用xpath获取元素属性和元素值很重要),例如:' `' U% @ G) z9 u
6 Z) H; @% }* c( Q5 e% Q
代码如下:
# o9 H. Y$ ~4 K& F0 M. Y" D$ b# 爬取b站热门视频信息
- X$ M5 }( Y* d( h! Adef spider(video_list):( R- N8 _% `) o' g/ B* C
url = 'https://www.bilibili.com/ranking?spm_id_from=333.851.b_7072696d61727950616765546162.3'
" N8 p4 G1 y0 y7 @3 v" v# H html_data = requests.get(url).text! Q( f% j* y- Y0 H8 Z
selector = html.fromstring(html_data)
) k: c: l* S/ z7 y" k( { infolist = selector.xpath('//li[@class="rank-item"]')2 I6 c3 \$ p* v: m% z8 u* f. J# [
for item in infolist:
* a% W; ?4 K8 f/ [/ X9 p! P rank = "".join(item.xpath('./div[@class="num"]/text()'))
8 {. A7 |& A0 R; I videolink = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/@href'))
" N6 H; a- A$ B* E5 `" [2 W title = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/text()'))6 y+ i1 y z) T. n) ^' r4 X/ p
playinfo = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/span/text()')).split("万")2 F% r0 x8 x" [, Q0 M3 J; T
play = playinfo[0] + "万"6 I; Q3 c6 f6 [, f
comment = playinfo[1]
3 f, g" @7 p* [! Z, s2 h0 ~! k6 r, Q if comment.isdigit() == False:" V/ G, p! b5 ]; N6 \9 o- g
comment += "万"
: b# B2 d7 e5 O4 a7 | upname = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/span/text()'))
$ `) p: I' \5 A5 k3 I2 t( W2 F uplink = "http:" + "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/@href'))' w) d1 c3 X; F% s( h7 L5 y6 n
hot = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="pts"]/div/text()'))
' @) }( r" k/ h: W5 n( @8 p video_list.append({- ]1 f$ e5 {; _$ |' C) \
'rank': rank,9 S3 C2 Q( z4 |; c- v
'videolink': videolink,6 C e8 S5 c1 t, J, x0 W- w* q+ g' k" q
'title': title,
, l, h4 `, i5 h) ?3 M8 J 'play': play,
6 s2 h B4 G# y% n5 I 'comment': comment,) E0 E+ ?+ G3 c% a& H3 j1 V
'upname': upname,& Y1 }6 O( [, a' D+ ]
'uplink': uplink,% F7 Q( U c; z7 [/ j, f
'hot': hot# N* E+ o0 W- I2 B; v7 R: ]
})' ]+ ?: N8 w! Q
return video_list
$ F, [& n4 U3 Z, B7 W& o( l
. C( a# x) n7 [
6 r5 S2 d- l- Z# ^3 \3.将我们拿到的信息集合(video_list)写入到Excel表格中:
% e! e2 o6 {; ?7 f' i, o xlwt的基本使用方法:
* i) Q& @6 L( K; y* h, F8 }5 ximport xlwt
, L- D3 m' c% ?! R# 创建一个workbook (并设置编码)/ G. a% t; \* l" k
workbook = xlwt.Workbook(encoding = 'utf-8')
& @+ i9 e; Y0 }6 {# G; m# 创建一个worksheet, @1 b0 q1 [4 ? B1 t! }
worksheet = workbook.add_sheet('My Worksheet')
6 h. A$ C5 U, K' E+ `1 M
# N' P0 Z$ Z7 R! ]( p2 Z# 写入excel
3 x/ I1 C+ K5 X& F% [: ?/ a8 T# 参数对应 行, 列, 值,(格式)/ B* R# r+ j+ Y
worksheet.write(1,0, label = 'this is test')
5 m/ `0 B$ o$ a1 r1 ?# 保存
2 `2 `- o4 W1 p; ^; m( N' v8 e#参数为你保存该Excel文件的路径; S$ s9 ?2 p; e+ z3 }
workbook.save('Excel_test.xls')8 c9 i/ p6 C7 E& N
& ^- m) N" H* I6 W! o
5 [ d5 A3 s8 Z1 r
如果我们想要点击视频名或者up的名字可以跳转,那么我们就要使用Excel表格的HYPERLINK方法:
$ S2 m" d& }3 A5 o, tHYPERLINK(“http://www.baidu.com” ; “百度”)
" {. A! F, t$ n百度为显示在单元格的信息,而前面的链接为跳转链接。
6 e' r- m: D! Z8 x$ `+ ^! V2 o1 Exlwt.Formula()方法需要传入一个字符串s,s=‘HYPERLINK(“http://www.baidu.com” ; “百度”)’。
% B9 w* ^% c& a/ m) m代码如下:( r: J8 U' R( k6 [- a& `
# 将爬取到的数据写入Excel表格
" O: i* ^. q C' S" K) ~def write_Excel(video_list):6 h6 U; t3 I& F- ]; A
print("将b站热门视频信息导入到Excel表格:")
% a4 |' O8 a/ M2 Y V# d" x& Z workbook = xlwt.Workbook() # 定义workbook% {) k, D3 d* o" U
sheet = workbook.add_sheet('b站热门视频') # 添加sheet
3 t/ |+ A& m, S6 ]# h% s% B4 w xstyle = xlwt.XFStyle() # 实例化表格样式对象
4 t: [0 I* J/ w5 C; V, | xstyle.alignment.horz = 0x02 # 字体居中
# ~( r& h7 K# M9 ` xstyle.alignment.vert = 0x01 # 字体居中/ s! p+ y( T7 O4 g/ K/ {' [3 Y' U' w
head = ['视频名', 'up主','排名', '热度','播放量','评论数'] # 表头9 O& Q2 l) D# Q
for h in range(len(head)):
, A, c5 n+ ^: E$ i3 N sheet.write(0, h, head[h],xstyle) # 把表头写到Excel里面去
( F- b0 E; c+ i1 x; {; @) b" j i = 1- n$ K- c4 `1 ]9 ?+ E( V% V h1 u
for item in video_list:
5 C1 a" v' h% m& l% x) \/ L) q # 向单元格(视频名)添加(该视频的)超链接
6 Z7 D6 N' P. ~' I& d) X+ L title_data = 'HYPERLINK("'+item["videolink"]+'";"'+item["title"]+'")' # 设置超链接
& a0 U7 _3 F* O+ i sheet.col(0).width = int(256 * len(title_data) * 3/5) # 设置列宽
o3 ^# M1 h7 m$ l- c a3 k/ T sheet.write(i, 0, xlwt.Formula(title_data), xstyle)0 n) w0 c) k# q% L
name_data = 'HYPERLINK("' + item["uplink"] + '";"' + item["upname"] + '")' # 设置超链接8 c: f9 r# o6 s" y
sheet.col(1).width = int(256 * len(title_data) * 3 / 10)* V" j+ E9 ?. a2 b1 E7 ]! O, c, e2 ]7 Y
sheet.write(i, 1, xlwt.Formula(name_data), xstyle)7 Y5 |* H" F; R7 z
sheet.write(i, 2, item['rank'], xstyle)3 \5 q! F* K6 [$ w! {
sheet.write(i, 3, item['hot'], xstyle)
3 [5 j R& b! ]" I. a( E sheet.write(i, 4, item['play'], xstyle). G) g: B% D& j; T% g3 G
sheet.write(i, 5, item['comment'], xstyle)
$ }8 j. m6 C! b: x! @ i += 1' P- ?/ i! I& L8 l& a( Y5 m* I) ]
# 如果文件存在,则将其删除
' g6 J; M% t1 H2 Z" E& D( ~ if os.path.exists('D:/Test/b站热门视频信息.xls'):; Z- m# C: O1 c& o' p
os.remove('D:/Test/b站热门视频信息.xls')1 l! W- i2 c, f9 k3 m: c
workbook.save('D:/Test/b站热门视频信息.xls')
9 D3 R- @! u9 a+ M, L print('写入excel成功')
" ]% m. b/ W8 K( \5 ~ print("文件位置:D:/Test/b站热门视频信息.xls")7 s/ c. s' V- R: \4 M# K" o% g5 p7 E
1 X) d { @ e- o% {. ]
. `0 ]3 W( a# g. v* g% D- a8 u' X; ~4.在入口main中调用上面两个函数1 R1 T$ g1 `- ^ W! G; p
完整代码如下:9 a) }. t/ h _" q
import requests
( Z7 a' ~7 q( V9 b" H6 ?1 Sfrom lxml import html
! Y7 D9 c3 @$ v' r) J+ himport xlwt
. y* I2 V3 Q4 r5 e3 L, Rimport os' K9 ^* f! N, N) J; f
1 s; X+ V* @8 B) ?. k
# 爬取b站热门视频信息7 r& V+ z7 A- q8 M& `3 k) D. E
def spider(video_list):
% ~0 M! I5 L7 Q url = 'https://www.bilibili.com/ranking?spm_id_from=333.851.b_7072696d61727950616765546162.3'
2 S$ ?& c1 o- Y$ w! Y$ k9 M7 r html_data = requests.get(url).text
1 I1 z1 l8 G& y4 X( ]" n selector = html.fromstring(html_data)
4 b! K( @5 d, E# d' ~ infolist = selector.xpath('//li[@class="rank-item"]')* l4 `$ P0 M( K3 Z1 a9 n7 h
for item in infolist:% }& u9 ~" E4 r2 e. f+ O9 N, w
rank = "".join(item.xpath('./div[@class="num"]/text()'))# u4 ^% F9 r. g' `7 W
videolink = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/@href')) Z+ y3 X% n% n+ f1 C
title = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/text()'))
4 R4 g9 N C1 E# j playinfo = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/span/text()')).split("万")/ i' u) h8 F, b) I* W, k
play = playinfo[0] + "万"
2 J, E3 I1 f4 o' \ comment = playinfo[1]
: h; s2 }% R! g) P \4 k4 x" e$ J if comment.isdigit() == False:! F& _7 C) d7 w% N
comment += "万"
6 t" l# |$ U z upname = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/span/text()'))
) n4 w4 @/ v1 o% O$ N9 V; g4 { uplink = "http:" + "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/@href'))6 y: ~7 f$ a0 o @' ?
hot = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="pts"]/div/text()'))4 z" B; z1 V: i/ i
video_list.append({" K8 W* p; ?7 w$ s
'rank': rank,. j9 t! @ h, y+ o: _! W" d
'videolink': videolink,
4 D0 q- J* N7 ^; U4 f" z 'title': title,) B9 D( m( Y6 o4 d( v
'play': play,; n& O4 J6 r y: k3 a
'comment': comment,& R$ x5 l# _) S
'upname': upname,; w7 U$ R0 i \9 b5 j5 @4 d; y. z
'uplink': uplink,' m, P: C- z H6 S# ?
'hot': hot
5 r* B/ Y; P- b3 @' \( D' s })2 r9 r) k, Q/ M {) h
return video_list
0 ^4 R) }2 o2 N( F" u) h' L+ n: l
6 D! }. A" T7 L# 将爬取到的数据写入Excel表格
5 {0 Z2 a" u/ B) I8 ydef write_Excel(video_list):
; a! {0 w9 [8 r8 {; u: ?% T. W print("将b站热门视频信息导入到Excel表格:")
0 b% ?* S, z7 p w! s workbook = xlwt.Workbook() # 定义workbook
1 `1 Z) }% ?6 ~ ] sheet = workbook.add_sheet('b站热门视频') # 添加sheet g1 L' X0 u% V! j' I, ^
xstyle = xlwt.XFStyle() # 实例化表格样式对象
& \% A4 Q F! \& j$ H. p/ z xstyle.alignment.horz = 0x02 # 字体居中
7 Z1 b- ~/ ~: [9 T- x. F1 g xstyle.alignment.vert = 0x01 # 字体居中
8 [ E, g% b$ ^2 ` head = ['视频名', 'up主','排名', '热度','播放量','评论数'] # 表头
+ C) _, d# I3 L9 E4 ] for h in range(len(head)):6 i% X" | E8 Z% B
sheet.write(0, h, head[h],xstyle) # 把表头写到Excel里面去# \( u- D0 S* ^! Z3 L& b
i = 1
1 _0 D6 y& U: {2 I% a for item in video_list:
+ {) ?+ _( x, S, I3 } # 向单元格(视频名)添加(该视频的)超链接
/ s& u2 a* _3 l* [8 _ title_data = 'HYPERLINK("'+item["videolink"]+'";"'+item["title"]+'")' # 设置超链接
* j9 o& U) r% u# y sheet.col(0).width = int(256 * len(title_data) * 3/5) # 设置列宽/ I/ o. `- h$ X: W) ~/ |& L( A
sheet.write(i, 0, xlwt.Formula(title_data), xstyle)6 `6 n" K& g, y9 F+ F4 Z
name_data = 'HYPERLINK("' + item["uplink"] + '";"' + item["upname"] + '")' # 设置超链接
( ~: S4 u; I) `2 r/ G& P- Y sheet.col(1).width = int(256 * len(title_data) * 3 / 10)' w& u/ J9 R4 Q! x8 H
sheet.write(i, 1, xlwt.Formula(name_data), xstyle)# y; [1 N9 E$ p' ~3 H
sheet.write(i, 2, item['rank'], xstyle)( `2 S( r9 M u% E( W
sheet.write(i, 3, item['hot'], xstyle): j$ F) s: y9 ^8 C- p' @ h
sheet.write(i, 4, item['play'], xstyle)
, {0 t% P0 _: s5 i$ O9 a1 a" {/ d+ S sheet.write(i, 5, item['comment'], xstyle)
8 e$ b# Z4 e( W, t/ F! a8 q i += 1
' w7 S+ ~, X# A$ \, D' {* c # 如果文件存在,则将其删除
# h0 g, v* [/ m' o7 p/ {# ^/ r, y% M if os.path.exists('D:/Test/b站热门视频信息.xls'):
d0 k. b% j/ j4 `) H# Y os.remove('D:/Test/b站热门视频信息.xls')
/ ^, m/ V# D, A workbook.save('D:/Test/b站热门视频信息.xls')
& n& W S6 e7 Z7 H; s3 `7 E print('写入excel成功') d6 O4 n' @# I
print("文件位置:D:/Test/b站热门视频信息.xls")
% V9 \8 o9 z5 M; K0 l, r1 V) }7 S3 ^* @
if __name__ == '__main__':4 ~4 g& X/ Z# U5 d }4 Y
video_list = []" E: z: V' m4 u0 G9 I
write_Excel(spider(video_list)), c/ c) z* a. I/ x
# D3 i: S$ H& s$ B- B- H8 w* e9 G; w
& g1 |9 I8 }$ G- k
) U2 I1 z: I, k! ?
" u( E8 |7 B" ^7 I. ~, l6 J6 Z8 l' J# W/ @7 L5 T4 @
|
zan
|