- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 564563 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 174592
- 相册
- 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表格( F6 B/ `5 v; M8 q+ t
效果图:1 V& ^8 @( {9 B2 t5 `3 ~
7 Z4 |0 s0 ~: z3 I+ a& Y& `. R' P$ w
1.工先利其事必先利器,首先我们得下载相应的库:
$ | b! F& `! W6 b5 upip install requests6 b+ a1 p% G: M, s; \0 ?) @
pip install lxml; H9 A; @; J P( O
pip install xlwt u) Y) {: d! C9 Y. c
8 O8 x, X: ^7 { U$ F0 O1 Y( d/ ~1 V3 M9 C) y+ a
requests 向网页发送请求
! @2 b7 u5 y9 e8 X Blxml 处理xml文件(xpath)( T6 }$ u* v' _* N- W
xlwt 对Excel做写入操作
7 T5 V* R# D j, J9 M. @! |% _: @2.爬取b站热门视频的信息:
8 ^$ D; J6 R: E4 |& ]) X 打开b站热门视频页面:; H2 `2 X3 A+ v+ F
! v: d( C: }" R6 E4 g 按f12进入开发者选项,然后点击选中你要获取的页面信息,即可找到该信息在该HTML文件中的什么位置(这对我们用xpath获取元素属性和元素值很重要),例如:
- w( q2 t- h" U4 w% i' L
: z! |6 R* T+ l! b3 O- [) }$ G: l. t代码如下:
! Z6 \; i$ h/ n) Q1 H3 C# 爬取b站热门视频信息
% i2 F0 f& Q5 e" Ldef spider(video_list):
7 J; _( ^ u# E# p$ ~; W5 @! O: i# { L url = 'https://www.bilibili.com/ranking?spm_id_from=333.851.b_7072696d61727950616765546162.3'# V' c$ f$ J- V7 L! p5 ?5 e
html_data = requests.get(url).text0 q3 b1 ~, E, ^6 X2 t7 }
selector = html.fromstring(html_data)8 f/ e; J9 H5 U H/ x
infolist = selector.xpath('//li[@class="rank-item"]')
5 L8 P6 B0 j J" T, ` for item in infolist:
& ]3 f$ k# G- g) W& z- I( R7 Y, E' [- b" D rank = "".join(item.xpath('./div[@class="num"]/text()'))4 v- ]( l* k/ S, C$ h& r. W
videolink = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/@href'))
( J7 I- s' E$ o \" r5 [7 M. a title = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/text()'))
; l2 M. s2 g5 u. k2 `. I playinfo = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/span/text()')).split("万")$ V# V8 y! f& t! D
play = playinfo[0] + "万"
4 s S8 ]/ t! h& G comment = playinfo[1]
: A$ @1 v9 i+ C1 v if comment.isdigit() == False:# \9 P+ A2 E7 O' ~- {% [; u
comment += "万"8 N. f4 B& i# n% @+ M
upname = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/span/text()'))8 F( O* m- m' d5 e3 j; G$ n
uplink = "http:" + "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/@href'))
9 t( M" g/ [! P9 F hot = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="pts"]/div/text()'))
3 s; y" M* K( _$ a/ S; F0 k$ P video_list.append({. [6 X% L+ R5 m, H
'rank': rank,$ R" F4 ?- q( i+ h
'videolink': videolink,
. }$ c* j: R5 p/ Y- s a* A7 M 'title': title,
, A6 B8 w" p+ @: X, B, h8 _) t 'play': play,$ o% h, w8 l3 L, x6 l
'comment': comment,$ ~+ N+ a4 \- y, D
'upname': upname,
5 Z% [, { k- S# M6 _" t 'uplink': uplink,* ]. R# p: L2 X0 w( s
'hot': hot$ [0 i0 @$ z8 R6 ]: ^3 G# _1 O
}) f# H) u. u% {1 R; K
return video_list
: Q/ g1 y1 j5 m, \' Q- H2 _0 h: a% _
7 E. D0 a4 x1 y" u3 z
3.将我们拿到的信息集合(video_list)写入到Excel表格中:5 @3 J" Z5 G2 o" S/ m) P! t! F
xlwt的基本使用方法:* a% r0 U/ W& ~' [
import xlwt
: |) ~* |. ^% R ?$ I# 创建一个workbook (并设置编码)% l7 f5 v) g" K/ J& E- ~0 H
workbook = xlwt.Workbook(encoding = 'utf-8')
* l' j# ?2 T) k& e7 x3 q# 创建一个worksheet
2 u7 w" Q2 e3 hworksheet = workbook.add_sheet('My Worksheet')
- I! q0 E( K8 H9 B8 M$ n* O9 G- l( ]
# 写入excel' g% B o/ _% J0 u; P
# 参数对应 行, 列, 值,(格式)7 }* {0 w9 Z/ j. w7 l) A1 z
worksheet.write(1,0, label = 'this is test')' }/ ^& X: L0 T; ^' @( ?% ~% d, H
# 保存6 G" c+ M! M" U& R$ B
#参数为你保存该Excel文件的路径
3 T9 v! z1 n& [ |: D1 \9 i# V1 vworkbook.save('Excel_test.xls')- g2 L- z; G6 Q2 c
3 e. @0 X+ L1 ?( W+ q6 W; G) f' v; c( m$ N( {( G1 [
如果我们想要点击视频名或者up的名字可以跳转,那么我们就要使用Excel表格的HYPERLINK方法:
3 P! w5 A" P) E" Y5 zHYPERLINK(“http://www.baidu.com” ; “百度”)
# X+ [" ?. B) y, \' I百度为显示在单元格的信息,而前面的链接为跳转链接。
' c; A) ]6 r6 A5 nxlwt.Formula()方法需要传入一个字符串s,s=‘HYPERLINK(“http://www.baidu.com” ; “百度”)’。
: W4 H' z% x8 o* {9 I3 n代码如下:
6 m0 W' b) Q- X# 将爬取到的数据写入Excel表格
G! X) j9 v% F" o, ^2 }3 D* Zdef write_Excel(video_list):/ `: B" W$ |. t( u% l; @( j/ X
print("将b站热门视频信息导入到Excel表格:")5 N! M* w4 O0 K( k
workbook = xlwt.Workbook() # 定义workbook& w; @# |4 {, R% h$ L2 V5 w
sheet = workbook.add_sheet('b站热门视频') # 添加sheet4 s; f1 H2 W' Z! P
xstyle = xlwt.XFStyle() # 实例化表格样式对象
/ T: q3 [3 {1 g9 A xstyle.alignment.horz = 0x02 # 字体居中
( `7 x" Q3 n9 i1 x) {+ a xstyle.alignment.vert = 0x01 # 字体居中) g$ u8 u2 h, s# _
head = ['视频名', 'up主','排名', '热度','播放量','评论数'] # 表头
1 _7 R. d+ f0 I! y, L for h in range(len(head)):
9 E9 ?" i2 X' Q& X/ e4 [$ B sheet.write(0, h, head[h],xstyle) # 把表头写到Excel里面去0 ~2 F5 n, P/ _3 G2 ?& g! o' c( g
i = 1- ~6 s0 f; v# n8 Q4 ?% |' q
for item in video_list:
) u; r3 c. I1 x; { # 向单元格(视频名)添加(该视频的)超链接
" }. E( h( E; W- h title_data = 'HYPERLINK("'+item["videolink"]+'";"'+item["title"]+'")' # 设置超链接
' u/ Z5 f: Z" \4 m, n sheet.col(0).width = int(256 * len(title_data) * 3/5) # 设置列宽6 B2 s8 V- {2 ]
sheet.write(i, 0, xlwt.Formula(title_data), xstyle)$ _+ I- j' `: ]
name_data = 'HYPERLINK("' + item["uplink"] + '";"' + item["upname"] + '")' # 设置超链接
8 y+ U! k" q/ G$ O# Z6 t, Q8 O sheet.col(1).width = int(256 * len(title_data) * 3 / 10)) T, x/ `$ q% Z0 \( A# E6 a: d C
sheet.write(i, 1, xlwt.Formula(name_data), xstyle)
0 C! H: ]7 {# M4 M* F0 D3 p sheet.write(i, 2, item['rank'], xstyle)1 z; q: I" t! l0 l+ _6 U
sheet.write(i, 3, item['hot'], xstyle)
, T- G2 y) D; z7 F sheet.write(i, 4, item['play'], xstyle)% ^) [( H0 ^0 J# Y, ?1 b$ H
sheet.write(i, 5, item['comment'], xstyle)
3 M/ [% ~/ a; F3 }* h i += 1+ e5 T2 P3 W6 a" E- i
# 如果文件存在,则将其删除
3 F9 z o5 i" D" L if os.path.exists('D:/Test/b站热门视频信息.xls'): M0 G0 d/ `+ w: c: g! h* d4 L
os.remove('D:/Test/b站热门视频信息.xls')
# Y' J2 f/ x6 t+ V9 n2 V- u workbook.save('D:/Test/b站热门视频信息.xls')
) J5 Y% g0 M/ p2 B print('写入excel成功')
; w# Y! z/ V/ z3 J' v5 W( _ print("文件位置:D:/Test/b站热门视频信息.xls")2 R2 X8 D3 v* z, P- i0 R
+ R" Q# U+ h5 T9 ]3 x
* j% @0 H( x+ L3 H# C1 G
4.在入口main中调用上面两个函数; z! X+ H$ \! X* n b& L
完整代码如下:+ }7 \2 [. S5 J
import requests3 ]6 R% x( }9 H) J( w9 u0 M; k2 c
from lxml import html
1 t6 F- b9 z4 i6 t, rimport xlwt. Z: F* f8 ]' U. }5 B, S( t1 v2 T
import os6 ]+ a/ K7 o/ E, A
! q* n3 D: }. W9 z( B# \' o- ^& n
# 爬取b站热门视频信息; h# ?. _% v: G3 D8 ^- B! h
def spider(video_list):- O, X! v& A& j- _- i* T6 ^4 i
url = 'https://www.bilibili.com/ranking?spm_id_from=333.851.b_7072696d61727950616765546162.3'# C" }3 R- a( k! l% j! J
html_data = requests.get(url).text) ?* h" z: ]0 }7 U1 I9 T' T% [ r
selector = html.fromstring(html_data)& G) F. l3 w; C7 H
infolist = selector.xpath('//li[@class="rank-item"]')
2 g% v8 x$ S. _. b3 j7 _ for item in infolist:5 w& ]" u* t R2 Z% D8 k) y
rank = "".join(item.xpath('./div[@class="num"]/text()'))0 {9 B" |! k1 V# }0 U6 C
videolink = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/@href')). e8 o# [8 k# M9 ?1 _/ Q
title = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/text()'))1 }+ y. _1 o; C2 t
playinfo = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/span/text()')).split("万")7 [( L* k6 \. x! _6 U c- Q$ m0 F
play = playinfo[0] + "万"
! e; j- I5 l6 J A4 h comment = playinfo[1]
' @" w! j) H, d9 L" y! z if comment.isdigit() == False:1 g9 D- e9 c; ? n# f! ^" g
comment += "万"
8 d: e7 u) r9 u* P/ F1 F* U0 N upname = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/span/text()')). u/ ?, Z( H2 k) G" S7 w
uplink = "http:" + "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/@href'))+ l* j0 b* ^ C5 [' G% q& P' k
hot = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="pts"]/div/text()'))! j7 @1 X: u. v$ [5 i3 B3 g
video_list.append({
, {1 D4 Z1 k' b; |: L 'rank': rank,9 }2 B: @# x: D+ F
'videolink': videolink,# g H8 o- }* _! R9 s( n' }
'title': title,
) m. G9 T, M1 S8 q 'play': play,
' r% D7 Q3 l3 T9 ]6 G0 a; \9 P 'comment': comment,
* u; g# g( y% a1 } 'upname': upname,/ p+ \+ Y4 Z- y. s# X
'uplink': uplink,9 S, k4 f% U- D' [2 X/ S
'hot': hot) a& [( K( F& I
})' Q) U! d9 q) R
return video_list" X& U8 m" j, B! `: j
( a! d. Q3 h& k0 |5 j
# 将爬取到的数据写入Excel表格
, I: ^* O. ]# O$ l/ q( gdef write_Excel(video_list):
4 F4 a" Q, H, C+ A: D print("将b站热门视频信息导入到Excel表格:")/ v( M, [2 ?2 @5 h
workbook = xlwt.Workbook() # 定义workbook, q0 [$ c9 r/ A3 X! _# \
sheet = workbook.add_sheet('b站热门视频') # 添加sheet
, ]. a c& T5 o# e! r xstyle = xlwt.XFStyle() # 实例化表格样式对象
! ~, g0 ~$ }: n* I6 g xstyle.alignment.horz = 0x02 # 字体居中
: j( d2 K0 d! s7 b+ O xstyle.alignment.vert = 0x01 # 字体居中- K" l% P- \- h- _/ x
head = ['视频名', 'up主','排名', '热度','播放量','评论数'] # 表头9 x. P6 M! \0 q3 W4 G+ q" o8 ^" J
for h in range(len(head)): }7 z. W% I5 M2 v2 Q* U% h) B
sheet.write(0, h, head[h],xstyle) # 把表头写到Excel里面去
- r$ y+ [$ |& T; Z) |( [* A i = 1: o. u% H4 M: ~ N5 M- `- x
for item in video_list:
& {, H; V! U! Q& r7 ~ # 向单元格(视频名)添加(该视频的)超链接3 |2 k4 N- ~; A+ d6 Y' Q
title_data = 'HYPERLINK("'+item["videolink"]+'";"'+item["title"]+'")' # 设置超链接; f5 i2 v- W2 c! f8 ~ D
sheet.col(0).width = int(256 * len(title_data) * 3/5) # 设置列宽
. ~1 S8 e9 O8 r9 ^6 ^5 r5 R sheet.write(i, 0, xlwt.Formula(title_data), xstyle)
" g5 W; D: W+ k# F7 f name_data = 'HYPERLINK("' + item["uplink"] + '";"' + item["upname"] + '")' # 设置超链接
/ \" a* T5 i% C7 ^1 G' H" I sheet.col(1).width = int(256 * len(title_data) * 3 / 10)8 }+ l A; V+ @6 a; @; r
sheet.write(i, 1, xlwt.Formula(name_data), xstyle)
! e, _ y4 z* h! Q* b8 M v& b% @, i sheet.write(i, 2, item['rank'], xstyle)) F6 j; F- `6 U' z
sheet.write(i, 3, item['hot'], xstyle)9 a4 r" V& `( {" o" `
sheet.write(i, 4, item['play'], xstyle)/ M7 ?: {# M4 \& ^# B m$ ]
sheet.write(i, 5, item['comment'], xstyle)$ G' b( Y( a- a8 m" K
i += 1
+ L% `! d3 i# x% z7 L # 如果文件存在,则将其删除
1 T- S8 v' ^% B& J( e7 I if os.path.exists('D:/Test/b站热门视频信息.xls'):8 t- Q/ h4 Z* q G+ v& S4 a
os.remove('D:/Test/b站热门视频信息.xls')
3 M) e+ {* F$ k5 ? workbook.save('D:/Test/b站热门视频信息.xls')
1 y' }4 B- h7 H) d9 ^ print('写入excel成功')
: u/ W/ s5 U$ q! w print("文件位置:D:/Test/b站热门视频信息.xls")! d, {3 h$ o: r0 k9 R
: S n/ r! z5 g# _: x
if __name__ == '__main__':
2 E. p2 F% `" H. Z5 M# c video_list = []$ d; l( A& ]( }/ M# R+ o0 L
write_Excel(spider(video_list))
- d* S; l1 @: d) }0 Q9 t
" K- w8 q! C+ j5 O
& G; r: T8 g' ]; {1 S2 i+ u- r0 h# S7 l8 U; E9 j. P f, b
5 h9 n$ k+ Q$ u! h
/ G: e; A4 f0 B1 v) `/ V
|
zan
|