- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 564568 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 174593
- 相册
- 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表格3 k& j2 ~1 H2 h' R; I! \1 V
效果图:
% p" q7 ?) u4 t7 y+ k0 g' C
; T/ [& i* B0 N9 O1 E' {1.工先利其事必先利器,首先我们得下载相应的库:% r5 Q N7 Y, a- G+ h+ {
pip install requests" ~& Z2 X/ p& K
pip install lxml
, Z, Z; M7 h; M- ]3 `9 apip install xlwt+ J6 Y3 V0 `. R1 s" k6 g3 D% }
4 b) o( k, ?" N7 C+ ?$ E3 V o
& n; Z% F5 @) Q2 O6 i. K7 R( orequests 向网页发送请求
, O: Y* T4 g4 H3 A* m! L8 q+ Clxml 处理xml文件(xpath)) `9 ?9 k/ B0 }3 W! D% y
xlwt 对Excel做写入操作
) a3 Z7 k5 l" ]. c* ?2.爬取b站热门视频的信息:7 g$ p7 T7 N' P! G7 L
打开b站热门视频页面:
0 d) F2 ?% k0 M. T. }
. D$ _3 j) P3 W 按f12进入开发者选项,然后点击选中你要获取的页面信息,即可找到该信息在该HTML文件中的什么位置(这对我们用xpath获取元素属性和元素值很重要),例如:
& N5 K: M' g0 F8 n" D# j
2 Q3 I+ v, b5 @( D" c
代码如下:% ^* _2 B( \6 u
# 爬取b站热门视频信息
( R. s2 J2 d; V; D5 m2 J$ l6 Idef spider(video_list):6 e: J K! v; ^8 M! N' b9 A
url = 'https://www.bilibili.com/ranking?spm_id_from=333.851.b_7072696d61727950616765546162.3'7 C( n7 O. H) |- y8 F Z' m
html_data = requests.get(url).text
5 c. D( h* @$ d. a- J selector = html.fromstring(html_data)
6 Z g. q: H0 S1 x: [# o2 n" O infolist = selector.xpath('//li[@class="rank-item"]')' n3 U# }* A a
for item in infolist:% Y9 Z& F6 C" U" m8 G5 I0 I* m$ p
rank = "".join(item.xpath('./div[@class="num"]/text()')), f. X2 @3 N( w% Y* a$ G0 C
videolink = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/@href'))
! P" w) d) v* W, {; p: R3 c title = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/text()'))
2 F3 J" L0 z: \6 Y: E" F playinfo = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/span/text()')).split("万")
1 R0 M! E# a' ^2 ^0 I play = playinfo[0] + "万"
! H) ]( S1 h, \4 j0 D6 F comment = playinfo[1]* K1 ?1 D! Y' m1 _% H5 \1 [' D
if comment.isdigit() == False:' d* j( J5 j( L# u* R: u
comment += "万") f% \! \8 T1 u9 Y& v( p# y6 d
upname = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/span/text()'))
0 {! _& u+ k5 a2 F% b uplink = "http:" + "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/@href'))
6 ?/ L8 w9 Y2 z: D hot = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="pts"]/div/text()'))! T2 I& |- X6 b
video_list.append({; n+ ^2 r! H1 u G. A
'rank': rank,
8 G2 {- U/ k$ d 'videolink': videolink,# ?1 V) J+ A1 p! w: h8 m# F. L
'title': title,
1 e; C6 n% c3 J1 M- q( I$ g/ i 'play': play,; u# |1 P/ l5 |; J
'comment': comment,' G% v& ?7 w" e9 X# k: D
'upname': upname,
; V; F" |2 P2 L$ t: `2 A* v6 K; U1 T) [ 'uplink': uplink,
2 H) S/ \- |* [8 F8 E 'hot': hot4 B& T+ G7 T3 t" k2 }
})9 P) t1 d( L3 f+ }0 Q& w
return video_list( D8 e4 a. D: C7 B5 M `
0 D4 T c$ ^# R
# J" Z; n) e6 \& P' A3.将我们拿到的信息集合(video_list)写入到Excel表格中:
$ t. } o+ v. r. Q0 m xlwt的基本使用方法:% z& @, O0 K& T5 R. }. Z
import xlwt
" c$ d+ L$ H7 F2 ^1 G0 ]/ r' f. i# 创建一个workbook (并设置编码)
' [* z: n8 R+ v& Y5 e* Z8 Tworkbook = xlwt.Workbook(encoding = 'utf-8')
) ^. b9 x& y, T" x u4 h. v# 创建一个worksheet
* M' y& Y/ z" p$ i( i. Xworksheet = workbook.add_sheet('My Worksheet')
' |/ |& |& @ I" K3 E
7 ]1 i. L& o- `& t* K: Y# 写入excel! u8 h$ y+ k ^, f, w, d& ^
# 参数对应 行, 列, 值,(格式)/ K$ K, S1 \ m/ p
worksheet.write(1,0, label = 'this is test')
5 B& ^9 D3 ^7 l3 `0 R5 K# 保存0 L- H$ \/ |) V$ F5 Y& {
#参数为你保存该Excel文件的路径
" h( C! z2 b8 a# S+ v4 jworkbook.save('Excel_test.xls')
( h' i/ x6 H8 s5 z
- j; _& ]% E' G+ o8 b V; G. h8 @' R
如果我们想要点击视频名或者up的名字可以跳转,那么我们就要使用Excel表格的HYPERLINK方法:) L2 p D- l, [ O# ?& ~
HYPERLINK(“http://www.baidu.com” ; “百度”)
1 ^* y7 A9 A6 Q百度为显示在单元格的信息,而前面的链接为跳转链接。7 K7 {# I2 o& f8 `5 ~3 g
xlwt.Formula()方法需要传入一个字符串s,s=‘HYPERLINK(“http://www.baidu.com” ; “百度”)’。
0 ^/ x4 {& E8 n$ h2 T代码如下:) r6 |9 p4 ` C
# 将爬取到的数据写入Excel表格: W- [+ U/ K0 v3 n5 T# \( R* ^
def write_Excel(video_list): b ]4 U/ r: e& Z
print("将b站热门视频信息导入到Excel表格:")2 c w4 Q+ O% h* v* R |% ?+ m
workbook = xlwt.Workbook() # 定义workbook
% N' t* Y1 T. H sheet = workbook.add_sheet('b站热门视频') # 添加sheet
& ^8 y9 A$ J6 e$ G m% z xstyle = xlwt.XFStyle() # 实例化表格样式对象2 d/ j1 r( \$ O5 ^/ R
xstyle.alignment.horz = 0x02 # 字体居中' f! E/ b1 K4 Q( ]8 n2 M
xstyle.alignment.vert = 0x01 # 字体居中) Y1 C4 }" @0 `' m, |& G/ J% f$ W
head = ['视频名', 'up主','排名', '热度','播放量','评论数'] # 表头# M( `* |+ r4 c E: H7 }# X7 }
for h in range(len(head)):/ @! o( [8 i' W3 p Q2 Z
sheet.write(0, h, head[h],xstyle) # 把表头写到Excel里面去 H8 ^2 T+ ]/ ]; x
i = 1$ ^8 y! E; Q% B0 {$ M; o
for item in video_list:, x6 n! I5 I* z6 U; K8 ^
# 向单元格(视频名)添加(该视频的)超链接4 | ]$ e# N) H! e- @* }0 h5 Y
title_data = 'HYPERLINK("'+item["videolink"]+'";"'+item["title"]+'")' # 设置超链接. N$ o$ w( Q+ t$ D
sheet.col(0).width = int(256 * len(title_data) * 3/5) # 设置列宽$ |" ?, q8 q9 y$ |- T+ X/ Z
sheet.write(i, 0, xlwt.Formula(title_data), xstyle)
9 ?. Q& i- S- A# @ name_data = 'HYPERLINK("' + item["uplink"] + '";"' + item["upname"] + '")' # 设置超链接
% Y% X4 B$ h8 x( ]3 { sheet.col(1).width = int(256 * len(title_data) * 3 / 10)
a/ @8 o; s7 T$ f8 W# m sheet.write(i, 1, xlwt.Formula(name_data), xstyle)
$ l Z3 F, k+ U sheet.write(i, 2, item['rank'], xstyle)) @$ [1 u# k8 c2 U# s
sheet.write(i, 3, item['hot'], xstyle)
- f7 U2 r5 Z/ @; _# n sheet.write(i, 4, item['play'], xstyle): |! O( ?- O+ B
sheet.write(i, 5, item['comment'], xstyle)8 i: x" O. }& }
i += 1& ^, S; D, F; E$ I) x
# 如果文件存在,则将其删除
. q, Z0 c+ [' ]# B if os.path.exists('D:/Test/b站热门视频信息.xls'):
* [4 L# Q. G& U' J# ]! w os.remove('D:/Test/b站热门视频信息.xls')4 |0 M- D a# ^* r+ C K
workbook.save('D:/Test/b站热门视频信息.xls')& _# l+ d- O0 h/ Z+ f8 ?
print('写入excel成功'), H0 o8 F5 ]! r m6 ]/ f" ~# k
print("文件位置:D:/Test/b站热门视频信息.xls")
+ u: r! M/ \" c
/ V( t( Y1 c/ ^9 Y0 V$ ]( G5 N
- b3 G& o" C& X0 k4.在入口main中调用上面两个函数) m9 J. V- l; o) K9 v x* A
完整代码如下:
5 W4 H) q( p5 f& Kimport requests; S4 P+ H% A4 b% g' `
from lxml import html: n' B% O0 a2 }7 }- N
import xlwt0 w! u, Y- d$ J- V8 |) M$ E
import os$ o+ @( m; Z' R. E5 e
% o' i) |1 ~8 H9 N6 I# 爬取b站热门视频信息( t V7 a+ U# {
def spider(video_list):
! J! {& a/ c8 N) \4 v url = 'https://www.bilibili.com/ranking?spm_id_from=333.851.b_7072696d61727950616765546162.3'7 \% a6 h! y( X/ x1 {) |8 q/ q- O- g
html_data = requests.get(url).text- C' j: T8 @; Q$ p$ ~
selector = html.fromstring(html_data)6 B1 k ^3 s& ^$ R% z' I9 W G
infolist = selector.xpath('//li[@class="rank-item"]')
m) @+ g6 U& |) M1 q3 o" X for item in infolist:4 o7 Q6 E5 o/ @9 {9 P
rank = "".join(item.xpath('./div[@class="num"]/text()'))
- Q; k2 ]7 H# S `2 V/ C( P videolink = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/@href'))
, d( h) f) G% x3 Q1 ~( a7 d2 ^ title = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/text()'))
1 |) Q' K/ U8 ] playinfo = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/span/text()')).split("万")# X+ p7 g4 H3 t( X% f7 v
play = playinfo[0] + "万"
6 v! n6 ^$ q. x8 G ^5 H comment = playinfo[1]
6 E8 p( w" r, P. h: l4 C if comment.isdigit() == False:+ b8 Q! D5 t4 Y+ Q1 \
comment += "万"5 E5 c; o1 r& G, J' p" P* J: M
upname = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/span/text()'))) l# u# B( T# o3 V1 o- E
uplink = "http:" + "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/@href'))$ Z+ \( v: r! A! y6 L
hot = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="pts"]/div/text()'))1 p& I) T0 \# Q. K
video_list.append({
& J0 C7 a: X% P- M. |2 o 'rank': rank,6 C# C) d6 F+ @5 g: z
'videolink': videolink,5 ` {8 l/ a6 l1 v: J
'title': title,- N: I6 X% t5 S7 H. C3 W7 \
'play': play,5 J( G. ]8 @, o9 y
'comment': comment,/ b5 q) r* O! D0 W
'upname': upname,
j% s, k3 Q: }, n, g [; e& ^ 'uplink': uplink,
# S1 J2 _. B. i) K7 l 'hot': hot
' r6 j7 `' w; W })
! R' Y, x( K& L% c7 _/ c5 j9 S return video_list+ G2 R1 R/ d3 L" R. e9 k
6 q4 b% e. i' p7 L9 A% {: K
# 将爬取到的数据写入Excel表格 `- _' z/ F0 W
def write_Excel(video_list):
! Y ~- X% x0 w' {! K7 G print("将b站热门视频信息导入到Excel表格:"). v! l. y5 x4 h3 J
workbook = xlwt.Workbook() # 定义workbook
$ I2 K# g2 L* P# G9 W: ] sheet = workbook.add_sheet('b站热门视频') # 添加sheet
! t5 R4 Q0 F9 m1 W! h1 N$ @0 P xstyle = xlwt.XFStyle() # 实例化表格样式对象
6 Q1 ~8 i( g: O7 C3 }5 C xstyle.alignment.horz = 0x02 # 字体居中" I( ?6 t$ j# s: j+ @
xstyle.alignment.vert = 0x01 # 字体居中9 N- _ [/ A J% Z2 v
head = ['视频名', 'up主','排名', '热度','播放量','评论数'] # 表头
7 ]+ p6 {6 H' j for h in range(len(head)):, S* ~! X+ |0 G
sheet.write(0, h, head[h],xstyle) # 把表头写到Excel里面去' M! F" C* t8 Q7 `; e3 I
i = 1
1 e/ q$ }4 `7 o4 p6 u2 W$ u for item in video_list:) Q; T& c/ b, W& }) a* @% g
# 向单元格(视频名)添加(该视频的)超链接
% |; D9 ?$ { M5 K0 [! x title_data = 'HYPERLINK("'+item["videolink"]+'";"'+item["title"]+'")' # 设置超链接; z; ~8 D0 }4 D& q/ b& u- y6 r0 J% y
sheet.col(0).width = int(256 * len(title_data) * 3/5) # 设置列宽3 B0 m& a; s1 M: Y3 w
sheet.write(i, 0, xlwt.Formula(title_data), xstyle): s a3 d5 k5 |5 X; O z, O
name_data = 'HYPERLINK("' + item["uplink"] + '";"' + item["upname"] + '")' # 设置超链接: A4 D% A* i5 D6 G$ r
sheet.col(1).width = int(256 * len(title_data) * 3 / 10)
" a) ]- }& m" |/ |! ~( d3 { sheet.write(i, 1, xlwt.Formula(name_data), xstyle)
. f( C) p8 |8 n- h0 m5 {5 g/ R sheet.write(i, 2, item['rank'], xstyle)
; m( P( Q6 C$ `2 W$ i sheet.write(i, 3, item['hot'], xstyle)
# C/ f' o! G0 s' ]: X( _ sheet.write(i, 4, item['play'], xstyle)
' L' Z! ?+ i6 M- v sheet.write(i, 5, item['comment'], xstyle)
0 O4 T& L+ e/ Z* n5 L i += 19 y* \) k. Q) S- M" H" O
# 如果文件存在,则将其删除" n8 Y: c% D2 H K3 v
if os.path.exists('D:/Test/b站热门视频信息.xls'):
. B# ^1 z( i# N) F$ t os.remove('D:/Test/b站热门视频信息.xls'); X/ a# q* f* A& R C
workbook.save('D:/Test/b站热门视频信息.xls')+ J1 Q6 `8 A- W
print('写入excel成功')
, v7 d8 x4 \: ?; r print("文件位置:D:/Test/b站热门视频信息.xls")6 `: J( o* h% N% J
0 j3 ~0 D: c: N% {+ `( |' Oif __name__ == '__main__':7 O/ }$ R& a$ f& F
video_list = []
! R9 v3 C. S+ ^( u& D write_Excel(spider(video_list))
( S3 V/ Q# f: n) a( i. [* U+ c6 I v
+ Y. S, J4 l6 _' C7 p
* \) [/ _4 o% U0 E: @ D$ e' Z6 D9 r! m9 x
4 D! F7 m; L C9 T( o, ~" { |
zan
|