- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 563413 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 174247
- 相册
- 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表格, m- `8 W2 D1 E0 O- m9 M3 X3 \
效果图:; K1 ]) { X. Z) ^! @: h
5 I$ }, g+ l: z4 J5 c
1.工先利其事必先利器,首先我们得下载相应的库:
0 @/ S5 q5 H; k2 K# D9 K2 wpip install requests- k8 e. l: P D A
pip install lxml% ?, s1 G) D* |# G* M6 [3 l" B
pip install xlwt
" m" x( P7 ~- y+ W* p
; k0 k$ k$ M' o, s/ T% T" l6 n, M5 |7 E
requests 向网页发送请求
9 {* t1 I' _. K7 L& {lxml 处理xml文件(xpath)
6 D$ l3 q/ F5 ixlwt 对Excel做写入操作
; v* j9 i4 q" N' V! Y/ o9 t6 r2.爬取b站热门视频的信息:
" W9 H2 j$ T$ R! n# S6 ? 打开b站热门视频页面: K* `5 q# N0 ?* d4 ?: U
6 `* S/ h1 q# J7 w" s/ M" v, v! z: a
按f12进入开发者选项,然后点击选中你要获取的页面信息,即可找到该信息在该HTML文件中的什么位置(这对我们用xpath获取元素属性和元素值很重要),例如:# c3 U9 n+ Z( b$ f
5 |3 e( W# w4 _) I5 J8 F. c$ m& T
代码如下:
0 X# N& z6 C0 m. B" \! g3 {% }# 爬取b站热门视频信息
' t4 p9 `$ g" z: }2 ]def spider(video_list):
! F9 E/ X3 {' T url = 'https://www.bilibili.com/ranking?spm_id_from=333.851.b_7072696d61727950616765546162.3'
) I* x* `4 a/ D% c1 [6 b5 o$ [5 } html_data = requests.get(url).text" d5 Q9 z) O3 _: ?" U
selector = html.fromstring(html_data)
6 P) C2 C+ t! w% V infolist = selector.xpath('//li[@class="rank-item"]')
- T7 j+ G0 x- z( [ for item in infolist:
* G5 a+ L( |) q7 ~$ H rank = "".join(item.xpath('./div[@class="num"]/text()'))
O3 d4 X z+ r, B0 m# Q1 v7 d videolink = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/@href'))
, j+ k0 o7 f x8 s/ B, Z6 [ title = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/text()'))
: K$ U6 `7 Y; B6 Y6 A, { playinfo = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/span/text()')).split("万")
6 D- h. [) I1 W* X9 r# y, B! ~ play = playinfo[0] + "万". h5 }7 k' s1 `. X# Y# H
comment = playinfo[1]
. N) P% z% X+ G" V5 N/ R if comment.isdigit() == False:8 Z4 A1 e( m& F& i5 H# p
comment += "万"
, a# N1 G" S' M upname = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/span/text()'))
8 s1 @4 ~! V/ C uplink = "http:" + "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/@href'))
3 @/ Q7 U( p9 ~ hot = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="pts"]/div/text()'))
0 y/ @/ X# _- p' g video_list.append({
; L+ @; x; n) T* E 'rank': rank,2 g2 T! s5 t5 _$ V$ H' i
'videolink': videolink,/ y; j5 h" W* Q& {' n' c( B" [" N
'title': title,
( h0 R" U! A# u 'play': play,
/ v3 `: Y5 }) x# G! m2 L 'comment': comment,: h2 }- _+ _* N
'upname': upname,
# Y5 `0 y1 f; V& C 'uplink': uplink,- h- ~5 s' z; `
'hot': hot
W9 U8 y H8 t2 b" j" m; K })
4 n; Z4 f' J, \& V/ y$ M7 i3 [ return video_list2 ~8 ]1 A2 C8 ~1 ~0 Q3 ~8 j( ?& `
+ m4 h, `9 M# V$ B
$ |+ d; I5 }3 G8 {: Q6 Y3.将我们拿到的信息集合(video_list)写入到Excel表格中:
% @" w& R" W; O, e+ Y7 @ xlwt的基本使用方法:. @" ]; V# ^8 F0 A' U4 A
import xlwt- E2 p5 E9 }- E! P1 _% S
# 创建一个workbook (并设置编码)/ _2 c8 {7 I# K% A" d' @0 Y! Q
workbook = xlwt.Workbook(encoding = 'utf-8')4 p1 z/ k- \! w8 _8 O
# 创建一个worksheet& G4 e5 X3 t) z8 {. o* C( V0 o
worksheet = workbook.add_sheet('My Worksheet')
& x8 m: Z) U$ y. x R& {8 l+ X5 I# W8 j& r0 l) f4 M
# 写入excel
' L4 e- o6 W8 Z+ p. d# 参数对应 行, 列, 值,(格式)
" {( I0 j. f4 z- T% `8 h z, ]) S" iworksheet.write(1,0, label = 'this is test')
2 I* Y/ S( C- P2 s6 @# 保存
4 }2 W8 W9 {( s+ d8 M( ~: Q#参数为你保存该Excel文件的路径" i @" y: n1 [# q: n$ L/ C) f
workbook.save('Excel_test.xls')
' m" k8 l, c0 d2 y
, e4 f5 B3 ~. ^. Y8 h8 B/ O: h: c" I$ `% }
如果我们想要点击视频名或者up的名字可以跳转,那么我们就要使用Excel表格的HYPERLINK方法:
# I! x8 h) ]6 ]6 L. p$ a/ {1 M/ ?: BHYPERLINK(“http://www.baidu.com” ; “百度”)
: }! {+ v5 X1 q" X1 E百度为显示在单元格的信息,而前面的链接为跳转链接。& ?. r7 _0 D6 O" Y. d. h9 ^
xlwt.Formula()方法需要传入一个字符串s,s=‘HYPERLINK(“http://www.baidu.com” ; “百度”)’。4 U Y3 y9 k8 R1 o3 Q
代码如下:/ Y) k$ o. p& Z9 G, k( ]3 d9 [
# 将爬取到的数据写入Excel表格7 {# c# b8 _+ I& k0 N W4 ^% u
def write_Excel(video_list):
4 r( w) U) v" U& T4 [, R print("将b站热门视频信息导入到Excel表格:")
6 x' {5 b F, W1 o) j workbook = xlwt.Workbook() # 定义workbook8 W' S$ ~, D# r+ X* U0 F
sheet = workbook.add_sheet('b站热门视频') # 添加sheet! S6 V4 L+ m+ l8 y* n
xstyle = xlwt.XFStyle() # 实例化表格样式对象% U% ` r1 v; u2 r1 d
xstyle.alignment.horz = 0x02 # 字体居中
" i+ [; j* O! Y xstyle.alignment.vert = 0x01 # 字体居中 i5 \3 Z; b) ]3 x0 b: v
head = ['视频名', 'up主','排名', '热度','播放量','评论数'] # 表头) e6 Q* ]# x/ ?* q D8 j
for h in range(len(head)):
. a- n1 H' O5 \* Y5 f sheet.write(0, h, head[h],xstyle) # 把表头写到Excel里面去/ T& A ^' S3 b- i) t) M& |( q
i = 1
7 {% M' M, E2 s3 m0 l9 [% T for item in video_list:
( V/ w( e4 d; i4 A; D( I # 向单元格(视频名)添加(该视频的)超链接 L/ F! [5 A' T- M" u1 i
title_data = 'HYPERLINK("'+item["videolink"]+'";"'+item["title"]+'")' # 设置超链接
6 e& k' V4 k, @ y' |0 M sheet.col(0).width = int(256 * len(title_data) * 3/5) # 设置列宽- @- V* ]0 L7 M! \5 I# M& c* Q0 N
sheet.write(i, 0, xlwt.Formula(title_data), xstyle)
* h! S: t" g% } name_data = 'HYPERLINK("' + item["uplink"] + '";"' + item["upname"] + '")' # 设置超链接6 F" s; K, E3 x" b5 u+ ~
sheet.col(1).width = int(256 * len(title_data) * 3 / 10)
2 P b8 |5 E; i- J a, N sheet.write(i, 1, xlwt.Formula(name_data), xstyle)
9 i' Q9 m- f1 c- e2 c sheet.write(i, 2, item['rank'], xstyle)
; h2 ^5 l5 h9 b- s/ G+ K& k sheet.write(i, 3, item['hot'], xstyle)
* f2 O1 E: }3 o sheet.write(i, 4, item['play'], xstyle)/ m8 S8 g) e- A' H/ h0 w
sheet.write(i, 5, item['comment'], xstyle)# c! @3 l7 K& n
i += 1
. b3 S" x0 B8 U* x# T( j+ P- I # 如果文件存在,则将其删除
* V' ]4 i4 x# c0 | if os.path.exists('D:/Test/b站热门视频信息.xls'):. F8 v. Q& a+ b7 ^! S6 \7 R3 s
os.remove('D:/Test/b站热门视频信息.xls')
' k2 E M$ {. E4 ^2 m workbook.save('D:/Test/b站热门视频信息.xls')" a& u8 N; ?. N7 Z
print('写入excel成功')
) E4 ^+ d9 B: z. J5 U/ o print("文件位置:D:/Test/b站热门视频信息.xls")4 _5 J1 b! Q- ] E7 i* H
7 P4 f K! V9 U! @0 w7 Z. U
* u/ c% H6 D5 |- i" b5 {4 e
4.在入口main中调用上面两个函数* }: {$ F8 G- g" {
完整代码如下:4 L5 Z9 I6 t% X2 g1 t
import requests5 {4 G7 {6 ~" |1 {$ C7 z5 b- W8 a
from lxml import html
& V6 t+ S8 a7 Y! u" n) Oimport xlwt
) l' A* i% E! o5 wimport os
/ }2 L* ^! q, l0 `( P, i7 h9 H. d6 g3 ?, ~! V( \
# 爬取b站热门视频信息
! R W0 C y0 X; g. xdef spider(video_list): b! T0 s: _$ B
url = 'https://www.bilibili.com/ranking?spm_id_from=333.851.b_7072696d61727950616765546162.3'
3 K: ~5 P6 P, }# m D html_data = requests.get(url).text
7 n3 ]) |( _7 n6 i selector = html.fromstring(html_data), `/ o8 \ ?0 i* K' P& \, K
infolist = selector.xpath('//li[@class="rank-item"]')
- H7 }" f* K5 L7 _1 v. r for item in infolist:* H5 u# x/ \4 s% N& C% g0 N' Y' q
rank = "".join(item.xpath('./div[@class="num"]/text()'))/ a( j1 O" I' U' l
videolink = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/@href'))! v+ z6 @' T; g0 F' `3 M+ P4 r
title = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/text()'))$ A& D O. l" y6 [
playinfo = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/span/text()')).split("万")- J5 C) f( H0 A, U
play = playinfo[0] + "万"
; V% l, [( c' ^1 [- s comment = playinfo[1]
, d v1 o1 e7 y" s if comment.isdigit() == False:1 x. h6 P& n7 x2 Y. v/ @% J
comment += "万"; M* n a& ^6 n
upname = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/span/text()'))' q" t3 Y" V4 ]5 U) u
uplink = "http:" + "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/@href'))( R$ i1 J$ J3 k# Q
hot = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="pts"]/div/text()'))
* Q3 M- h/ Q- v# m9 j) W' D' E: o video_list.append({9 ?) ~0 I. I/ j( Q' m9 k
'rank': rank,' B/ Q3 g" {- \
'videolink': videolink,' x |4 [' p* w) r- c
'title': title,3 K; s: G K, e/ T
'play': play,% w1 H6 E' F9 A7 B1 ^
'comment': comment,6 o& E5 W' C3 ^7 c% D1 f
'upname': upname,% Y. K2 h, b( R! o
'uplink': uplink,
, A- Y! F& S/ S* x 'hot': hot; C5 L' }! G( {6 ^
})
/ K7 S2 _ q! d! n% g return video_list
! T% i0 [) i$ G2 m9 I S
9 `) x# o' b* ]$ \2 D, \# 将爬取到的数据写入Excel表格. {2 l# \+ V2 c0 E
def write_Excel(video_list):, E# }/ z C1 X5 r
print("将b站热门视频信息导入到Excel表格:"), D' @" k' z1 p
workbook = xlwt.Workbook() # 定义workbook! e& V6 j, f$ Y$ {0 ^, m' T
sheet = workbook.add_sheet('b站热门视频') # 添加sheet8 x8 U/ i3 d6 n, V# h# i
xstyle = xlwt.XFStyle() # 实例化表格样式对象
( u2 U& d, A5 h1 D3 Z3 y: b xstyle.alignment.horz = 0x02 # 字体居中3 @, X7 C/ V) m" |. P: A4 n
xstyle.alignment.vert = 0x01 # 字体居中( b+ j. q1 b8 K1 F' {
head = ['视频名', 'up主','排名', '热度','播放量','评论数'] # 表头7 k7 H3 ]8 ~0 p! M+ o3 e1 N
for h in range(len(head)):
9 W/ d, G$ W" G, u# g sheet.write(0, h, head[h],xstyle) # 把表头写到Excel里面去4 o3 _6 P5 O, o( v
i = 1& n& \- K, r# Q2 d) Z
for item in video_list:+ Q3 w# w) I7 O, F4 B& D
# 向单元格(视频名)添加(该视频的)超链接9 h* m9 j! S& F: z8 l, x$ E
title_data = 'HYPERLINK("'+item["videolink"]+'";"'+item["title"]+'")' # 设置超链接
; i# c* H! ]- r+ P- W4 i sheet.col(0).width = int(256 * len(title_data) * 3/5) # 设置列宽
: V+ E4 K$ O2 v/ n sheet.write(i, 0, xlwt.Formula(title_data), xstyle)+ |% `" O+ M* m4 U# I( z. e- ]
name_data = 'HYPERLINK("' + item["uplink"] + '";"' + item["upname"] + '")' # 设置超链接4 {5 L6 M& n/ {+ m6 [
sheet.col(1).width = int(256 * len(title_data) * 3 / 10)
' w0 q9 }9 z# `* ~ sheet.write(i, 1, xlwt.Formula(name_data), xstyle)2 V( D: i6 R, w& w. T8 j
sheet.write(i, 2, item['rank'], xstyle)
# w$ e3 p! @' R- s2 y sheet.write(i, 3, item['hot'], xstyle)4 X* W- o6 Z" M% i- n$ z
sheet.write(i, 4, item['play'], xstyle)) ]$ m+ i6 e/ e1 K3 A
sheet.write(i, 5, item['comment'], xstyle)1 y! I+ W1 u' z4 {4 K1 S
i += 1
9 C2 }5 s. V2 p! W( y$ e # 如果文件存在,则将其删除
; a) V, c+ j; M3 _% n# O4 L& u if os.path.exists('D:/Test/b站热门视频信息.xls'):' O3 P* Z$ h2 l* ^
os.remove('D:/Test/b站热门视频信息.xls')8 q1 B8 i) m: X) |0 u/ c* x) ?
workbook.save('D:/Test/b站热门视频信息.xls')9 s; b- T- _; z
print('写入excel成功')* t. y. u- M5 Y2 z7 c
print("文件位置:D:/Test/b站热门视频信息.xls")
/ X: M# T; P1 f; t
% m( i' c* h6 _, ~& aif __name__ == '__main__':+ G4 L# u$ c9 h7 S; i$ \
video_list = []
9 t6 T/ ?6 Z: ] ^5 y3 ]: ~ write_Excel(spider(video_list))
" A2 V2 r/ G- j/ `7 P8 t' k, m# ^7 B) z/ k% K- v
* _: r! w6 G! A* t0 u! ~9 P
# q. u3 ^2 k3 x2 n& @; f5 K6 f, n+ h7 v2 ?- A
6 Y3 J; K1 Z5 a" g" A! g* w1 j
|
zan
|