- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 563371 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 174234
- 相册
- 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表格% d0 y" ^8 i* b, E! K
效果图:
/ R* i0 {8 }1 P, C
3 k# Y1 a6 d: a
1.工先利其事必先利器,首先我们得下载相应的库:' L* b h& W5 k7 e
pip install requests
7 p% W" ]9 G5 O1 O' U: ?: [. [pip install lxml9 {7 ^# E6 c) i. F2 U! W/ f! y
pip install xlwt m2 h$ n# R. _; Q3 Z( S
; \+ k! M3 Y* u7 C0 f
& O# @! t. i9 P% x* X) K5 M5 _requests 向网页发送请求" T$ f( x$ k/ f) Q) @# a
lxml 处理xml文件(xpath)
9 P8 e5 T9 x9 C1 Q* d2 j. X) M4 Axlwt 对Excel做写入操作) w7 G' I5 x& y) p
2.爬取b站热门视频的信息:
% c; W" p0 I) t% u 打开b站热门视频页面:
2 [6 f( p' ?" ]# c1 W1 K4 o
+ k$ k$ F3 e0 v 按f12进入开发者选项,然后点击选中你要获取的页面信息,即可找到该信息在该HTML文件中的什么位置(这对我们用xpath获取元素属性和元素值很重要),例如:
/ {6 B6 J: K x
H N q9 A* ~- f" w
代码如下:
6 a6 o& n! |# W; X# 爬取b站热门视频信息
7 f( B: [& f5 u$ U# C/ `def spider(video_list):
) \8 @+ d. K) z2 I' r! d- P url = 'https://www.bilibili.com/ranking?spm_id_from=333.851.b_7072696d61727950616765546162.3'
4 t, A! u3 L- ?; M3 }# ? html_data = requests.get(url).text
8 O# E. @! Z Z% c+ Y3 u selector = html.fromstring(html_data)
! k- I, m }1 U8 E; c infolist = selector.xpath('//li[@class="rank-item"]')
4 x( m7 i- ]4 c for item in infolist:
- `+ V4 P, }) p, R! \ rank = "".join(item.xpath('./div[@class="num"]/text()'))3 c$ d* X: L( k U: ~
videolink = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/@href'))- e8 P+ W J$ w0 D6 V6 \7 F1 c z
title = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/text()'))
1 Y. T3 L0 d8 i3 K( U9 f# N% E# V playinfo = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/span/text()')).split("万")* {5 M- T5 g# {5 ^3 S0 ~1 Q. |. X
play = playinfo[0] + "万"9 o4 s0 `9 W6 x& O5 d/ c
comment = playinfo[1]- Z7 H& }6 ]3 G% ]5 q0 I' [
if comment.isdigit() == False:' m, k9 w* e4 ` t
comment += "万"
' n! c8 i3 G1 r, @. { upname = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/span/text()'))
. w& X! u) m2 b9 ~* N' V7 b uplink = "http:" + "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/@href')): r+ Q7 [2 U/ W5 Z/ {( }) L* ~
hot = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="pts"]/div/text()'))3 O! |& V* o5 g+ ?/ x3 D
video_list.append({, K4 }, x" E3 B2 R* U& c9 ?/ U* j, D
'rank': rank,
4 O" k5 P* }8 R# H9 x4 L 'videolink': videolink,
2 P1 m- ]- J+ o0 T% ^ 'title': title,2 ]% R, U- N( K
'play': play," h: w7 K: q5 S/ b
'comment': comment,' x4 h, W6 b6 T
'upname': upname,
( l- _' x O$ g' h; u 'uplink': uplink,$ I+ b- C3 @# ]
'hot': hot
2 S2 p0 ]$ I: N% G( ` })
- e/ @6 T7 o+ ]: K: k1 U8 n( W return video_list
2 _( a5 u, v3 s- q
; @* _* O* y6 ?" e9 p; \+ V9 r3 ~5 q
3.将我们拿到的信息集合(video_list)写入到Excel表格中:
% s$ F0 ?3 y" U8 T7 \9 P/ n: p xlwt的基本使用方法:+ F( u0 Z T3 t1 L3 [
import xlwt
w) g, L8 F9 y5 e# 创建一个workbook (并设置编码)5 d% ~4 {% P7 i" @7 g# H% a
workbook = xlwt.Workbook(encoding = 'utf-8')1 D+ _* b! h3 p0 m4 P& D
# 创建一个worksheet
; V* n9 K7 ~ E8 F5 Y% M0 l( o, wworksheet = workbook.add_sheet('My Worksheet')
0 T2 V0 h4 L6 S/ H) N2 O6 J
8 ^; j& m, b6 f1 J2 y- g0 I# 写入excel
0 }; v! w- C; [# 参数对应 行, 列, 值,(格式)( @" u$ D6 M {: V' D$ B( o
worksheet.write(1,0, label = 'this is test')& Q A1 e/ v& @( O
# 保存
) p( h( s$ i0 w$ p) ?#参数为你保存该Excel文件的路径7 ]$ M6 p/ y( m+ v7 N3 p
workbook.save('Excel_test.xls')
& ?* l9 a/ Z. s# Z. B+ a! q! N
% d/ H, {, b$ W) M( A, y
7 M& i+ J0 O) }2 X) k 如果我们想要点击视频名或者up的名字可以跳转,那么我们就要使用Excel表格的HYPERLINK方法:
8 T3 q+ u; n+ T& ]; rHYPERLINK(“http://www.baidu.com” ; “百度”). F$ r6 L' A( F2 N; {; C- @
百度为显示在单元格的信息,而前面的链接为跳转链接。) a: @7 q1 p; m4 S
xlwt.Formula()方法需要传入一个字符串s,s=‘HYPERLINK(“http://www.baidu.com” ; “百度”)’。
2 ~' |- A4 m# {" \2 T" k% U代码如下:
# U0 r2 a) u! Z% d5 i# 将爬取到的数据写入Excel表格
0 ]3 S1 y6 p1 idef write_Excel(video_list):- H! ?9 \0 J3 U I3 l Z1 W5 e0 |6 @
print("将b站热门视频信息导入到Excel表格:")0 @' C* p" p$ g9 i6 m2 U
workbook = xlwt.Workbook() # 定义workbook6 o0 N$ r. H/ x, {/ |
sheet = workbook.add_sheet('b站热门视频') # 添加sheet8 e4 @. \* r! _
xstyle = xlwt.XFStyle() # 实例化表格样式对象
/ K/ q# A- j6 a0 p$ c5 b xstyle.alignment.horz = 0x02 # 字体居中& G! h* |- x# S- z( e: M4 F
xstyle.alignment.vert = 0x01 # 字体居中
9 i# D) {. [8 u) H' H+ ]0 R- R; t$ d" J head = ['视频名', 'up主','排名', '热度','播放量','评论数'] # 表头! N2 }2 O [1 D) R* w
for h in range(len(head)):; D7 \& B( b! ^3 n! [3 R
sheet.write(0, h, head[h],xstyle) # 把表头写到Excel里面去! [# E# G& A3 v" }
i = 1
" E' b; G1 H2 z; Y for item in video_list:
& t5 l# x v7 t* u8 W # 向单元格(视频名)添加(该视频的)超链接
& x: w( o) Y5 ^* G9 ] P1 H title_data = 'HYPERLINK("'+item["videolink"]+'";"'+item["title"]+'")' # 设置超链接
5 v4 s9 x7 l9 z1 P; f$ d sheet.col(0).width = int(256 * len(title_data) * 3/5) # 设置列宽# ]' m# P# E7 k& T( w
sheet.write(i, 0, xlwt.Formula(title_data), xstyle)
% y4 y" l. Z; p: A name_data = 'HYPERLINK("' + item["uplink"] + '";"' + item["upname"] + '")' # 设置超链接' H8 F) u: ?4 m z3 _% h9 g3 E! u
sheet.col(1).width = int(256 * len(title_data) * 3 / 10). B" i/ C/ E( P8 d7 G. J
sheet.write(i, 1, xlwt.Formula(name_data), xstyle)- d- Q& v% j. {, e' T
sheet.write(i, 2, item['rank'], xstyle)& f" ^8 l' R" m% |9 x: [. }2 b
sheet.write(i, 3, item['hot'], xstyle)4 V; g, \/ w& d/ r
sheet.write(i, 4, item['play'], xstyle)' w J, Z) O3 K! v& f
sheet.write(i, 5, item['comment'], xstyle)
0 w7 A/ U# Z) H7 H i += 1! G9 d" C q. n4 M! k
# 如果文件存在,则将其删除2 u. `) i T4 o. d0 N* V9 Y
if os.path.exists('D:/Test/b站热门视频信息.xls'): x0 q" H4 o; z' i! X4 B$ E5 i* \1 N! o
os.remove('D:/Test/b站热门视频信息.xls')5 D4 a6 D( T/ q
workbook.save('D:/Test/b站热门视频信息.xls')( O6 X1 j1 e& n+ P; f9 |8 \
print('写入excel成功')
. f0 l4 r. H9 h* z8 B& A. t0 Y print("文件位置:D:/Test/b站热门视频信息.xls")
7 {5 t0 N8 d( [% Q
2 p. e( \, a' Y6 \1 @; i; M
8 h' D1 |( d! J4 h$ l W1 {- S4.在入口main中调用上面两个函数
3 d* f/ v, w/ A6 p完整代码如下:
! [4 u9 v+ p s0 `; V, g# mimport requests: w3 @8 W" K! t. p/ E
from lxml import html5 _( `% L( `2 g! e5 P( j) H! l
import xlwt
+ {4 v$ N5 Z/ C/ M+ y2 N2 zimport os
9 r: E0 e. ~# O% v; t
, }6 n* P0 E# j4 C: y0 u( t# 爬取b站热门视频信息+ N5 D& w m7 d' l' _3 c% q( p
def spider(video_list):# D H% h7 S- G K, k
url = 'https://www.bilibili.com/ranking?spm_id_from=333.851.b_7072696d61727950616765546162.3'; F P/ ^, f! x9 x
html_data = requests.get(url).text X3 v% p& G$ x& S+ C
selector = html.fromstring(html_data)
0 v7 f7 I& u/ @. S) }& v+ y. Y. J infolist = selector.xpath('//li[@class="rank-item"]')1 k- G: ~/ ?( a8 z' P8 V8 |
for item in infolist:5 R6 A, u" g* B6 y. o1 b% L
rank = "".join(item.xpath('./div[@class="num"]/text()'))# R* ] _9 V U+ r, h8 x" i @$ L v
videolink = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/@href'))" J$ O2 b5 E/ S/ a3 L$ j8 I
title = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/text()'))
$ [; W. i" X' A y% v playinfo = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/span/text()')).split("万")
) G5 h: ]3 P9 u0 R, v" F9 I play = playinfo[0] + "万"7 W/ L; S0 _# N( M c6 ]
comment = playinfo[1]1 Q* D3 ?, c+ O: b u) k
if comment.isdigit() == False:
& p4 ^) G# h$ P. ^ comment += "万"6 i+ H2 T/ u' S1 W. ]0 X t
upname = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/span/text()')); I9 [- D. v8 ?& D
uplink = "http:" + "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/@href'))
( H+ w2 y' f. C3 N4 C hot = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="pts"]/div/text()'))
0 s" @" Z9 o T( q: E; I' ~ video_list.append({: d$ M2 Y9 P% r! |
'rank': rank,
. q" X$ m) v! q% p& [ 'videolink': videolink,
8 q/ i' V# s3 b9 O 'title': title,) ?" b' d o8 `2 [, [7 W
'play': play,
) s4 u, T2 [# j% n- F$ ? 'comment': comment,
, c" i7 b( K% j# {1 m. g 'upname': upname,
1 |9 F: X; B' [# v 'uplink': uplink,* f0 z2 ]; h! e1 @
'hot': hot# \: ]) S( b' G k' b
})4 w, x+ w. r6 T
return video_list
, M0 v) K6 I! }. ?2 m4 J$ _: v
- m5 B1 J- f$ L# 将爬取到的数据写入Excel表格. ]7 Z8 c0 a" l6 b8 n. P( ~0 ?
def write_Excel(video_list):
! e/ A1 q) y+ C7 ^4 T print("将b站热门视频信息导入到Excel表格:")6 M2 _4 R+ l2 `( F, N0 x" l1 R
workbook = xlwt.Workbook() # 定义workbook* e3 s, c# H5 Y% }1 y$ h
sheet = workbook.add_sheet('b站热门视频') # 添加sheet; T% ]. Q) ~5 K7 U
xstyle = xlwt.XFStyle() # 实例化表格样式对象
% ~7 k( @% ?' \1 Q/ n! ~ xstyle.alignment.horz = 0x02 # 字体居中# L0 v, `3 _. l
xstyle.alignment.vert = 0x01 # 字体居中
6 V, o' e3 e& r& T4 q8 e1 |$ b head = ['视频名', 'up主','排名', '热度','播放量','评论数'] # 表头' b" J, p$ R" Q$ i7 B6 ]
for h in range(len(head)):
! x }& q6 A$ z2 O8 E sheet.write(0, h, head[h],xstyle) # 把表头写到Excel里面去
% c# I7 V" N' b# ] i = 1+ W& l( G0 E3 _
for item in video_list:
6 q; A/ m, Q* e6 U3 [ # 向单元格(视频名)添加(该视频的)超链接0 `, |- K) S1 e, y6 X& }
title_data = 'HYPERLINK("'+item["videolink"]+'";"'+item["title"]+'")' # 设置超链接6 d$ g% } [- V- y O( p. `
sheet.col(0).width = int(256 * len(title_data) * 3/5) # 设置列宽" A. t: L! V6 Z7 p% O- p4 f
sheet.write(i, 0, xlwt.Formula(title_data), xstyle)1 I6 x, E3 ~4 w M
name_data = 'HYPERLINK("' + item["uplink"] + '";"' + item["upname"] + '")' # 设置超链接
& U2 ]4 U( @: T sheet.col(1).width = int(256 * len(title_data) * 3 / 10)
* q' _2 N V4 C( i+ i5 s sheet.write(i, 1, xlwt.Formula(name_data), xstyle)
a7 G2 g: T$ `0 `" d9 N6 Z sheet.write(i, 2, item['rank'], xstyle)
9 Y) w1 F+ L% m sheet.write(i, 3, item['hot'], xstyle)4 ]* e# o8 |7 I+ a" Z
sheet.write(i, 4, item['play'], xstyle)
! R: x9 B: D5 l9 N# K sheet.write(i, 5, item['comment'], xstyle)
+ W7 t: s% _' m4 r8 {2 O/ N0 f8 m9 H i += 13 c# E8 k1 J: T) k# ?* F
# 如果文件存在,则将其删除
8 P& o) j# {5 x5 ^6 n if os.path.exists('D:/Test/b站热门视频信息.xls'):
2 g2 Y- u' \' | j3 o, c+ M- J' S os.remove('D:/Test/b站热门视频信息.xls')8 f, \: b$ E& ~5 S* w' c3 E
workbook.save('D:/Test/b站热门视频信息.xls')
$ m2 a& F" u4 Y7 y5 w* q print('写入excel成功')
5 x6 o. V) h, t print("文件位置:D:/Test/b站热门视频信息.xls")
7 V* h I' ^5 _& S4 K; e1 x; K" d2 }' D2 `
if __name__ == '__main__':' Z* `! Q, g6 ]3 G; Q! V* W
video_list = []6 A8 Q9 x, D; L
write_Excel(spider(video_list))4 K* s+ p. N, |9 Y
/ }0 p6 T) j8 o! H( ~% [
: c, R" p9 v6 t6 h! V( V4 R
; [8 d R6 O, ^ [: a; L! v4 u: o% K5 e T* [/ U! i
; R; F3 O) Z, U3 m3 o, { |
zan
|