- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 565361 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 174831
- 相册
- 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表格
2 y- }; @& R/ a' z3 L% ~) v效果图:
9 x# W1 F* J: E0 I% |
8 I7 t' a% m( E+ m$ `6 Q1.工先利其事必先利器,首先我们得下载相应的库:
& N$ @% m2 d" k2 Xpip install requests
6 s3 H7 h- t; r% ?$ W8 E5 a% Zpip install lxml/ @2 w6 b$ c6 z; p
pip install xlwt
; P! o; p& Q( Y: B- |0 N6 L1 f9 {7 z8 i+ v
, ~% I: z4 ~5 d( }) s: G( U% erequests 向网页发送请求9 G. p& k2 f8 r3 \5 s' f9 z2 W% Z2 G1 X( O
lxml 处理xml文件(xpath)
% Y. _- p, b8 \& k* uxlwt 对Excel做写入操作! H1 K! |3 v8 I( q4 X% i
2.爬取b站热门视频的信息:
) e' [8 z5 U' b3 m 打开b站热门视频页面:& g! Y& f5 l% `6 Q
$ a7 o4 l; S1 F, x' T 按f12进入开发者选项,然后点击选中你要获取的页面信息,即可找到该信息在该HTML文件中的什么位置(这对我们用xpath获取元素属性和元素值很重要),例如:6 J9 n$ [1 X0 D3 g3 [5 F
/ A9 ~. E; B- ^9 P3 Q$ K$ b代码如下:7 I$ M! m$ u$ j& P
# 爬取b站热门视频信息3 t2 e. O/ l ]
def spider(video_list):
. \; k- ?; a/ [ i B url = 'https://www.bilibili.com/ranking?spm_id_from=333.851.b_7072696d61727950616765546162.3'
3 m. ^) a) t9 V: ?5 H5 U html_data = requests.get(url).text( o9 N) P6 M2 t2 R1 K
selector = html.fromstring(html_data): Y* G4 Q0 ]0 h. t. Q1 u3 I: q
infolist = selector.xpath('//li[@class="rank-item"]')
8 }' H+ H. M( H! b6 S. x: } for item in infolist:* e3 o# b1 S8 J
rank = "".join(item.xpath('./div[@class="num"]/text()'))
1 v: x( c( a/ A4 B" p5 d& N$ Y videolink = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/@href'))
# n& ~# B: L# g! _, r. ?) n2 M title = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/text()'))
& J v P8 d* x x, n playinfo = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/span/text()')).split("万")4 e b# |3 f$ P# y
play = playinfo[0] + "万"/ \0 K# ~9 x/ S7 ~- H
comment = playinfo[1]
, D( O+ L4 C6 a3 s3 r% c if comment.isdigit() == False:
0 L! \& S' A, d0 O6 p. a9 G comment += "万"
( H9 p& @" _3 H, x$ C0 [ W4 l upname = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/span/text()'))
' l3 B7 ]& Y2 K: Y: U) W uplink = "http:" + "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/@href'))
" m+ i% L5 g: q. V- j) d hot = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="pts"]/div/text()')). J6 Q+ a9 y8 x/ u- h
video_list.append({
/ @) v: u6 w) g' R# E) w! p! S( n5 V 'rank': rank," P0 x+ ~9 z% v' s" c% }& O: p" u
'videolink': videolink,
9 ]5 B9 f7 {; Y: _ 'title': title,! p7 J+ D4 z3 H3 x5 ]/ d6 a
'play': play,, v& d, J+ Y6 h! w; x
'comment': comment,
) f2 r# d* T. x* } 'upname': upname,
: x$ E4 Q3 D6 v% v: Q/ G% h* l# v# y 'uplink': uplink,+ b% Q- c- j% t8 y+ [. F' T. w
'hot': hot Y# Q% T7 x$ b8 N9 e6 v$ u
})+ j+ r o+ Y+ ^
return video_list3 L% n/ j8 q$ m; b; s* r& U- X8 K3 ^
) Z# T0 _7 v! R4 M% l" Z1 x2 j
3.将我们拿到的信息集合(video_list)写入到Excel表格中:
% E5 V4 v8 M/ J0 Y) s( M xlwt的基本使用方法:$ P8 p& @: u6 G( S6 G. D# P
import xlwt+ Z: H/ T/ B. S7 Y3 w
# 创建一个workbook (并设置编码). `# Z0 h+ d6 G" ~+ O
workbook = xlwt.Workbook(encoding = 'utf-8')
( ^% K( Y2 L3 K) ]1 I" _# 创建一个worksheet
6 M" \) T: W, T& fworksheet = workbook.add_sheet('My Worksheet')
8 E% D9 m6 b% t, W1 c% H: d) a
N# Y) V \4 H2 [: v% S9 Y# 写入excel
- o9 ?9 I" h% W' F# 参数对应 行, 列, 值,(格式)
2 `$ W! g. `0 _+ kworksheet.write(1,0, label = 'this is test')
* Z8 z9 i" _4 [# 保存: X3 Y+ n6 J& p
#参数为你保存该Excel文件的路径
. n& H3 v, a y5 g# `- Jworkbook.save('Excel_test.xls')$ D$ c( h1 H/ p
3 T- @* F; d# \, c
" R5 p( d7 _ F% T. Q# Z 如果我们想要点击视频名或者up的名字可以跳转,那么我们就要使用Excel表格的HYPERLINK方法:
. P6 o9 H4 F6 jHYPERLINK(“http://www.baidu.com” ; “百度”)
h" Z5 ]8 Z0 i- ]3 J: y; L3 I百度为显示在单元格的信息,而前面的链接为跳转链接。& ?) b: r& ~' v0 k; U
xlwt.Formula()方法需要传入一个字符串s,s=‘HYPERLINK(“http://www.baidu.com” ; “百度”)’。) r/ p0 a7 g5 F) S
代码如下:% Y3 l" r5 q) m9 i( P3 j" P
# 将爬取到的数据写入Excel表格! q- r% ]8 X9 k( d2 b+ v
def write_Excel(video_list):1 m" F1 r' ~2 j9 ~8 F" z
print("将b站热门视频信息导入到Excel表格:")
( {$ U H; M/ z; y7 c: B6 ~) _5 Z workbook = xlwt.Workbook() # 定义workbook
5 e" q7 Y k2 a sheet = workbook.add_sheet('b站热门视频') # 添加sheet/ i$ w3 G: _+ c' r1 j u0 f2 \4 v1 E
xstyle = xlwt.XFStyle() # 实例化表格样式对象6 P8 r) I1 m! u7 b! D
xstyle.alignment.horz = 0x02 # 字体居中
' C" h! D3 C1 x/ z1 g o xstyle.alignment.vert = 0x01 # 字体居中4 n! W) K7 p3 s6 e0 Q" b( v e
head = ['视频名', 'up主','排名', '热度','播放量','评论数'] # 表头
; t5 R9 r+ s. R* d for h in range(len(head)):
! j8 @" A5 I n) a4 G M sheet.write(0, h, head[h],xstyle) # 把表头写到Excel里面去& B) P* u( P& M# z
i = 1# @( Z: j1 I4 Z: N; l5 W& P# O( w
for item in video_list:4 i# m. g. p5 R$ y9 w9 n3 \
# 向单元格(视频名)添加(该视频的)超链接
9 X5 E- u) i* e( a title_data = 'HYPERLINK("'+item["videolink"]+'";"'+item["title"]+'")' # 设置超链接: Y4 u9 I: t# q' ]& R- T
sheet.col(0).width = int(256 * len(title_data) * 3/5) # 设置列宽
7 U/ K: W2 D/ R' Y# K* Y( M sheet.write(i, 0, xlwt.Formula(title_data), xstyle)
: i; [$ E' |4 Z$ h' R: ] g name_data = 'HYPERLINK("' + item["uplink"] + '";"' + item["upname"] + '")' # 设置超链接; E& z* X% v# e& }2 @7 f1 @
sheet.col(1).width = int(256 * len(title_data) * 3 / 10), A& y* d4 G( S& k8 [: O7 R F
sheet.write(i, 1, xlwt.Formula(name_data), xstyle)1 _- u$ `! Z6 ^ y, \6 q8 k
sheet.write(i, 2, item['rank'], xstyle)
+ q9 n5 n* W, D2 d# _2 x: B+ w sheet.write(i, 3, item['hot'], xstyle) V* V8 k: j; `: X0 h
sheet.write(i, 4, item['play'], xstyle)
1 ~( W# o7 P# h2 q5 m( I. i sheet.write(i, 5, item['comment'], xstyle)
& r' z8 ?! p3 E; R9 g6 z i += 1
- |0 u$ U( h5 U, e # 如果文件存在,则将其删除! P9 \5 w5 w4 Z) U* G" R
if os.path.exists('D:/Test/b站热门视频信息.xls'):7 l; l* `$ K5 z7 L3 H
os.remove('D:/Test/b站热门视频信息.xls')$ |; M. a* C# V
workbook.save('D:/Test/b站热门视频信息.xls')
7 @' k2 Z7 |* {; Y) a print('写入excel成功')) w& r8 J7 n* I( j! ]: k1 M
print("文件位置:D:/Test/b站热门视频信息.xls"). o7 T D1 i$ Q3 q# n
1 f5 v# s" [+ z5 P5 Z- N; @# s$ O' e; R
4.在入口main中调用上面两个函数
) h; `) N% H" R8 W# S完整代码如下: I; i) Y: U% {1 U% F+ ^9 I: e
import requests# O R4 n$ s( S& Z# Y: l
from lxml import html
1 s J, ?" E4 c7 L# F0 v+ N3 c# V1 Cimport xlwt2 {1 O4 O/ [8 w) _5 Y/ W/ h( W7 c
import os% b& i& D* X- e* l' P
. U& `& ~! w# F% b( N$ r# 爬取b站热门视频信息6 |* _9 | j+ k( z6 w* A* P
def spider(video_list):
2 X, S# }7 F6 _5 ?+ u* a url = 'https://www.bilibili.com/ranking?spm_id_from=333.851.b_7072696d61727950616765546162.3'2 C! N- L% V5 G& z h; y* E3 G3 D
html_data = requests.get(url).text$ `) t8 y0 I1 i
selector = html.fromstring(html_data)
6 P9 x9 Z2 ] ~3 u W/ K4 r infolist = selector.xpath('//li[@class="rank-item"]')
$ U" l2 Z1 ]. q) ]- ~- E for item in infolist:$ m J/ I) s3 Y# K9 o9 N
rank = "".join(item.xpath('./div[@class="num"]/text()'))+ `% J n0 J: u2 ?6 j
videolink = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/@href'))8 n2 u( u1 p" }0 q* ]
title = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/text()'))+ l/ R# K' y9 M: \7 i
playinfo = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/span/text()')).split("万")
3 d6 L0 Z3 |' _( h' E play = playinfo[0] + "万"
1 P6 ]/ G$ a" | comment = playinfo[1]1 b$ u! P: ? x( L; `
if comment.isdigit() == False:
# T# }% n2 G1 c comment += "万"" {. D% Q) b4 v/ e
upname = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/span/text()'))
2 V* [0 G) U* v9 k: Y uplink = "http:" + "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/@href'))
% x5 N& P3 u0 b/ [, d8 I( \ hot = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="pts"]/div/text()'))
1 A- v1 j; G0 M5 T; b+ X video_list.append({
7 V5 o9 c3 O' @! }+ K0 ^ 'rank': rank,; [$ D" S, I% g, D: }, u4 ~5 i
'videolink': videolink,$ ? i- `5 l$ q P* u2 W! d6 `
'title': title,: [" x6 t- x* T1 x% X6 W
'play': play,
6 r# z* v1 z# i1 ^/ q 'comment': comment,
" g. F/ {- k( y; L 'upname': upname," B. p/ m9 T6 C) x4 W. v' b, d
'uplink': uplink,
8 n- E5 V3 ?# S 'hot': hot" O, V4 |% D, W& |7 g" ^. R
})
' U7 h1 F1 r. g4 x1 k2 u$ J return video_list7 L+ C0 M$ o0 p+ D) P
5 o1 v& ^) a7 m& D$ O% T# 将爬取到的数据写入Excel表格' }7 q2 {5 U r; e5 ~0 x. R
def write_Excel(video_list):
# l5 B8 L' m5 I+ h8 c; U1 H print("将b站热门视频信息导入到Excel表格:")
* }+ y" H# i ?0 i, W W, t3 H workbook = xlwt.Workbook() # 定义workbook
, ]8 O! F" a! G' u7 F sheet = workbook.add_sheet('b站热门视频') # 添加sheet
, O M5 }! S) J1 Q1 k; e/ C xstyle = xlwt.XFStyle() # 实例化表格样式对象' O3 v( L6 J# S5 R q0 t
xstyle.alignment.horz = 0x02 # 字体居中
3 B5 r: I+ z; ?4 m2 N9 g, g) U5 i xstyle.alignment.vert = 0x01 # 字体居中
7 N9 m" o* }( \ head = ['视频名', 'up主','排名', '热度','播放量','评论数'] # 表头/ A4 x0 \' Q% F& h7 m" e
for h in range(len(head)):; q' p- @3 P" |( c
sheet.write(0, h, head[h],xstyle) # 把表头写到Excel里面去
" _3 o& u) X5 p1 w+ r. u u7 p( l i = 1
N( N2 F5 \! H5 R+ y for item in video_list:6 t5 w3 G5 D1 x" K
# 向单元格(视频名)添加(该视频的)超链接
4 W. Y4 L; T6 X3 c1 X5 `$ T title_data = 'HYPERLINK("'+item["videolink"]+'";"'+item["title"]+'")' # 设置超链接' N: O* N" p. q$ e- u6 n/ h
sheet.col(0).width = int(256 * len(title_data) * 3/5) # 设置列宽
% D2 N( I4 p& @# G sheet.write(i, 0, xlwt.Formula(title_data), xstyle)
' @' R- d: } H& _; c, s name_data = 'HYPERLINK("' + item["uplink"] + '";"' + item["upname"] + '")' # 设置超链接
( B9 _0 K# c) o2 M5 |. z" M* I. w sheet.col(1).width = int(256 * len(title_data) * 3 / 10)
0 ^2 f# \ F* ?7 v sheet.write(i, 1, xlwt.Formula(name_data), xstyle)
' W& m: w$ [# ~5 D sheet.write(i, 2, item['rank'], xstyle)* t' Q7 M1 K# w) ?. }
sheet.write(i, 3, item['hot'], xstyle)# f; `, ?0 ^$ _$ w9 K
sheet.write(i, 4, item['play'], xstyle)
9 y' O0 o; n# n7 z8 \ sheet.write(i, 5, item['comment'], xstyle); q2 |, ]) M* d: k
i += 1% ~3 f4 b+ o! E
# 如果文件存在,则将其删除8 F9 O0 f) @3 ]) Z; n8 ~7 z
if os.path.exists('D:/Test/b站热门视频信息.xls'):+ ]- ?/ t' i+ @* X2 w; N1 n
os.remove('D:/Test/b站热门视频信息.xls')" ~+ X1 b' e, _% i6 S
workbook.save('D:/Test/b站热门视频信息.xls')
* ^3 V2 z* T* D) W" p5 t7 o' C9 Q) s print('写入excel成功')
% F, F* n* B1 H/ U! h print("文件位置:D:/Test/b站热门视频信息.xls")
- s8 O$ M7 }9 R7 Z5 ~/ p7 t/ ~& a4 E
9 \% I/ R, e2 Q" Rif __name__ == '__main__':
8 ~* b$ ^0 t' N( K. G# S video_list = []
5 m4 _3 J" L* y7 z: v+ ` write_Excel(spider(video_list))
& D& ~9 s0 X( H2 M' L; D- q$ {# \/ l; D# g% v/ Z2 K! D
4 _! M c. l) M3 u5 @( @
1 O; G0 }6 P3 g
8 N; M: Y' A( d2 Q! \* U ~+ \8 u+ U7 t
|
zan
|