- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 566435 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 175153
- 相册
- 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表格
4 I1 P5 Z9 N+ F! r效果图:2 c$ C' D4 [: J5 h
) `% ~& P; O: ~( k+ I8 z1.工先利其事必先利器,首先我们得下载相应的库:
: d( X' r# e) b3 ~" ]2 T% Jpip install requests, z w9 A7 c# [+ R2 [ H1 ?" s
pip install lxml
0 o# e ?) O2 ?- }pip install xlwt$ R; }3 N4 e- J5 I% v- `8 `
4 S! \3 B6 F0 ^6 {0 ~% W5 ]4 A) B
requests 向网页发送请求
* B: m, P7 G6 g0 r9 y, Llxml 处理xml文件(xpath)
3 J4 u# {: O! ]+ r. ]( txlwt 对Excel做写入操作
: O+ q3 h1 w8 T9 H$ i2.爬取b站热门视频的信息:6 p; V3 W1 k" _/ O' G
打开b站热门视频页面:
6 n; w% @1 p, R8 C9 t" @. b$ ]
6 q. |5 W! L& _8 Z8 B
按f12进入开发者选项,然后点击选中你要获取的页面信息,即可找到该信息在该HTML文件中的什么位置(这对我们用xpath获取元素属性和元素值很重要),例如:9 y# H o6 L/ ^5 s
7 X- M# k# v5 c3 |7 K) X代码如下:* W! E. {; s. i. v2 _
# 爬取b站热门视频信息( @) z T7 H5 \3 s
def spider(video_list):/ |+ {2 A+ b. ^5 J! J4 b" G
url = 'https://www.bilibili.com/ranking?spm_id_from=333.851.b_7072696d61727950616765546162.3'
; X* D) N \/ Z html_data = requests.get(url).text) d7 ?7 I8 y1 w0 ^/ H0 r
selector = html.fromstring(html_data)# s* ?& \4 r$ e7 U
infolist = selector.xpath('//li[@class="rank-item"]')3 U" W/ z% F+ X
for item in infolist:2 Z% I( |1 K% X2 S
rank = "".join(item.xpath('./div[@class="num"]/text()'))/ J# U( Q& X/ l
videolink = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/@href')): T1 j( m" \0 L: m9 J2 |3 _1 u
title = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/text()'))
3 T% c6 ?3 ]3 {2 `4 \" h+ F playinfo = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/span/text()')).split("万")
& a% m" {( H+ N! v7 u8 E5 w/ j5 F play = playinfo[0] + "万". |8 Z0 y& x$ C/ E! j
comment = playinfo[1]" e" q1 K/ c4 u7 O2 o
if comment.isdigit() == False:7 a" O" u! |8 c. f
comment += "万"! x1 G2 k: {& t6 Y
upname = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/span/text()'))
7 a' v! `2 ^) Y5 i: f$ W; m7 R uplink = "http:" + "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/@href'))
8 J$ Z4 }; m5 b6 J4 P hot = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="pts"]/div/text()'))
+ y& r& c3 P( b6 _4 P5 h* W video_list.append({
' ^. q- P2 d/ E! k7 ?% y& q 'rank': rank,
/ {0 e% s* H0 n0 u3 A 'videolink': videolink,
* b+ b5 b" s# Q: L7 h2 q 'title': title,
6 ^- f f; ^" S! G 'play': play,8 I& T$ H" ~1 O, Q$ B7 \+ l* `
'comment': comment,
- T/ r+ B! _: B7 n/ U 'upname': upname,
/ Q( D" l [- ]7 e0 H/ ~ 'uplink': uplink,
2 D' G& O- }1 h- S/ g4 z 'hot': hot/ N6 C+ C6 ]/ `+ w! Y) ?2 f% M
})
+ f8 F5 z. ]% }5 t6 ^, Z return video_list# l% K; y6 ?. z
7 _/ p. P: \1 Z/ a
# @: ~+ [* M S. M6 z3.将我们拿到的信息集合(video_list)写入到Excel表格中:8 r2 C% Z5 {( D1 [' C3 K
xlwt的基本使用方法:
6 G/ r( T V& x3 \+ A( [import xlwt. f5 ]6 P% Q r; V
# 创建一个workbook (并设置编码)
, J: n+ k) r8 E, S `) Oworkbook = xlwt.Workbook(encoding = 'utf-8')
3 T6 E% a" V; K+ t4 ^& {/ R# 创建一个worksheet
9 j( o, u% Q! ?" tworksheet = workbook.add_sheet('My Worksheet')( U7 n: `; ~( F# @( `: W6 g4 K
- M( h! p0 e$ L9 F6 ~& J
# 写入excel
/ a3 f! R3 l( Q5 H# 参数对应 行, 列, 值,(格式)
; u/ N8 m" s5 o0 f8 N! Z" iworksheet.write(1,0, label = 'this is test')
4 Q. w, u* P5 m7 k8 ?# 保存* t. E9 S7 z3 d
#参数为你保存该Excel文件的路径% x4 M. @: [- L* _# C) H0 H
workbook.save('Excel_test.xls')
- [( C5 P* ~( Z8 J2 L
9 d4 B& ^1 v+ }7 i
; B4 |8 ?8 ^. ?% H: [& l: _3 r 如果我们想要点击视频名或者up的名字可以跳转,那么我们就要使用Excel表格的HYPERLINK方法:$ z9 D, m: m4 h+ s! T* M9 c% Q
HYPERLINK(“http://www.baidu.com” ; “百度”)$ I, q5 Q9 j2 w' E0 Q5 G
百度为显示在单元格的信息,而前面的链接为跳转链接。# I0 T8 J* _% Q
xlwt.Formula()方法需要传入一个字符串s,s=‘HYPERLINK(“http://www.baidu.com” ; “百度”)’。
% F s" g, W) w代码如下:
6 c; s# _! ^0 u# 将爬取到的数据写入Excel表格
; S6 R0 `3 B9 Adef write_Excel(video_list):
8 x) V" U" o" U$ W7 {/ T3 i print("将b站热门视频信息导入到Excel表格:")
: _7 m* `- N4 d) w7 |& J workbook = xlwt.Workbook() # 定义workbook
, i: t5 E' m" K k, i sheet = workbook.add_sheet('b站热门视频') # 添加sheet
- t1 t5 G9 ]9 l xstyle = xlwt.XFStyle() # 实例化表格样式对象
" L; y& h/ Y. v; i xstyle.alignment.horz = 0x02 # 字体居中% k8 p& e# j/ ?; |2 k5 {: @
xstyle.alignment.vert = 0x01 # 字体居中1 {! r& C/ }3 S* Q% d/ q4 w
head = ['视频名', 'up主','排名', '热度','播放量','评论数'] # 表头
8 Y( i9 F' \$ a for h in range(len(head)):
% U- @. e! W; A3 c% v- U sheet.write(0, h, head[h],xstyle) # 把表头写到Excel里面去4 X6 I' B3 O2 d7 v
i = 1
% e8 a1 Z. ^1 ? for item in video_list:9 G( ~- D L5 Z" J9 e1 c- E
# 向单元格(视频名)添加(该视频的)超链接
# n+ l: Z% G. T title_data = 'HYPERLINK("'+item["videolink"]+'";"'+item["title"]+'")' # 设置超链接8 o2 l1 U3 }' r6 f2 G+ D! W
sheet.col(0).width = int(256 * len(title_data) * 3/5) # 设置列宽
3 K+ | x; x! o' L! |8 ~9 J) h sheet.write(i, 0, xlwt.Formula(title_data), xstyle)
# `+ `, z: `* ]' J1 ~ name_data = 'HYPERLINK("' + item["uplink"] + '";"' + item["upname"] + '")' # 设置超链接/ U" G# \9 v) ~1 }4 X9 H
sheet.col(1).width = int(256 * len(title_data) * 3 / 10)8 b* l( c" @% H# N& J) | i
sheet.write(i, 1, xlwt.Formula(name_data), xstyle): X W6 R/ n( q% x. [' K" |- e
sheet.write(i, 2, item['rank'], xstyle)* `1 B4 R) |, e; D; \3 ]- s( p
sheet.write(i, 3, item['hot'], xstyle)
; o8 J# @. k- z* z; |) Q. H2 t4 D sheet.write(i, 4, item['play'], xstyle)
( m/ ` Y& j* }- ^5 ] } sheet.write(i, 5, item['comment'], xstyle)
% E, S# ^/ V1 I i += 1) _4 E2 D$ P' J
# 如果文件存在,则将其删除
' B" n5 n6 Q2 }" D if os.path.exists('D:/Test/b站热门视频信息.xls'):
& f- \" v. V/ T. q( H' P os.remove('D:/Test/b站热门视频信息.xls')1 r1 n* X4 Q5 j% n" z( m
workbook.save('D:/Test/b站热门视频信息.xls')
$ |9 [# R; ?! C# h# I& q$ b print('写入excel成功')
. y; e6 m/ [% `) a- Y print("文件位置:D:/Test/b站热门视频信息.xls")
% Q- t& u t7 d8 V
! | ]0 c" V7 I/ f' t6 {& |& w: b! `* ?$ V s% G
4.在入口main中调用上面两个函数
: M" e% w2 ^$ }3 ^" Z6 h6 @完整代码如下:6 \$ r# C4 e& ]1 O
import requests
, A7 C, J# ^8 [/ y0 L2 afrom lxml import html1 _9 L% ]7 J2 o, B4 a
import xlwt& c; d% q# J" a. f) `( }
import os* A6 Y! g, l/ z) l; h& e5 H
8 u/ `- g) w2 h0 V
# 爬取b站热门视频信息
# Q9 L7 C& M. S+ ]' g1 K/ a6 W& xdef spider(video_list):$ P s8 ?1 [2 F6 _/ g0 x6 c
url = 'https://www.bilibili.com/ranking?spm_id_from=333.851.b_7072696d61727950616765546162.3'
+ W' n: m1 O- ^% L' x( g html_data = requests.get(url).text
: R9 t: t: N& M1 W2 I2 v selector = html.fromstring(html_data)2 `+ Z3 D' F1 q* d- B6 e
infolist = selector.xpath('//li[@class="rank-item"]')3 Q2 A! [- ^) F% K8 d0 X" {- d& }; r
for item in infolist:% Z1 x9 J3 G" E4 l) c) I6 r, x& M
rank = "".join(item.xpath('./div[@class="num"]/text()'))0 m% m& R- G0 ?
videolink = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/@href'))3 u. ?3 D8 I0 c( R
title = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/text()'))
* G$ r% Y6 L* |9 E# f, O$ H playinfo = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/span/text()')).split("万")
$ v5 b2 b) v8 c f) ] play = playinfo[0] + "万"
! F3 |9 r0 q1 \7 D. k! o# V3 r e0 _ comment = playinfo[1]0 H7 h6 x5 o" g( ~5 H3 N
if comment.isdigit() == False:
5 A, E6 K6 V8 N comment += "万". j3 ^, A; J \6 ?5 v
upname = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/span/text()'))% t; e0 G: w7 n' K# N( `
uplink = "http:" + "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/@href'))7 ^# j8 D( w" ^
hot = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="pts"]/div/text()'))
2 e% b& y' y6 l0 O, j- J8 o video_list.append({
1 I- N1 O& @& q. p# J 'rank': rank,& a( n2 ~* k; p: {( a' e
'videolink': videolink,+ S. G! P6 r8 |2 j) s
'title': title,
Q8 y0 J# P- A0 i( c 'play': play,2 a) F6 z: ]" W3 x
'comment': comment,
" R$ l# \3 t% t9 S( L/ H! W' @ 'upname': upname,
* U a$ r0 b5 m 'uplink': uplink,
5 V2 |3 T7 g7 e) k 'hot': hot
- P: x+ J2 d) ~2 c1 V })
% L( [" T( \4 l' v+ I L/ h3 s- P return video_list
2 m5 K2 N; E; W% e
7 l4 B; t" F$ m+ ^* \# 将爬取到的数据写入Excel表格
' o. c$ I9 S& vdef write_Excel(video_list):
$ X- ]8 o) J$ S X, X0 T5 Y$ L print("将b站热门视频信息导入到Excel表格:")
# I- r/ i9 e: c4 s workbook = xlwt.Workbook() # 定义workbook
) S! m0 R. a% y. ? sheet = workbook.add_sheet('b站热门视频') # 添加sheet' ~& g' p9 A- k' W! W4 H/ O" U) Q5 n
xstyle = xlwt.XFStyle() # 实例化表格样式对象
, l; j3 E3 f5 t' Y xstyle.alignment.horz = 0x02 # 字体居中
, \' Z1 Q/ s: ^+ u; e. k xstyle.alignment.vert = 0x01 # 字体居中# F" E8 ?& _# K. Y+ V% R2 w. E
head = ['视频名', 'up主','排名', '热度','播放量','评论数'] # 表头
/ [- q Z& g l+ O# g7 G for h in range(len(head)):
, ^! |0 B/ N- ?/ G" X sheet.write(0, h, head[h],xstyle) # 把表头写到Excel里面去' ^1 U F1 @% T' P6 f/ v: j
i = 1& F2 x& w* X9 ?7 L
for item in video_list:+ `9 }5 i R+ D# W) o1 X/ U
# 向单元格(视频名)添加(该视频的)超链接3 L) P* I" G( T3 e3 n2 S
title_data = 'HYPERLINK("'+item["videolink"]+'";"'+item["title"]+'")' # 设置超链接
- L) z& D+ o- T; N* ?( s- A( ^ sheet.col(0).width = int(256 * len(title_data) * 3/5) # 设置列宽
L& W; ~& @( z3 X sheet.write(i, 0, xlwt.Formula(title_data), xstyle)' Q' W7 N N2 p% [0 E
name_data = 'HYPERLINK("' + item["uplink"] + '";"' + item["upname"] + '")' # 设置超链接
3 i: x7 h! O9 t9 b# x* I% ] sheet.col(1).width = int(256 * len(title_data) * 3 / 10)
/ i5 p) L( O* m0 l4 g5 ?4 O sheet.write(i, 1, xlwt.Formula(name_data), xstyle), M9 I8 |; r( O" v. V
sheet.write(i, 2, item['rank'], xstyle)
: O: c Z4 w% u sheet.write(i, 3, item['hot'], xstyle)
. x+ }8 {) Y( }# P- o! Q sheet.write(i, 4, item['play'], xstyle)
% g h2 i/ C: E( a& N: z- g3 p sheet.write(i, 5, item['comment'], xstyle)/ e0 Y, V$ {8 u( I! ?3 C, c5 \" ?7 u
i += 1/ Y# v) T. g9 z0 m( f! z/ ?
# 如果文件存在,则将其删除
$ m+ u' y* ~8 |" j2 X* R9 x if os.path.exists('D:/Test/b站热门视频信息.xls'):
6 t6 u$ R, {" V os.remove('D:/Test/b站热门视频信息.xls')4 U( C+ O" t( C2 X9 a6 k0 H0 |
workbook.save('D:/Test/b站热门视频信息.xls')
$ f7 o1 d# `; ]) j, g8 G; ] print('写入excel成功')$ c* j9 d, q9 s1 J& G
print("文件位置:D:/Test/b站热门视频信息.xls")
% H' w7 S) A& i' W9 I( R1 M0 G4 \$ ?) P$ q7 O
if __name__ == '__main__':
. `- _' S- B4 e& N video_list = []
( p8 g) l$ l1 L: S6 [' Q write_Excel(spider(video_list)) V2 D/ c. d8 G0 }. Q! l
8 f. U! @* h) s
6 V1 c. b& [. L; y5 c+ E9 ^1 p1 J( R& Z& r& W$ m/ D3 h
4 w8 D4 u/ l, Z& m G. A% A3 L5 U, j/ Q O* d$ |/ ?) A
|
zan
|