- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 565363 点
- 威望
- 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表格% t& }6 N) a: R# R* [) Y
效果图:/ t0 A! X8 A' r' c' c
) }1 \8 V3 N+ d/ U3 l5 V1 | l1.工先利其事必先利器,首先我们得下载相应的库:
3 u) ^. N9 t6 [2 j% I+ vpip install requests6 G6 s, y$ k/ k4 o
pip install lxml
8 V' Y2 i& V( i/ |" vpip install xlwt) N/ _* e; _* _! T' k2 T- O
: j, a1 F& c+ w7 D( Z0 |$ u& t! z' N/ g' ?* S( x; v
requests 向网页发送请求
9 s$ H0 r9 B' a L5 h+ Vlxml 处理xml文件(xpath)
* Y; K* [& w4 v: N1 B; |/ bxlwt 对Excel做写入操作: z% t/ ]; s; S5 Z
2.爬取b站热门视频的信息:
, _; K" F, N3 f7 k! y' ?5 U 打开b站热门视频页面:
# C! b$ g4 H1 ~1 {/ f7 L- {! h k
w+ D+ G( X0 X0 c+ ?2 [ 按f12进入开发者选项,然后点击选中你要获取的页面信息,即可找到该信息在该HTML文件中的什么位置(这对我们用xpath获取元素属性和元素值很重要),例如:
* l. W, I& s0 \3 I* J% E2 e
6 E; x8 W6 p6 H0 I# E( H
代码如下:! f: }% y4 b, X0 R
# 爬取b站热门视频信息
, ^8 Z G% M7 @1 c) R* bdef spider(video_list):# K: s) E5 l/ D! W
url = 'https://www.bilibili.com/ranking?spm_id_from=333.851.b_7072696d61727950616765546162.3'
" u' I0 X2 r O* t) N# p html_data = requests.get(url).text2 P0 t; g- u- ]! ?" {
selector = html.fromstring(html_data)
# X2 G: ]$ b7 H infolist = selector.xpath('//li[@class="rank-item"]')8 Y) B( t9 f/ U# ]& W
for item in infolist:
; \1 }0 z" k7 R( w rank = "".join(item.xpath('./div[@class="num"]/text()'))( t2 I0 F v' y1 }1 A, {# u
videolink = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/@href'))- W( n% Y5 W2 ]
title = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/text()'))# x5 A. t. v& o7 a, S/ \2 N, s
playinfo = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/span/text()')).split("万")
4 v8 P; G& t+ a9 R# R, v4 z3 q play = playinfo[0] + "万": d6 o3 n" o: I5 E; j; h- T# C
comment = playinfo[1]
" L) }7 F4 ~4 |* E f! N if comment.isdigit() == False:
+ ]5 s& k5 b5 y0 k* L1 u+ z! R2 Y8 a% g comment += "万"# D8 E& \6 s: u8 B E+ Q. O \
upname = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/span/text()'))
7 R9 `4 J1 O1 G. a1 y uplink = "http:" + "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/@href'))2 T0 E- j$ `- x4 d6 r2 ^4 u
hot = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="pts"]/div/text()'))6 e% S. Y. l/ @5 Q+ F
video_list.append({; q0 q5 B1 ]. t" O/ D
'rank': rank,
. d+ ?5 d. `- f+ s( l8 P. A 'videolink': videolink,9 U# ?" J$ C- A
'title': title,
* I7 G4 b- C, L6 L 'play': play,5 |# Y2 L6 _! h0 |( f) v
'comment': comment,
- u7 a) a' G5 R/ |* | |% ~3 g$ r 'upname': upname,
, @8 m# t$ ?6 q; ^3 } 'uplink': uplink,
: A' i# `: ` ~: ]2 f# v4 h. B 'hot': hot6 k3 n- a) u4 S. U) Z& ]
})
1 D' V6 ~* s/ S* ^5 H% \" u& o return video_list ^" H; x- r! g$ B& I) H# L7 z6 f$ ~
% ^1 z! X. d1 M5 t% u& b0 K9 J- h9 E0 d P& L
3.将我们拿到的信息集合(video_list)写入到Excel表格中:
" p8 D, G D) t& w7 a xlwt的基本使用方法:; h* U* F& W# D2 Z
import xlwt- D# {0 d- v. }! A8 N5 B/ }
# 创建一个workbook (并设置编码)
! G5 o6 L1 {) s8 }' Rworkbook = xlwt.Workbook(encoding = 'utf-8')% e- Q/ Q2 `1 l) r
# 创建一个worksheet
! C$ x4 x% H% y3 k! ~+ Rworksheet = workbook.add_sheet('My Worksheet')3 b& M) m8 K. Z! s/ k1 X
* G3 g# o! I' p: z0 D$ n5 Q# 写入excel& d/ R/ g/ \3 G) F
# 参数对应 行, 列, 值,(格式)7 Z1 Q6 X; l6 D1 `+ B/ G6 m) [. _
worksheet.write(1,0, label = 'this is test')
8 \1 y% h+ [& ]3 O9 f# 保存$ u3 e Q' A* w0 k2 b
#参数为你保存该Excel文件的路径1 d4 B- Q% S6 w4 ?
workbook.save('Excel_test.xls')
8 e+ o7 X: l$ ] j7 Z% k% J. _5 H9 j' g( r$ H2 i& V
0 ^( S+ r: p& h: @) u. [: b 如果我们想要点击视频名或者up的名字可以跳转,那么我们就要使用Excel表格的HYPERLINK方法:$ P& U( `- z$ q! M6 z
HYPERLINK(“http://www.baidu.com” ; “百度”)
- V# I8 M9 Y, H1 I! T' [百度为显示在单元格的信息,而前面的链接为跳转链接。1 f4 Q2 x5 t* `% {. P
xlwt.Formula()方法需要传入一个字符串s,s=‘HYPERLINK(“http://www.baidu.com” ; “百度”)’。
: M( F' n& X6 `: E$ O+ ^! V+ y代码如下:
. q$ C2 Z h1 {" o+ F9 V1 ?5 C3 J( B" b# 将爬取到的数据写入Excel表格6 |& C) W3 T1 I1 d( m2 ]! f/ k* U0 [
def write_Excel(video_list):2 |4 h* a# l+ H
print("将b站热门视频信息导入到Excel表格:")2 ]( X. }- r/ e
workbook = xlwt.Workbook() # 定义workbook% Y6 f6 w6 c; D" @8 t
sheet = workbook.add_sheet('b站热门视频') # 添加sheet! [/ m5 U* }' J
xstyle = xlwt.XFStyle() # 实例化表格样式对象4 `2 d- E! O3 ?! \
xstyle.alignment.horz = 0x02 # 字体居中2 F$ K+ [& G6 m+ s+ f
xstyle.alignment.vert = 0x01 # 字体居中
. o3 I* c. M: P* D0 J n head = ['视频名', 'up主','排名', '热度','播放量','评论数'] # 表头' T1 p& v6 n/ \) ~& P+ C0 s& }5 g
for h in range(len(head)): H! ?9 o- V& R& J
sheet.write(0, h, head[h],xstyle) # 把表头写到Excel里面去% h. P% x4 D. G& X
i = 1" X" z2 R# U, z) A9 q+ f5 N9 k9 m
for item in video_list: I) l0 @1 b* P+ Q& g
# 向单元格(视频名)添加(该视频的)超链接; I9 i6 [* `6 N1 O( d
title_data = 'HYPERLINK("'+item["videolink"]+'";"'+item["title"]+'")' # 设置超链接
( C2 b; l. G! ^- A) m) z9 x3 i! Q sheet.col(0).width = int(256 * len(title_data) * 3/5) # 设置列宽$ R8 R3 B# G2 W( f& y3 ]
sheet.write(i, 0, xlwt.Formula(title_data), xstyle)6 A4 `/ F2 x( K
name_data = 'HYPERLINK("' + item["uplink"] + '";"' + item["upname"] + '")' # 设置超链接; X6 M6 ^( F1 p! V4 X; u
sheet.col(1).width = int(256 * len(title_data) * 3 / 10)
' t) f2 p7 q* S1 c2 A3 Z8 X sheet.write(i, 1, xlwt.Formula(name_data), xstyle)6 I w$ k2 N" H# b7 y8 u( G
sheet.write(i, 2, item['rank'], xstyle)
4 [5 J- \- Z6 X0 t% } sheet.write(i, 3, item['hot'], xstyle)
# W: \7 B) E+ E% B0 D. d# O0 { sheet.write(i, 4, item['play'], xstyle). x" b) c" x5 G! M7 f
sheet.write(i, 5, item['comment'], xstyle)
% s7 Y7 C+ w' E/ h i += 1
' L z& [, e8 i# k # 如果文件存在,则将其删除4 X3 l: o* Z' w& `6 e0 C
if os.path.exists('D:/Test/b站热门视频信息.xls'):8 `, s7 m: S' o0 ^
os.remove('D:/Test/b站热门视频信息.xls')1 ~* N. A- h) T( t- [* u1 b
workbook.save('D:/Test/b站热门视频信息.xls')
* L Y) @% f* V9 c, R1 } print('写入excel成功')9 y5 Z! K7 n5 U2 B/ e
print("文件位置:D:/Test/b站热门视频信息.xls")6 n( V* `8 F) h0 _( A! s7 S
% T5 s( o9 o2 W9 m8 p5 c& m; q
# P7 E% Q% ~) @4.在入口main中调用上面两个函数) C' D4 {* b8 v4 L5 N
完整代码如下:
5 K: f& Z' J; q1 nimport requests
- b6 |( k; c- q' r8 p7 l# X" rfrom lxml import html% Y( |& H9 N* K. D1 k7 _5 _: d7 k
import xlwt1 {; f0 v G( Y8 [# y
import os
1 |# i1 Y9 @! X d8 p: H' E* W( c/ T" W' } r; [
# 爬取b站热门视频信息% \' j* c2 h' c+ s
def spider(video_list):. G: M0 W/ K4 B0 m2 j
url = 'https://www.bilibili.com/ranking?spm_id_from=333.851.b_7072696d61727950616765546162.3' S' I4 y% M5 `1 O, i, j2 H0 Y0 q5 ]
html_data = requests.get(url).text
/ y d% u9 U" x% j selector = html.fromstring(html_data)
7 g! @$ t8 c+ l0 d' e3 P7 _ infolist = selector.xpath('//li[@class="rank-item"]')
' H& I6 `' d% S* S) y+ O for item in infolist:
2 L+ W: r/ G3 b( R1 l; c0 a5 k rank = "".join(item.xpath('./div[@class="num"]/text()'))
; E! u& r N4 Q/ A2 d videolink = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/@href'))% `; m) s6 ^$ N* x2 Q. `
title = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/text()'))
I( e* d" t" ~! R playinfo = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/span/text()')).split("万")* q; C: {$ J5 p
play = playinfo[0] + "万"( t& P1 U6 d3 }( q ]
comment = playinfo[1] z# Y6 V) E7 ]% l; @1 Z/ }
if comment.isdigit() == False:3 C) U1 r6 V5 H' _; O& K# F
comment += "万"
; z' _8 m4 j/ ?4 u) P% [ upname = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/span/text()'))
) x( l" [+ H! p uplink = "http:" + "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/@href'))% Z7 Y4 O) c9 D* w* U; Z/ V1 i' b
hot = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="pts"]/div/text()'))6 N4 j7 m) X; H5 a, f- x
video_list.append({: |/ H% {7 N3 t5 L* C
'rank': rank,- e w8 E9 \, F
'videolink': videolink,
. z- M2 ]0 o( q& Z' V/ x 'title': title,
, X& w. H6 C' X; j7 I 'play': play,
. J" h, r- v0 I0 _# L 'comment': comment,
7 E% ^) Q' G( f( f! | 'upname': upname,6 w8 E B7 i' i2 c4 C% O
'uplink': uplink,6 l$ y( T( M3 ^
'hot': hot
. G! q. n! [3 n* A; ^ })& H9 Z0 H8 e* J
return video_list
7 ~+ T8 G4 C+ ^1 Q6 ]8 L6 Q" S! [$ ^+ k
2 h" E5 E3 ], L5 B# 将爬取到的数据写入Excel表格# V* _* r" H0 p
def write_Excel(video_list):. s% i+ F2 ]" U
print("将b站热门视频信息导入到Excel表格:")3 {+ K$ }: B" w0 K0 |5 \
workbook = xlwt.Workbook() # 定义workbook
+ J" [3 q$ U8 C+ | sheet = workbook.add_sheet('b站热门视频') # 添加sheet
# Y5 | U! e3 x7 O/ v. ] xstyle = xlwt.XFStyle() # 实例化表格样式对象
7 Q# w% Z5 k9 t2 Y9 o xstyle.alignment.horz = 0x02 # 字体居中+ t3 l& I$ ^% Y) F
xstyle.alignment.vert = 0x01 # 字体居中2 E. ~0 d1 d3 f+ d6 I9 c
head = ['视频名', 'up主','排名', '热度','播放量','评论数'] # 表头. U% i/ B& @# E
for h in range(len(head)):
) |+ @; Y0 \7 M+ d% F0 b* v5 q' q sheet.write(0, h, head[h],xstyle) # 把表头写到Excel里面去 f5 q% p- X* w* A
i = 17 H6 z4 Z0 A$ C7 a' N
for item in video_list:
% q6 j" ?$ Z# k" n$ n! E! L # 向单元格(视频名)添加(该视频的)超链接
' U2 v0 D" D" }7 v title_data = 'HYPERLINK("'+item["videolink"]+'";"'+item["title"]+'")' # 设置超链接
! l8 c' L7 h4 b/ r e sheet.col(0).width = int(256 * len(title_data) * 3/5) # 设置列宽& ? @7 h0 ?4 n
sheet.write(i, 0, xlwt.Formula(title_data), xstyle)5 X$ S' ?# m9 W, R
name_data = 'HYPERLINK("' + item["uplink"] + '";"' + item["upname"] + '")' # 设置超链接
6 o7 W) O2 o) S; T4 F+ B" p sheet.col(1).width = int(256 * len(title_data) * 3 / 10)& x! Z4 I7 D& `( j7 T" L
sheet.write(i, 1, xlwt.Formula(name_data), xstyle)
r/ ~" w- P0 P sheet.write(i, 2, item['rank'], xstyle)
7 ]; X! z+ {9 ?* _ sheet.write(i, 3, item['hot'], xstyle) Q) f% X. E3 m: {9 V- W
sheet.write(i, 4, item['play'], xstyle)9 F2 F7 Z8 Y! S) V: }# Y0 E
sheet.write(i, 5, item['comment'], xstyle)
2 l7 K; Q+ r6 E) g& ^9 V- x i += 1' P' @5 {/ ]2 y" P# _/ W/ N+ D
# 如果文件存在,则将其删除
6 p% S( q9 Y6 g0 l. h if os.path.exists('D:/Test/b站热门视频信息.xls'):
! ` X8 l+ W% ~# y os.remove('D:/Test/b站热门视频信息.xls')' T# j3 x# C* S% _+ ]
workbook.save('D:/Test/b站热门视频信息.xls')
4 a- c: I! D, Y) u* Y print('写入excel成功')
& S) i0 a( [% }( L) s5 r$ I print("文件位置:D:/Test/b站热门视频信息.xls")
, R' V9 j9 y* ^. R; z% D9 ~6 g$ R7 V& O/ T( V# E
if __name__ == '__main__':
1 G2 `$ \. v+ j video_list = []* m' i# }% ~2 h w3 i/ u" C! q
write_Excel(spider(video_list))! r! d5 ~ \- N& W
: p: Z, E7 j* ]$ O$ q C$ f" w- _" j% [, W* H8 i. L, F* k
" F) n. r" o. q& }# ] {( s9 ?9 ]; ?' R- J- [, ^
: W5 U" Q. J4 T% `" X |
zan
|