- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 558646 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 172967
- 相册
- 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表格/ e+ Y" v* {' {0 U2 ?# J6 |
效果图:
2 Q- n% |9 \. ]2 Z- ]8 r
1 a. ]9 V$ X" o& a0 F; _7 i1.工先利其事必先利器,首先我们得下载相应的库:
/ A/ D! e0 Y- U: ~5 spip install requests
$ O8 D( D4 [% u: }- z" ipip install lxml
' k* H, d( z( Jpip install xlwt C5 M0 @7 j+ |3 m% @3 e
( t; R5 G) d2 d9 H. W" b( l' a
' Z8 \9 A' b* r/ ^) nrequests 向网页发送请求
2 S. E$ x& z. ?3 f5 Blxml 处理xml文件(xpath)
; z& g( F* l, }9 m9 U8 W7 I8 Fxlwt 对Excel做写入操作8 U/ s1 X. D0 T ]
2.爬取b站热门视频的信息:0 Y; _) U3 _6 V% S
打开b站热门视频页面:' p. [9 X& Z t2 U! b
" D# z$ J w0 T: K 按f12进入开发者选项,然后点击选中你要获取的页面信息,即可找到该信息在该HTML文件中的什么位置(这对我们用xpath获取元素属性和元素值很重要),例如:
! R- w3 m; {. c/ O$ }
. s6 L' d8 T1 {
代码如下:
" i. a" C' ]* X( F% w# s# 爬取b站热门视频信息
& d" C. U: D, |$ F! c5 o5 J9 Udef spider(video_list):8 a( A2 ~7 Z* x+ V6 A/ {
url = 'https://www.bilibili.com/ranking?spm_id_from=333.851.b_7072696d61727950616765546162.3'; J& A+ o; C0 n9 t+ K3 O
html_data = requests.get(url).text
/ b$ x: q9 L- h5 G selector = html.fromstring(html_data)
% G" k- \+ P: _/ p1 W" Q' o infolist = selector.xpath('//li[@class="rank-item"]')
$ y% {0 S+ e' ]1 w. V0 J" v2 P0 X for item in infolist:( M. l5 H& n1 y% [7 L+ O" S
rank = "".join(item.xpath('./div[@class="num"]/text()'))2 x4 o- T' \0 B) ?
videolink = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/@href')): K! s6 d+ @; Z% P$ ?
title = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/text()'))1 B( ]8 ^- [2 ?1 ~% q1 X
playinfo = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/span/text()')).split("万")$ S( V9 m) k# u; A2 z# B
play = playinfo[0] + "万"
1 p- I+ F# e! a, ?% d Z' D comment = playinfo[1]
& P! g& l# G# G; e$ C3 F, Q if comment.isdigit() == False:
* q5 d* J q3 u comment += "万"" n& m- j: g! g f7 a9 z
upname = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/span/text()'))1 f( p+ S4 I( J
uplink = "http:" + "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/@href'))7 C' o) R2 c6 H7 _6 T0 q/ W# ?
hot = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="pts"]/div/text()'))
! O; o* T B: x% g) @1 H video_list.append({
: Z) L+ L4 X2 J7 x# i! Q% r* r 'rank': rank,
1 r$ r9 p5 n# T j 'videolink': videolink,
8 b/ q) ^, _2 ? N8 p; X 'title': title,
t! {' Z: I% f6 G 'play': play,
% V' [' ^# `( J3 M4 w+ B 'comment': comment,; \( `9 P3 S4 K% a
'upname': upname,: n; h: t! z$ ?; B. z! O; q
'uplink': uplink,
/ A- p* B( k$ r: O 'hot': hot
4 K/ r+ v1 G; ] })5 z) c V- M1 H4 k" W' M
return video_list
+ F, O$ x1 n- P4 T; I4 v' x& O4 |. s0 X4 I/ |& W
- s0 i8 Y5 F4 {) Z& x9 }3.将我们拿到的信息集合(video_list)写入到Excel表格中:
" ]9 g6 B# }! y8 b xlwt的基本使用方法:
# N, r0 d1 _! {2 ]8 y1 u# k% S% zimport xlwt
3 E. }! H R2 o3 J9 G6 o% d# 创建一个workbook (并设置编码)
5 F3 i6 G& x* U6 sworkbook = xlwt.Workbook(encoding = 'utf-8')+ @ C8 d" k+ d% ~
# 创建一个worksheet1 \7 _/ c- `; Q) C& v
worksheet = workbook.add_sheet('My Worksheet')
+ a( |) g5 J' H7 w$ L) T3 u
: k7 R9 M& q1 U9 k, g/ N7 c# 写入excel
@- U6 c) `( M" z1 r$ ~" G7 l8 K5 x# 参数对应 行, 列, 值,(格式)
# W W3 s. R# X" o4 s4 @6 E# V# _" Cworksheet.write(1,0, label = 'this is test')
( F0 r: B/ w+ E' w$ S' X7 h- v8 v# 保存8 p7 ^+ B, @6 X! ^1 v5 O; j! b
#参数为你保存该Excel文件的路径+ u1 G2 x6 G5 v; y3 ]
workbook.save('Excel_test.xls')
- P, J: X* ?- M- W5 n: h# } [- K) }
- ^! i$ G6 J5 ~6 B; a$ T/ s
如果我们想要点击视频名或者up的名字可以跳转,那么我们就要使用Excel表格的HYPERLINK方法:
, T: r3 W, d, K1 F+ U$ A+ t: K) mHYPERLINK(“http://www.baidu.com” ; “百度”)/ I- ~: x8 p- s& B4 {
百度为显示在单元格的信息,而前面的链接为跳转链接。' f5 _ U. ~& I' k2 m
xlwt.Formula()方法需要传入一个字符串s,s=‘HYPERLINK(“http://www.baidu.com” ; “百度”)’。3 G1 ]; F) Q) M' d& `) X) z
代码如下:
) f; V: W7 ]9 A3 A4 ?* G! u# 将爬取到的数据写入Excel表格
- ~. m* g1 p3 r n jdef write_Excel(video_list):
$ z' \# y4 u& |/ k" j: L4 F) u print("将b站热门视频信息导入到Excel表格:")
' W6 `1 |2 f6 n( n+ m) T7 ]/ E workbook = xlwt.Workbook() # 定义workbook( s. @6 ?) ?+ R0 L; r8 Q# b
sheet = workbook.add_sheet('b站热门视频') # 添加sheet
1 z! e: r& X" Z% x7 y2 h2 l2 A. S xstyle = xlwt.XFStyle() # 实例化表格样式对象* m" M2 K B1 O0 g
xstyle.alignment.horz = 0x02 # 字体居中
q! y4 D/ U% O+ F xstyle.alignment.vert = 0x01 # 字体居中6 O D3 D0 z5 w' s6 y
head = ['视频名', 'up主','排名', '热度','播放量','评论数'] # 表头
' r9 P% L; B4 Z for h in range(len(head)):
3 c7 i/ o$ t( v/ Y8 a# r+ P sheet.write(0, h, head[h],xstyle) # 把表头写到Excel里面去
' }/ y' V! S: D4 @% F' I9 G i = 1
7 G1 L4 t9 D& k for item in video_list:1 D. R; r0 Y0 J1 v
# 向单元格(视频名)添加(该视频的)超链接7 u% G) `1 S5 J. z: w
title_data = 'HYPERLINK("'+item["videolink"]+'";"'+item["title"]+'")' # 设置超链接& b5 [: v7 p* P) u, ?
sheet.col(0).width = int(256 * len(title_data) * 3/5) # 设置列宽
/ w7 \5 y+ s$ w+ n sheet.write(i, 0, xlwt.Formula(title_data), xstyle)
* C# H: x* q7 D1 j4 J5 [ name_data = 'HYPERLINK("' + item["uplink"] + '";"' + item["upname"] + '")' # 设置超链接
2 {# |! k, Q, d& z( ^' L& Y sheet.col(1).width = int(256 * len(title_data) * 3 / 10)/ q* [4 p, {* ^2 N/ j" g6 U" U
sheet.write(i, 1, xlwt.Formula(name_data), xstyle)
$ d! \1 z4 i3 m sheet.write(i, 2, item['rank'], xstyle)
" ~: r9 y' r; S, Y& a4 S" F sheet.write(i, 3, item['hot'], xstyle)1 ?3 L8 x) g! h4 `7 t
sheet.write(i, 4, item['play'], xstyle)
/ @$ g8 h: _) d$ S( h2 E sheet.write(i, 5, item['comment'], xstyle)/ ^$ S& l) t% X7 g! _1 h
i += 1& @5 A/ R! S( v* E8 ?4 O
# 如果文件存在,则将其删除. d! g8 D8 h/ |! ?
if os.path.exists('D:/Test/b站热门视频信息.xls'):
g) ?0 |5 @$ A8 { os.remove('D:/Test/b站热门视频信息.xls')
% D5 e# x1 F+ N: a; [9 M workbook.save('D:/Test/b站热门视频信息.xls'). f1 f* U& Z$ m# j& d- }
print('写入excel成功')0 X* b0 K" A# @& b
print("文件位置:D:/Test/b站热门视频信息.xls")- S- P; K( }. q5 \8 `
$ }' c6 t/ ]/ ]/ } e- J! O7 L# a9 t
4.在入口main中调用上面两个函数4 ]: z8 Z. d$ Z; m
完整代码如下:
5 M% a; ^ w: R q( @7 M/ Cimport requests
- [! I) g6 Y& T3 P) i* {2 Xfrom lxml import html1 q5 Y+ \: B$ ?" I
import xlwt
0 I' Q& F" L$ d" U, u! t3 N4 Nimport os# S M1 S$ w$ t% p1 ~
- v& @7 ~+ L8 N% N! k
# 爬取b站热门视频信息# o, A# l5 s$ [1 u. k. Q* n9 Z
def spider(video_list):" E; K" O: K+ u7 i1 L" j
url = 'https://www.bilibili.com/ranking?spm_id_from=333.851.b_7072696d61727950616765546162.3'! X1 K3 @$ A1 i0 `+ j
html_data = requests.get(url).text
6 u7 j2 R* @9 O5 ^ selector = html.fromstring(html_data)
5 Q6 u5 N1 z$ r+ H& c0 M$ U0 H: P infolist = selector.xpath('//li[@class="rank-item"]')
; T5 l7 Q8 l& v% \4 ]# k for item in infolist:6 U- Z2 g6 H( ?. t, Z
rank = "".join(item.xpath('./div[@class="num"]/text()')), C9 _1 P* t/ |# m+ J
videolink = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/@href'))
- |6 S; W5 R- U; b1 t7 i title = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/text()'))9 B8 v. P0 d/ Q( I
playinfo = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/span/text()')).split("万")
# o) y6 G2 _$ b* \8 R2 U; q play = playinfo[0] + "万"1 c: z2 M2 b$ h; C5 g) m) u
comment = playinfo[1]5 m) h8 Y; s6 T2 q
if comment.isdigit() == False:
# Q& }9 A6 e$ j; I* x0 Z comment += "万" h" G$ i/ x8 o3 D+ m
upname = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/span/text()'))3 Q& R3 Q1 a5 u1 z
uplink = "http:" + "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/@href'))
$ T% A ] L Y* K# \, X/ u6 y, j! ]3 g hot = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="pts"]/div/text()'))
( m# {% D+ T, Z# x+ C6 x( \% K video_list.append({
. k |# V0 p' c 'rank': rank,. T' n8 w; M; {! U' I
'videolink': videolink,
4 M- \- c. q. b9 y, y; N* y 'title': title,: G3 h. {7 g4 [/ F( [1 p
'play': play,
/ G# g9 V) r) b" l$ t 'comment': comment,
" a8 ?, B2 [+ c2 f% q# i4 ? 'upname': upname,
/ _8 P0 S# P, U' i* G* R# [ 'uplink': uplink,
* R$ `. }0 ]! M, a s _9 y 'hot': hot
' ~9 \ |4 d2 }6 q- _0 I })
0 M. P" u7 E5 q5 b8 a- v return video_list
6 _$ Z7 L# n; L0 u: r
/ X: t- ^6 E' p d- c# 将爬取到的数据写入Excel表格5 z! ?1 g1 g7 t. C
def write_Excel(video_list):9 |2 g4 L2 E# a: i/ F) P
print("将b站热门视频信息导入到Excel表格:") U# R# S! w5 V
workbook = xlwt.Workbook() # 定义workbook
& y8 D+ n b* X4 {5 z. A% n# P sheet = workbook.add_sheet('b站热门视频') # 添加sheet: v" `; y3 L1 t
xstyle = xlwt.XFStyle() # 实例化表格样式对象* C4 J" f& e4 d( _$ p; @/ @! ~
xstyle.alignment.horz = 0x02 # 字体居中
1 S, Q0 {% i L% ~9 a1 i/ N* h1 V6 C xstyle.alignment.vert = 0x01 # 字体居中
- ^6 k1 l( w5 ?; n5 @& f- d head = ['视频名', 'up主','排名', '热度','播放量','评论数'] # 表头
4 a# X7 E( M$ c Y for h in range(len(head)):& f$ t: u5 f. h' b& L/ @ _
sheet.write(0, h, head[h],xstyle) # 把表头写到Excel里面去
0 b, z/ K. R0 D0 K i = 1
3 Y0 u& X8 M8 k' K; Q: w2 S for item in video_list:; X+ A0 _0 b( G& Z" M% F. b
# 向单元格(视频名)添加(该视频的)超链接8 m; [' G- H9 D [1 |; k, O+ n* d
title_data = 'HYPERLINK("'+item["videolink"]+'";"'+item["title"]+'")' # 设置超链接* f* P( v" z8 O. b# F `
sheet.col(0).width = int(256 * len(title_data) * 3/5) # 设置列宽" L+ D9 x7 A, `2 [# Z" M
sheet.write(i, 0, xlwt.Formula(title_data), xstyle)7 s; u ~, I1 h. f, W
name_data = 'HYPERLINK("' + item["uplink"] + '";"' + item["upname"] + '")' # 设置超链接
% |- r) m, g- V, X* ~. G4 b sheet.col(1).width = int(256 * len(title_data) * 3 / 10)
& R% N7 l P6 A. E1 ~: ] sheet.write(i, 1, xlwt.Formula(name_data), xstyle)
. |8 \8 o7 b+ D sheet.write(i, 2, item['rank'], xstyle)( E+ S! R. y4 j
sheet.write(i, 3, item['hot'], xstyle)
+ m0 L- b: | B5 |, q L sheet.write(i, 4, item['play'], xstyle)
' @ l/ I/ u. N% k sheet.write(i, 5, item['comment'], xstyle)# ^ G. _' e/ m8 G5 e5 |
i += 1/ [- `. h0 J' |/ d( `
# 如果文件存在,则将其删除$ _% A! q' o. n; G" w, [
if os.path.exists('D:/Test/b站热门视频信息.xls'):+ l8 O2 [/ o2 t
os.remove('D:/Test/b站热门视频信息.xls')* t! v4 L' b% W
workbook.save('D:/Test/b站热门视频信息.xls')
/ J* n' A% M8 K& T9 G print('写入excel成功')
% {1 P6 B% ]0 Z N& l& R% Y print("文件位置:D:/Test/b站热门视频信息.xls")1 K M) r/ I6 D! [* E, ^& q
# k/ X9 y- N* l. C4 o# W- Y
if __name__ == '__main__':5 f' [! V" q8 I! R* W: T
video_list = []
0 R7 n S& b( Y0 T write_Excel(spider(video_list))
2 o& M& E; R2 F* D
# a, j1 E) j0 M- t+ j& M: f V) D* X
. y' C& J% U' ~% R3 w0 B% M! F" r5 O3 g
; G$ d7 P2 _0 ]% c8 f# F) ]
: z1 j" ^- o3 f2 f8 P9 W |
zan
|