- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 81
- 收听数
- 1
- 能力
- 120 分
- 体力
- 540759 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 167606
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5324
- 主题
- 5250
- 精华
- 18
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
Python 爬取b站热门视频信息并导入Excel表格, l) {; I; f U- D
效果图:
4 Y- y% ?/ t1 f9 @ N
2 ]- a% \5 I6 L% b5 B! ?& s2 [
1.工先利其事必先利器,首先我们得下载相应的库:; K% ?' B+ Y5 _" H0 d
pip install requests
1 K& ^. t" a# r9 g* X" ]$ fpip install lxml
( u( K3 R/ E( B6 \$ T, upip install xlwt
( f; o$ v7 {+ q7 S$ n% O9 y
0 `* u: ?+ J$ w9 T1 O
$ H) T2 s) N- Jrequests 向网页发送请求' e# \3 s @/ d: p x Y4 \
lxml 处理xml文件(xpath)9 }7 J/ E; [& c$ m3 u1 h
xlwt 对Excel做写入操作: j2 V/ Q) |6 T1 K8 N. x3 a
2.爬取b站热门视频的信息:5 k# u: O! N) n0 E5 y& U3 B( v
打开b站热门视频页面:8 ~( F9 i7 {6 i
3 |% T; n* `6 N
按f12进入开发者选项,然后点击选中你要获取的页面信息,即可找到该信息在该HTML文件中的什么位置(这对我们用xpath获取元素属性和元素值很重要),例如:
" S2 A% {; p5 g) A. {& E
) G5 [; j& z4 F4 }6 j( i
代码如下:& E( m1 X2 b H/ d
# 爬取b站热门视频信息8 X* U0 |. S1 f. a( c0 p% k
def spider(video_list):
# e( T2 R* k+ Q1 W7 A url = 'https://www.bilibili.com/ranking?spm_id_from=333.851.b_7072696d61727950616765546162.3'
v# _1 C! v- E F7 a1 e9 N html_data = requests.get(url).text
8 h7 B" I( j9 a* J# Q selector = html.fromstring(html_data)9 L$ }2 i- d0 G1 V8 V# C
infolist = selector.xpath('//li[@class="rank-item"]')6 R) H8 u+ W+ }* o4 D
for item in infolist:/ j3 P( K# i0 A! n7 n
rank = "".join(item.xpath('./div[@class="num"]/text()')): k3 B# `) b, O$ H2 g
videolink = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/@href'))& r2 s; ^& z; [) f5 V
title = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/text()'))) U; f6 S- J1 L
playinfo = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/span/text()')).split("万")3 T% l6 N1 x; G2 W% g
play = playinfo[0] + "万"
$ ?# d2 g/ Z/ O( x% ~4 F7 X comment = playinfo[1]
% l0 Y2 R# Z0 F1 b1 c* {, Y if comment.isdigit() == False:
! L4 U P- l* z" `& m comment += "万"4 ~% z; [/ b$ G1 R* ]3 `
upname = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/span/text()'))
5 `9 w' v4 U: y! m uplink = "http:" + "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/@href'))
5 {# j: g/ j$ R; r! f. Z2 z hot = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="pts"]/div/text()'))
2 c2 g8 \' j2 N! ~( | video_list.append({
/ ^) d ?8 a& L% P9 F- {' Q 'rank': rank,
, Z' V" I# n5 R2 _) {" Q, s5 Z4 M: T0 b 'videolink': videolink,& U) f& t. X8 y. z* ^" M$ h& a! H
'title': title, V4 \! h: K3 {3 K0 w( Q
'play': play,
" |/ E) t- r2 k" \; j( a1 Q 'comment': comment,
0 S2 G3 J* \$ R 'upname': upname,' _5 G/ j5 E5 @2 ~
'uplink': uplink,5 f$ w& ?/ D7 a" |4 c2 Z
'hot': hot4 t) t* k) x1 x) X3 H
}): ^. v6 m+ N9 `
return video_list1 E& G- I7 i$ J8 O) s3 J$ }! N
$ u- s# m; }3 q4 ]+ B2 D$ _( n
, ^ @, p9 |' l9 b9 w) x
3.将我们拿到的信息集合(video_list)写入到Excel表格中:
; I- r3 e+ z2 h9 Z0 x xlwt的基本使用方法:
. @1 z- \2 t+ M5 ^4 fimport xlwt" ~( U5 G' Y9 q/ C
# 创建一个workbook (并设置编码)* L# g4 K6 G A; H6 Z
workbook = xlwt.Workbook(encoding = 'utf-8')
: u/ W6 O* q' g( d# 创建一个worksheet
6 p( }1 W; J6 b3 gworksheet = workbook.add_sheet('My Worksheet')
% A4 s' @0 h& ~& |2 s, j5 K1 O+ `
# 写入excel' O m0 q0 o& O- v. d
# 参数对应 行, 列, 值,(格式)
- U' X! f* g9 _4 {2 @ ]worksheet.write(1,0, label = 'this is test')5 h: L8 Q( Q( @5 c2 E
# 保存
9 U6 D: D/ r g+ m#参数为你保存该Excel文件的路径
- G3 ]5 _- x/ K( h5 aworkbook.save('Excel_test.xls')
5 J# s8 A- X: k* Z
8 r: ^6 H% z% A" E
/ `" O9 J" |& T 如果我们想要点击视频名或者up的名字可以跳转,那么我们就要使用Excel表格的HYPERLINK方法:
: }. v$ A& {/ }: VHYPERLINK(“http://www.baidu.com” ; “百度”)
2 `. a7 P" o9 o( r& Z2 M! L2 [百度为显示在单元格的信息,而前面的链接为跳转链接。
" r' R( a3 d5 Z2 x4 {/ Dxlwt.Formula()方法需要传入一个字符串s,s=‘HYPERLINK(“http://www.baidu.com” ; “百度”)’。0 \- p# q$ X$ S8 z
代码如下: j7 }$ H+ Z& A$ T, f' m
# 将爬取到的数据写入Excel表格
. Z. o5 O# X* }! a- @7 p2 I( I$ Z8 [def write_Excel(video_list):
8 z5 _+ `3 H) d: H3 k print("将b站热门视频信息导入到Excel表格:"). a' ]# Y' {8 I% z
workbook = xlwt.Workbook() # 定义workbook
; i- ]( I6 r$ d" o; g. x$ O' ~ sheet = workbook.add_sheet('b站热门视频') # 添加sheet
" E2 V0 S; k6 l* J! v# B8 @; o* V( A xstyle = xlwt.XFStyle() # 实例化表格样式对象
% a1 m7 `6 m+ r xstyle.alignment.horz = 0x02 # 字体居中, P- W3 r) W1 U' z8 }- I$ {# b
xstyle.alignment.vert = 0x01 # 字体居中
7 {3 ]$ W; y+ X: z; n0 k- l head = ['视频名', 'up主','排名', '热度','播放量','评论数'] # 表头5 H- M5 }& L) ?0 T4 k7 Z" y
for h in range(len(head)):
+ f$ e! Q5 E- e+ W, |7 J sheet.write(0, h, head[h],xstyle) # 把表头写到Excel里面去
& ]6 p" S4 Z; e/ u" y i = 1
/ T5 }$ q F$ u- D" C4 F2 k& |- F for item in video_list:
7 s- @+ c+ O4 _7 Q* f # 向单元格(视频名)添加(该视频的)超链接7 B- M+ @! S( L3 G0 d' C( L/ M
title_data = 'HYPERLINK("'+item["videolink"]+'";"'+item["title"]+'")' # 设置超链接
2 m% Y: Y% ~7 D4 S sheet.col(0).width = int(256 * len(title_data) * 3/5) # 设置列宽& ~$ k& [1 {/ O- X0 x$ o
sheet.write(i, 0, xlwt.Formula(title_data), xstyle). s% C8 n$ {4 l( ^
name_data = 'HYPERLINK("' + item["uplink"] + '";"' + item["upname"] + '")' # 设置超链接$ Q, j5 y# f. I( @& ?' B
sheet.col(1).width = int(256 * len(title_data) * 3 / 10); v: v3 W% G8 Y& H' }8 t
sheet.write(i, 1, xlwt.Formula(name_data), xstyle)4 M6 W1 N* y' R/ T
sheet.write(i, 2, item['rank'], xstyle)
; D! k) y1 P; E0 O sheet.write(i, 3, item['hot'], xstyle)
, @* I. i0 K' \+ y4 N. w9 Z sheet.write(i, 4, item['play'], xstyle)
& F V5 W& W ] sheet.write(i, 5, item['comment'], xstyle)
4 D2 g: ]+ Z3 P' r& L( t; s# Q i += 1
( V8 \' D0 y$ J' v# H # 如果文件存在,则将其删除0 g3 f& h N- f) |6 _
if os.path.exists('D:/Test/b站热门视频信息.xls'):
4 ^, H9 {1 d. u9 K: i! \* \ os.remove('D:/Test/b站热门视频信息.xls')
! V" o/ J) X) L, u workbook.save('D:/Test/b站热门视频信息.xls'), V# I, @" G' I, V R& g
print('写入excel成功')$ Q% b. }1 u8 K9 X5 Y
print("文件位置:D:/Test/b站热门视频信息.xls")
' H2 h9 u, C5 H+ i5 r9 q
& b/ p$ ]% y( Z4 N3 M4 u8 e1 H% r8 D& ]. }1 g
4.在入口main中调用上面两个函数
9 B9 X0 J; {) l完整代码如下:7 q5 q. O7 v; \& O( ^
import requests
1 | z5 Y1 z- N( Kfrom lxml import html
9 O3 u C7 t; I8 W2 c- A1 F# vimport xlwt) S o/ p7 Q4 A3 U' t0 H5 D
import os. z. P/ Q& Y `2 M) k& V
9 T q0 C( y5 T# 爬取b站热门视频信息
' P: N0 x8 I6 M( v6 Jdef spider(video_list):0 v0 v, H9 o/ I' l1 H' j3 U
url = 'https://www.bilibili.com/ranking?spm_id_from=333.851.b_7072696d61727950616765546162.3') _% o3 F$ d W0 W
html_data = requests.get(url).text9 {6 g7 v: e% Q- t
selector = html.fromstring(html_data)
$ \, r/ {, q; i" B# X4 F, c% z infolist = selector.xpath('//li[@class="rank-item"]')
, K, o' W4 Q/ M( o for item in infolist:( u* v3 U1 i0 f' Z. Z' M
rank = "".join(item.xpath('./div[@class="num"]/text()'))
) V2 d' y8 U0 ^, \4 [# I2 q! T videolink = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/@href'))
) F, n) M( Y' c; Y+ Q* x title = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/text()'))
% n' ~ t. w' Y @: x9 v playinfo = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/span/text()')).split("万")
- S3 i. g4 \1 e: ?# u! y H9 U' K play = playinfo[0] + "万"
2 z1 Z$ K+ q) k5 g2 d' H comment = playinfo[1]% `+ n( O$ q1 o" n+ `: |* f
if comment.isdigit() == False:
) N6 j' e9 I' E f6 B; u comment += "万". _8 ^$ v, z: I- {9 \. M
upname = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/span/text()')): q b' k, T: s1 m. l! V
uplink = "http:" + "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/@href'))
$ v; I3 e+ n2 P6 M7 y* J hot = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="pts"]/div/text()'))
: k$ B2 c& x) S. H7 A9 ^# K5 f3 ? video_list.append({
* c% Y( f& y9 ~) j# J7 q% F, M 'rank': rank,
/ X9 d5 r7 Q# C, H 'videolink': videolink,, M4 |( D: u2 ~& |. h* m# F
'title': title,. `) I6 C( k% D& a
'play': play,
* l. h. ^4 R! l5 B2 W1 k 'comment': comment,
@8 E. R: u2 v8 q ^# P 'upname': upname,
, Y& R3 H4 w# u0 D. W- j1 K5 o 'uplink': uplink,
" Q, B% n8 f& P# q Q 'hot': hot
: f; \, O- Q. Q3 i5 S })+ I5 E/ N# {7 I0 l
return video_list
5 x; d$ `6 P) M0 p% M$ Y* [1 t7 I* e& f' i' @+ c0 D
# 将爬取到的数据写入Excel表格# s+ `" \4 p% j5 n- \4 }
def write_Excel(video_list):8 ~, N2 Q4 O2 K4 Y5 J
print("将b站热门视频信息导入到Excel表格:")9 k7 |7 V$ l, E+ S r$ ^
workbook = xlwt.Workbook() # 定义workbook6 y- D0 F/ f! e' C8 C' L
sheet = workbook.add_sheet('b站热门视频') # 添加sheet6 G0 [& ~1 e. X9 y; |! L
xstyle = xlwt.XFStyle() # 实例化表格样式对象# t- k0 a9 \3 ?, E4 l5 m4 i4 m, k
xstyle.alignment.horz = 0x02 # 字体居中
2 d/ q9 P2 R4 ?9 A6 N+ ~ xstyle.alignment.vert = 0x01 # 字体居中
- A' u6 n2 F, \% G4 Y% W- v head = ['视频名', 'up主','排名', '热度','播放量','评论数'] # 表头& e* i/ W: S+ e. K' J6 A5 Q
for h in range(len(head)):) A+ }, S6 e3 }3 s( g
sheet.write(0, h, head[h],xstyle) # 把表头写到Excel里面去
- P5 x6 @! b3 {3 B i = 14 ~( N" s* i7 h0 c
for item in video_list:
$ |: f" K6 v( \: y8 W0 u B V7 G # 向单元格(视频名)添加(该视频的)超链接9 S( u. v( N: M5 W' z- c1 s) [
title_data = 'HYPERLINK("'+item["videolink"]+'";"'+item["title"]+'")' # 设置超链接$ A% O4 r5 a8 g$ r1 Z
sheet.col(0).width = int(256 * len(title_data) * 3/5) # 设置列宽3 ?7 E8 _+ g& ?9 F+ [9 o- j
sheet.write(i, 0, xlwt.Formula(title_data), xstyle)
8 K6 X K& c( y* l( ^- B# f name_data = 'HYPERLINK("' + item["uplink"] + '";"' + item["upname"] + '")' # 设置超链接" _7 M: N- x! a% b* C
sheet.col(1).width = int(256 * len(title_data) * 3 / 10)+ J- l# r; q' D1 p" F4 X& D
sheet.write(i, 1, xlwt.Formula(name_data), xstyle)# k+ l. S- Q Z
sheet.write(i, 2, item['rank'], xstyle)
d: ?) D: h9 @& L$ ^* b sheet.write(i, 3, item['hot'], xstyle)
, z- d4 w2 U2 z* k; U7 E sheet.write(i, 4, item['play'], xstyle)3 a4 {! D5 ^4 H
sheet.write(i, 5, item['comment'], xstyle)
/ m" m) u0 C: u4 J i += 12 y! j6 @7 C) |6 o- s" M1 }
# 如果文件存在,则将其删除$ ^) R% z+ w: e1 o& W5 `
if os.path.exists('D:/Test/b站热门视频信息.xls'):
3 }6 f' o4 f0 T; P os.remove('D:/Test/b站热门视频信息.xls') a" ?7 F k8 E3 i. |/ S
workbook.save('D:/Test/b站热门视频信息.xls')
5 J; S- d3 n: Z2 v print('写入excel成功')6 Y% a! r9 g2 k. V$ x
print("文件位置:D:/Test/b站热门视频信息.xls"), U% V. ~& D& k* u% Q
$ Q% C( t, w5 p) j& G' z6 m
if __name__ == '__main__':- @; ?5 }/ R4 ]! t' S) x$ T
video_list = []
% M7 F, `% ^, A; `' t% W write_Excel(spider(video_list))* {4 d7 ?% ~2 e& Z) i( b: Q7 {# J6 e1 y
- w2 X7 H% q5 T% T! h/ J0 v
- y+ P3 b6 \ r
# @' C) Z% A% S
) ?, r; E! f# l: D# L, ^
' {! E$ A& |8 p- r |
zan
|