- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 563399 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 174243
- 相册
- 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表格! c H& p: Z! r7 _5 q+ G& u
效果图:
9 n& t" g) C: g4 a! P+ {9 ~
" b( z5 ]* i/ }- [$ X
1.工先利其事必先利器,首先我们得下载相应的库:
6 G/ c8 x2 ^4 C$ M, i- {% K: Upip install requests
# ~% {7 j% n# O2 U# @pip install lxml
3 c5 n& I) ]& L" Opip install xlwt0 |% K6 y: J. B! K% h4 t& Y* y5 U
/ p6 q, T2 B0 V' E7 A! I+ i# h1 r2 V! h/ V) c* L6 M! u# V9 w
requests 向网页发送请求
* f( R2 }) A) |2 M" P/ Olxml 处理xml文件(xpath)
6 a4 ?9 o) j- Z5 h4 }1 Zxlwt 对Excel做写入操作9 }! ?; Q3 |9 g% W; C* c; e) ~# w
2.爬取b站热门视频的信息:
0 m' @$ b# Y% Y" L2 g) a 打开b站热门视频页面:$ e( E) h- o6 S8 L3 u* ]
- i; o4 ^4 c, r. }# n: {
按f12进入开发者选项,然后点击选中你要获取的页面信息,即可找到该信息在该HTML文件中的什么位置(这对我们用xpath获取元素属性和元素值很重要),例如:
, f' d) d! u* ~- J+ L6 [0 c! M
8 }: Q3 H0 C+ s, i
代码如下:
+ K+ p* [% v" A/ e3 c# 爬取b站热门视频信息4 {: H! V2 p- k; t, e5 ~. P; E2 b
def spider(video_list):
0 \, }7 n# n, F# ~+ h! F& | k% [! a url = 'https://www.bilibili.com/ranking?spm_id_from=333.851.b_7072696d61727950616765546162.3'
, E( ~4 X+ b$ X! w5 I html_data = requests.get(url).text
7 }5 e! t) X. t# j9 P; ~ selector = html.fromstring(html_data)' b5 L2 r2 E6 x, g+ y- Z8 S& r; {
infolist = selector.xpath('//li[@class="rank-item"]'); Z# y8 Y' N$ ]! [1 W' r& p c
for item in infolist:6 o) n+ W2 B p
rank = "".join(item.xpath('./div[@class="num"]/text()')): I' D6 S( Q) I2 U- T3 ]+ C8 R8 d
videolink = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/@href'))$ J3 |9 m U( n$ ^8 J3 l0 U
title = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/text()'))- u& J; z }* k( {' Y
playinfo = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/span/text()')).split("万")
+ E) R, O) B) X8 z: ?4 ^' P play = playinfo[0] + "万"
/ a8 y4 G: m' \8 E/ r comment = playinfo[1]
! q. u$ C5 l, ?; B C if comment.isdigit() == False:
5 G" y# M" v' ^/ W! n1 x; S6 t comment += "万"
, _5 n3 Q/ f) H1 ?+ _9 [; q4 d upname = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/span/text()'))' h$ g$ H$ [. i' d
uplink = "http:" + "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/@href'))
. f/ E5 q, ]+ M9 V3 v7 `. ?* P hot = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="pts"]/div/text()'))! B5 a g7 x! O" z! Y
video_list.append({
% M" W, c( @3 w/ R. g3 _ 'rank': rank,
$ r/ g( x5 S2 ^0 z# y% h6 H 'videolink': videolink,
& N/ A7 V. Q" }; }: _ 'title': title,
9 k/ [ u1 F7 |1 X: w" e 'play': play,
& J6 F5 _* R) T) a) n+ | 'comment': comment,
% T3 A% k) k1 t. C4 K' F6 b. [ 'upname': upname,
5 a* R8 c! q( b" @! {! E1 [# X- i8 p: } 'uplink': uplink,4 h' y! k3 P' z- s9 c( m# P# f
'hot': hot
$ t4 Z" z# c9 W4 f0 E/ i7 C })9 A+ w6 j M; ~( E4 B* F: j
return video_list
& W! U$ w; H+ c$ I" u( h D9 a9 e0 ?
; W5 S' H! ~+ s0 T4 l" c" }5 c6 l7 ?6 M
3.将我们拿到的信息集合(video_list)写入到Excel表格中:% x! g+ Y3 K+ ^8 {2 g6 C8 p9 k
xlwt的基本使用方法:
$ m. V2 n$ [+ Aimport xlwt, y. O. a8 v2 H4 W% D
# 创建一个workbook (并设置编码)8 m& i2 P g* w7 `, P
workbook = xlwt.Workbook(encoding = 'utf-8')
# C: E% f% K6 Y1 r7 c+ d+ ^# 创建一个worksheet
& Z. V& M# T9 w6 kworksheet = workbook.add_sheet('My Worksheet')
* X# z) p9 @0 o% T! {, \/ D! N
5 E5 k/ s) z* g7 ^- E# 写入excel! q2 v' t/ L' p: G- U
# 参数对应 行, 列, 值,(格式)4 C* q6 Z0 J- ^
worksheet.write(1,0, label = 'this is test')
% n; [6 Q# l# w5 ^7 I# 保存
# }+ K5 H7 ]: E$ n8 ^; [#参数为你保存该Excel文件的路径9 M8 u% h6 A! n$ z, G5 S
workbook.save('Excel_test.xls')! P# `7 B9 x6 n6 U+ ^' i
1 t- u# u$ T' b5 U/ r3 p
8 ]9 J; V: n5 g, s& k4 @5 o 如果我们想要点击视频名或者up的名字可以跳转,那么我们就要使用Excel表格的HYPERLINK方法:; s1 e5 w3 f: }& X0 F
HYPERLINK(“http://www.baidu.com” ; “百度”)
1 |2 d- ?0 F( v' o8 Q百度为显示在单元格的信息,而前面的链接为跳转链接。* h1 M) l9 H: o0 n2 W
xlwt.Formula()方法需要传入一个字符串s,s=‘HYPERLINK(“http://www.baidu.com” ; “百度”)’。4 q/ R3 C% ?% Y" _
代码如下:
4 c! V6 H. z- X, B. a! d& R# 将爬取到的数据写入Excel表格6 E" ]9 ?! y% l' S, I
def write_Excel(video_list):
~! L, q' ~9 F" f1 E3 w; z print("将b站热门视频信息导入到Excel表格:")
# _6 a2 j0 ?1 w: t! F& m3 O0 X workbook = xlwt.Workbook() # 定义workbook
! Q: v3 V# b8 B, C7 T$ ]: \ sheet = workbook.add_sheet('b站热门视频') # 添加sheet
, Y P$ M: b( Z1 y9 O xstyle = xlwt.XFStyle() # 实例化表格样式对象
1 A+ f& n5 o( p+ Q xstyle.alignment.horz = 0x02 # 字体居中
0 S3 v2 e+ f; R& Y9 @ xstyle.alignment.vert = 0x01 # 字体居中" S5 J i. E) t6 z
head = ['视频名', 'up主','排名', '热度','播放量','评论数'] # 表头
% {3 | @! |, V2 l" t. T" Q; F for h in range(len(head)):, X6 ~- `. h8 T: K
sheet.write(0, h, head[h],xstyle) # 把表头写到Excel里面去
4 A: a! o0 z5 A, n; K8 } c0 S i = 1$ T/ c+ X0 E7 v3 t' a2 Y# f+ X: r
for item in video_list:
- o' ]( }) D- W5 f9 A # 向单元格(视频名)添加(该视频的)超链接
: Y, C7 \! M/ ]* I# P' x2 E title_data = 'HYPERLINK("'+item["videolink"]+'";"'+item["title"]+'")' # 设置超链接9 g. w! v$ o6 T7 x! Q* D! D: h
sheet.col(0).width = int(256 * len(title_data) * 3/5) # 设置列宽 ]" K* j! A% b& J+ O
sheet.write(i, 0, xlwt.Formula(title_data), xstyle)
% g; w; S$ n& h* h& f name_data = 'HYPERLINK("' + item["uplink"] + '";"' + item["upname"] + '")' # 设置超链接
6 q5 G k3 X: t) I& n sheet.col(1).width = int(256 * len(title_data) * 3 / 10)- N W9 Y+ T8 C) E8 h% K
sheet.write(i, 1, xlwt.Formula(name_data), xstyle)
0 x# ` j* F( J% N; o sheet.write(i, 2, item['rank'], xstyle)
. J# ~7 i0 o$ y! g# ?# ^ sheet.write(i, 3, item['hot'], xstyle): ^& P5 D! r! b
sheet.write(i, 4, item['play'], xstyle)
/ _+ a6 p( X9 b. Z. H sheet.write(i, 5, item['comment'], xstyle)1 X4 w/ s0 [: W! ]
i += 1. h6 p3 _0 w3 l3 _' W7 s
# 如果文件存在,则将其删除
( p# S# f9 I. Y& M if os.path.exists('D:/Test/b站热门视频信息.xls'):2 z3 N, S8 Y2 z2 j3 [; b) F
os.remove('D:/Test/b站热门视频信息.xls')4 I1 c7 k: {& f8 j( _: F
workbook.save('D:/Test/b站热门视频信息.xls'). O( z, b( @% e& f
print('写入excel成功')
U( |# J; g9 i, W) E5 ~2 i print("文件位置:D:/Test/b站热门视频信息.xls")" i1 ?* c# k, w6 ]" o- |1 u
6 C* p* W# I9 x9 E
a/ O5 B# P/ e y8 a
4.在入口main中调用上面两个函数
7 _5 H' t3 U' X5 F完整代码如下:( H h$ @* {7 Q' d, w2 Y, T3 w) N
import requests
\: R) {$ p1 C3 |% B7 mfrom lxml import html
6 S% ?6 O* h0 J6 ~import xlwt( j) n c& p8 b) X: a( K0 J0 s
import os
! t& o# u! w o1 ]( w9 g; E5 J7 { D+ f" _( Q: q& v; K
# 爬取b站热门视频信息
" V% N: T3 h; K: _def spider(video_list):: I# Y9 K- n f$ B
url = 'https://www.bilibili.com/ranking?spm_id_from=333.851.b_7072696d61727950616765546162.3'9 v/ G7 \) |7 A: o7 K
html_data = requests.get(url).text* Q* [ m5 w9 b: ?8 `8 @( m
selector = html.fromstring(html_data)
% ]" C' L# O j0 v; z; C' i% s& L* E infolist = selector.xpath('//li[@class="rank-item"]')
; y% s7 Q; E/ q for item in infolist:
c3 q& i6 Y: y0 |$ i; B/ D rank = "".join(item.xpath('./div[@class="num"]/text()'))
6 J0 G" i; G% `1 M videolink = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/@href'))
8 \* ?; Z% ^/ Y1 C2 U) |7 n9 ^, ^ title = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/text()'))
# F6 p) o$ v7 ], J& L! [* f2 l+ K' i; i playinfo = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/span/text()')).split("万")
) u z ~& O5 B; z play = playinfo[0] + "万"
6 c& V# M. i# Q* S) ], z comment = playinfo[1]* ?- C" ?1 P) ^3 E1 Q
if comment.isdigit() == False:
, [+ z# u) V0 M6 P; v& {2 I comment += "万"
3 w- C$ m$ s/ W6 V4 g4 | upname = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/span/text()'))
. `, u( j% n8 E' c, s9 p uplink = "http:" + "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/@href'))0 {9 W/ W. r: e% G
hot = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="pts"]/div/text()'))
9 F1 o* j: Y9 B: b+ T video_list.append({
( o9 a d1 m3 I' n9 F 'rank': rank,6 J x9 d9 D5 B9 d$ G
'videolink': videolink,, E" Z8 `3 `2 j! x( R
'title': title,
; g2 n) o$ \, ~ 'play': play,3 q/ W7 v& A5 S: e
'comment': comment,
) w d$ j; d; N A 'upname': upname,
1 T( Z9 E, y) L) t( D$ `; I. ?2 G 'uplink': uplink,
# C7 z1 I# d* `0 l% C$ q8 i) _- Q% W 'hot': hot
4 P2 g$ j. i' D" Z* ]" U })8 d7 z4 j3 o) T- z4 B& [' P% y
return video_list
- \: g+ n3 Q" l" d8 @% ] _5 U5 `
$ g! \0 H! C! @! B# 将爬取到的数据写入Excel表格
+ s* L& _9 U- E7 v6 _1 W" Gdef write_Excel(video_list):% F( p! t3 H2 g: R: A
print("将b站热门视频信息导入到Excel表格:")/ B- G, A/ L3 g9 @
workbook = xlwt.Workbook() # 定义workbook7 C- I4 U) h# d
sheet = workbook.add_sheet('b站热门视频') # 添加sheet
1 P& f6 M0 y$ e' \1 z/ ^ xstyle = xlwt.XFStyle() # 实例化表格样式对象. \& e9 \3 y9 C6 S) N
xstyle.alignment.horz = 0x02 # 字体居中
' B5 ]0 ~3 p9 e/ O4 ? xstyle.alignment.vert = 0x01 # 字体居中/ O. \1 O* R; E8 E. _+ R
head = ['视频名', 'up主','排名', '热度','播放量','评论数'] # 表头1 M% S* ^- V5 T6 T1 ?
for h in range(len(head)):; @/ [ c R3 {! P
sheet.write(0, h, head[h],xstyle) # 把表头写到Excel里面去
9 g1 o2 b( ~, A4 W2 v1 f. A i = 16 r* \% F" ^" s" E3 k4 Q
for item in video_list:
( W& N6 w. m% P6 e5 | # 向单元格(视频名)添加(该视频的)超链接
) [' D# M2 h H% v title_data = 'HYPERLINK("'+item["videolink"]+'";"'+item["title"]+'")' # 设置超链接* T$ [4 F; B$ J7 v
sheet.col(0).width = int(256 * len(title_data) * 3/5) # 设置列宽& W+ `5 L. m, J, Q# G* |$ {" e3 L
sheet.write(i, 0, xlwt.Formula(title_data), xstyle)
# S8 T+ h4 g2 C name_data = 'HYPERLINK("' + item["uplink"] + '";"' + item["upname"] + '")' # 设置超链接
' d1 s5 b" ~7 K4 P- _" } sheet.col(1).width = int(256 * len(title_data) * 3 / 10)
?$ y# g( Y/ a) r& s6 w7 T sheet.write(i, 1, xlwt.Formula(name_data), xstyle)
& ?7 ~/ D& d- G, {" E% U, x sheet.write(i, 2, item['rank'], xstyle)
. p7 B& R$ @5 V+ g& s4 _ sheet.write(i, 3, item['hot'], xstyle)3 W6 Z+ {% U: \4 _
sheet.write(i, 4, item['play'], xstyle)
- U' j- C. o3 b! `4 @ sheet.write(i, 5, item['comment'], xstyle)4 z5 }0 L+ R" K- @- [. |& P
i += 1
O* o1 q/ [4 i3 S # 如果文件存在,则将其删除2 F; ~2 X; W: W/ V( z1 X' X
if os.path.exists('D:/Test/b站热门视频信息.xls'):* x( d+ U! S3 v
os.remove('D:/Test/b站热门视频信息.xls')8 c7 w. J) s# c9 V
workbook.save('D:/Test/b站热门视频信息.xls')/ L/ _2 I( ]) H0 N/ G
print('写入excel成功')
# y2 S2 b. b6 O/ W0 @ print("文件位置:D:/Test/b站热门视频信息.xls")
7 f! N; y' l- M
3 [! ^$ T7 A0 z' ^( Q/ N) ?; bif __name__ == '__main__':
' o- [+ I) x, W9 w video_list = []& ?5 n/ Z3 l# o# U
write_Excel(spider(video_list))
( G. J! K8 Y( ~! j; `# ]1 V1 E
; _" O; t+ B! H0 w0 ?! u# A% K$ F4 e3 O: B
: Y6 U1 |* g5 F
2 Q6 X! {; x/ [
e6 H F) |# T4 e |
zan
|