- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 563376 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 174236
- 相册
- 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 h# r4 ~/ e b+ e T2 Z9 q V* i9 M, V& I效果图:
- u* Y9 N6 l* V9 z
5 t4 U$ U! |, \
1.工先利其事必先利器,首先我们得下载相应的库:
3 o0 U( X' \5 I+ s" l+ {4 z2 Lpip install requests) L" d' C- L' @# a( t
pip install lxml
2 E; Z$ f5 C9 ~1 U0 \; p% Wpip install xlwt
1 B1 M: u3 N. q" ]6 g) x- v# e G+ u! A
2 c" E8 ~+ V: p5 i4 Z- Rrequests 向网页发送请求, D. \' A2 R4 N( p4 H
lxml 处理xml文件(xpath)
9 r+ U) ^/ S3 o3 x* B) A6 cxlwt 对Excel做写入操作
# c. D9 x4 Z. d4 w, o1 [2 i2.爬取b站热门视频的信息:
5 ~4 F. d J5 Q s 打开b站热门视频页面: B6 m+ m. R1 ?3 n! P4 x: K, b
y, y1 f/ Y4 O4 h6 n7 j 按f12进入开发者选项,然后点击选中你要获取的页面信息,即可找到该信息在该HTML文件中的什么位置(这对我们用xpath获取元素属性和元素值很重要),例如:
3 U- u1 C' G0 [; S1 m' O( t! Y
5 p% D, F4 Y7 ]9 t; f; Q/ j代码如下:- F4 L6 \( N. R9 \3 c2 i6 B
# 爬取b站热门视频信息
! q Y/ Z) }; [& o# h4 N( Idef spider(video_list):) e" N( C9 x: ~- _# C! c
url = 'https://www.bilibili.com/ranking?spm_id_from=333.851.b_7072696d61727950616765546162.3'
- j5 v2 C+ j2 |5 z2 U html_data = requests.get(url).text4 G! E! m, ^& t& _! s! x Q
selector = html.fromstring(html_data)
1 e4 C7 V, m( w! \8 @3 B infolist = selector.xpath('//li[@class="rank-item"]'): L& O+ P2 X+ }
for item in infolist:
+ Q8 E* F% f6 C0 g rank = "".join(item.xpath('./div[@class="num"]/text()'))
1 j: Z* s% ?( `% C: V9 a* V videolink = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/@href'))
/ E" o/ H) U" d9 x/ H title = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/text()'))' g, R# Z5 B3 L0 A3 l. y
playinfo = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/span/text()')).split("万")
& ]% W; X7 D8 P7 J, N& o play = playinfo[0] + "万", C8 V( Z0 R% L! |
comment = playinfo[1]
1 s/ m" J; v1 O if comment.isdigit() == False:; c- i# ?8 b2 h1 \: i
comment += "万"5 H# R6 |! C1 H. k
upname = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/span/text()'))' w& ~3 R! t0 v
uplink = "http:" + "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/@href'))
8 p$ f7 x* F3 b) A1 E& q hot = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="pts"]/div/text()'))
3 E2 q& [9 ]3 l! ]% ^1 t4 H video_list.append({* f* b4 r' n& h7 r$ L. e, ^* ~
'rank': rank,2 p3 V. W( Z5 I$ } I# }( k
'videolink': videolink,5 F( @4 w* \$ J/ T. M8 p$ N
'title': title,
& I! o; ]1 t7 [0 n- [, g 'play': play,* ?0 `: j2 i) B, Q2 Q
'comment': comment,
$ z8 e" v- w# p3 l* z 'upname': upname,
; E" G( H a& T5 G& K& M% c 'uplink': uplink,( G* _' G9 \: s9 P1 A
'hot': hot
" u5 u) G9 S9 T$ ?1 } })
; T: ?: M0 n: C5 m& b2 @& l return video_list
9 V1 ]6 U1 M8 d
/ m. K* K; z- @, ^0 \9 ]0 U/ q' T: c. i0 w& M5 {
3.将我们拿到的信息集合(video_list)写入到Excel表格中:2 g6 a! ]) h4 o
xlwt的基本使用方法:/ v# b2 A0 [& O z+ Q- f
import xlwt
Q! g% [7 I5 l8 ~; R# 创建一个workbook (并设置编码)
: J/ k t9 E2 G1 y2 |& p% U$ h4 `$ iworkbook = xlwt.Workbook(encoding = 'utf-8')
* ?' {3 C) W) p. D2 h# 创建一个worksheet3 n6 L+ B, q9 x
worksheet = workbook.add_sheet('My Worksheet')
, S# v L' a5 X" S7 N8 T; |6 X% o7 E4 k& t- r' u1 n
# 写入excel+ I2 K9 J. ]( I9 f! e6 ^, ]5 Z/ _ |
# 参数对应 行, 列, 值,(格式)
2 x: T# m6 ~- k' Y' p+ p" r( Gworksheet.write(1,0, label = 'this is test')( [$ F" {% b9 w: x5 a% w7 ~ A, \
# 保存6 {1 m+ y) |# }. l/ O' K# `* u4 v
#参数为你保存该Excel文件的路径
; ~( n H- |( q& `5 Z& K/ e& I" Kworkbook.save('Excel_test.xls')
4 a3 r$ }/ S2 z( E' @% Y4 j/ k0 L, \% b- z1 V! o
" U, S5 B: K+ Y4 g# p0 B& D" _
如果我们想要点击视频名或者up的名字可以跳转,那么我们就要使用Excel表格的HYPERLINK方法:' _, Z5 P) S* _/ r5 n- N- V5 l
HYPERLINK(“http://www.baidu.com” ; “百度”)' T* h. I! \* U6 G# d+ Z
百度为显示在单元格的信息,而前面的链接为跳转链接。 A& i! e: L4 m+ d6 a. ]6 z/ d$ y
xlwt.Formula()方法需要传入一个字符串s,s=‘HYPERLINK(“http://www.baidu.com” ; “百度”)’。; {0 u* U; Y. q: I8 F/ |
代码如下:
3 d* D z0 A' T3 _, L# H/ Q# 将爬取到的数据写入Excel表格8 ?! @. b {! ?6 |
def write_Excel(video_list):
% |5 W+ x9 C2 f% i print("将b站热门视频信息导入到Excel表格:")4 ]4 ~, R; t: b
workbook = xlwt.Workbook() # 定义workbook. S; o2 H* E+ r0 j7 Q4 }
sheet = workbook.add_sheet('b站热门视频') # 添加sheet% ]9 n, c& K. T% T1 D$ R
xstyle = xlwt.XFStyle() # 实例化表格样式对象& I* x. c! y; m: b, Y8 f
xstyle.alignment.horz = 0x02 # 字体居中; p+ X) N; [/ Z" X& i+ k* d, Y
xstyle.alignment.vert = 0x01 # 字体居中
" j: Q8 s) L' Q1 _! w1 ]/ k head = ['视频名', 'up主','排名', '热度','播放量','评论数'] # 表头
. Y! @6 y/ c- {9 l& Z. w for h in range(len(head)):
( J+ b+ |" L0 x* G, Z! D5 @% t5 B sheet.write(0, h, head[h],xstyle) # 把表头写到Excel里面去
9 n; D& b0 o. w i = 1: m8 Z5 ]0 t6 U0 `) R. z
for item in video_list:
, f0 q8 f2 p+ o$ l3 f8 @, r # 向单元格(视频名)添加(该视频的)超链接. s- |! l/ ^; ~0 n* |
title_data = 'HYPERLINK("'+item["videolink"]+'";"'+item["title"]+'")' # 设置超链接
" x4 l* }. ]" ?+ r8 G sheet.col(0).width = int(256 * len(title_data) * 3/5) # 设置列宽) ~' r" j; Y( K" F7 @' u4 Y
sheet.write(i, 0, xlwt.Formula(title_data), xstyle)1 K9 i* J/ P) R3 t/ Q
name_data = 'HYPERLINK("' + item["uplink"] + '";"' + item["upname"] + '")' # 设置超链接
) t8 ~8 F2 X* H sheet.col(1).width = int(256 * len(title_data) * 3 / 10)
! F3 D2 R* u- M+ r sheet.write(i, 1, xlwt.Formula(name_data), xstyle)7 U2 A9 P! |4 K
sheet.write(i, 2, item['rank'], xstyle)
' W, y2 \' J3 n! j sheet.write(i, 3, item['hot'], xstyle)" ]8 f% ^. c# h v% b- M% D
sheet.write(i, 4, item['play'], xstyle)
4 r: R5 C0 T; ~ sheet.write(i, 5, item['comment'], xstyle)$ Y2 K7 E2 A3 O1 ?9 e6 O' y
i += 1& E7 \% {2 l3 ~; W% l+ [& |: Y
# 如果文件存在,则将其删除
& p2 m( u" F$ | if os.path.exists('D:/Test/b站热门视频信息.xls'):
/ P. t7 C/ g/ P1 q( E3 p os.remove('D:/Test/b站热门视频信息.xls')+ I# X) X, g0 t# f" ~; ?
workbook.save('D:/Test/b站热门视频信息.xls')
: Z! m' R9 |; l/ h# O& f5 F- P5 v1 I print('写入excel成功')) w9 z+ |' n E5 g' A
print("文件位置:D:/Test/b站热门视频信息.xls")5 J$ D4 ]( V0 o9 b8 M
6 H3 L, n9 o! G. K! } A! G: i- @3 f9 k. f! N
4.在入口main中调用上面两个函数
( R* ^% Q& S! A1 ~: i完整代码如下:
( m4 |! f% D# \: ]import requests
1 L$ v8 ] ?5 e* Tfrom lxml import html. J# u4 V8 i; }8 d
import xlwt3 Z2 [. G z; ^6 ]3 W) V# L; G& k8 y
import os
8 s+ G5 @5 }* `! o, I' y0 F- J" {) l$ v% Y, W) u2 @
# 爬取b站热门视频信息0 h7 w: j1 I7 O" i
def spider(video_list): Y9 q5 s9 w9 d, w" {4 L( u
url = 'https://www.bilibili.com/ranking?spm_id_from=333.851.b_7072696d61727950616765546162.3'% e4 {6 G K" ]3 K' g( J( [1 c
html_data = requests.get(url).text g$ Z/ G* _+ @+ n( c
selector = html.fromstring(html_data)
. x: X7 N, t3 M H: w infolist = selector.xpath('//li[@class="rank-item"]')
4 b( g, [( K; R9 Z4 O7 o! b7 ` for item in infolist:: ]' u0 w: i4 G
rank = "".join(item.xpath('./div[@class="num"]/text()'))
d2 @+ |; `9 k$ Z& E, q; O videolink = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/@href')). e# ~& F; e9 a; e0 `0 p- u
title = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/text()'))9 E' K2 e2 E' {9 g$ u8 p
playinfo = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/span/text()')).split("万")3 u- ?4 ^# |: M
play = playinfo[0] + "万"
! z7 Z; M+ ?3 }; x( |, R8 N& C( u comment = playinfo[1]1 ~/ e( X2 h1 Y }+ m# w
if comment.isdigit() == False:* `2 T6 Y6 X, P+ t g" }
comment += "万"# _( K. Y) M. W& T$ y3 D
upname = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/span/text()'))0 C Z$ i9 b5 h
uplink = "http:" + "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/@href'))9 ?' W: u9 v9 l% ?" N) [/ \
hot = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="pts"]/div/text()'))+ r% z. c7 F2 w7 Y* [. m$ v
video_list.append({
8 l ~: |5 l6 h4 p d 'rank': rank,
4 M1 Q* q# e7 Z* ]6 Q. Q' d `; H 'videolink': videolink,
, u( j; F' F* E1 ?6 y 'title': title,
7 e: q6 {9 Y/ { 'play': play,9 e; d1 @ \# B! w$ [) X4 b
'comment': comment,
- w! F7 S/ a; \: c; q( \1 O6 R5 h 'upname': upname,
2 r+ ?' l! j0 T* L9 ^; t 'uplink': uplink, Z& [$ r% P# M+ P$ B1 z
'hot': hot4 ^6 F9 w- w1 \$ E! J$ A
})
/ w+ {; g7 U8 _$ |' @ return video_list
i ]& w& p. q5 G, { C# `5 k% {' i
# 将爬取到的数据写入Excel表格
7 K, g+ o, ]% G; y) G$ Ndef write_Excel(video_list):/ {8 g- v3 r# m: F& r
print("将b站热门视频信息导入到Excel表格:")
3 e* H0 w# H: `' y/ ^ workbook = xlwt.Workbook() # 定义workbook
$ v% a# c' l+ b& ?8 y4 t sheet = workbook.add_sheet('b站热门视频') # 添加sheet
) I& R8 e4 ]' p0 B+ ]5 O7 t xstyle = xlwt.XFStyle() # 实例化表格样式对象& L+ e+ R& X* ]4 r* V
xstyle.alignment.horz = 0x02 # 字体居中/ t% z' O5 p1 g& b1 C
xstyle.alignment.vert = 0x01 # 字体居中4 U! f1 @0 X; y& k% p' B+ v
head = ['视频名', 'up主','排名', '热度','播放量','评论数'] # 表头
6 S3 S7 f/ S. [( S, _ for h in range(len(head)):3 S6 k9 u( ]; r+ R3 A
sheet.write(0, h, head[h],xstyle) # 把表头写到Excel里面去
$ i$ o1 t( }1 T% Q# _ i = 1
; v4 Y: J+ S8 v; n* B- J. t Q for item in video_list:. a$ {* U$ j% n& ]9 |; Y
# 向单元格(视频名)添加(该视频的)超链接
' `" e$ D. Q9 _4 {, W title_data = 'HYPERLINK("'+item["videolink"]+'";"'+item["title"]+'")' # 设置超链接' H9 B j% \6 g* b5 r
sheet.col(0).width = int(256 * len(title_data) * 3/5) # 设置列宽2 a @2 s* o- F0 o& f
sheet.write(i, 0, xlwt.Formula(title_data), xstyle)
$ |- J4 X8 o) y: w' x3 [3 G name_data = 'HYPERLINK("' + item["uplink"] + '";"' + item["upname"] + '")' # 设置超链接
* p0 \6 v3 D& h5 O! } sheet.col(1).width = int(256 * len(title_data) * 3 / 10)
. B4 p" X2 ?; i7 F. j" ?' o# J+ i$ E sheet.write(i, 1, xlwt.Formula(name_data), xstyle), b; e# k9 j6 b/ H+ E( y
sheet.write(i, 2, item['rank'], xstyle)
( k, R. A; P6 \" b) Y* C sheet.write(i, 3, item['hot'], xstyle)
+ k I. j. q8 A- a6 R" y1 F) v' Y8 x sheet.write(i, 4, item['play'], xstyle)
6 |1 j* r. A* I/ Y% F1 W* F sheet.write(i, 5, item['comment'], xstyle) M) u) @6 c( J+ N {
i += 18 z9 i8 X9 [& Y6 l" D. F& }/ |( I2 \
# 如果文件存在,则将其删除! F) H6 }- J! `2 z" Q
if os.path.exists('D:/Test/b站热门视频信息.xls'):
, i, E' x6 ?% o' D. B- b. l os.remove('D:/Test/b站热门视频信息.xls')( x; r' b7 @# K- v
workbook.save('D:/Test/b站热门视频信息.xls')( L: y7 V) W) W- j6 |6 F! b
print('写入excel成功')7 s2 X. }( t8 R8 E8 J% |4 @7 q
print("文件位置:D:/Test/b站热门视频信息.xls")
& d; ]( r( Z. R3 Y& ?% U& t5 e" o# J+ Q" v2 Y
if __name__ == '__main__':* `6 F: S% G, \2 ~1 _
video_list = []
- ?' P# r& q% K1 O( B8 H write_Excel(spider(video_list))
1 n( k- _8 V/ }! g# r6 |2 j2 S$ l; r" n; w
: v4 j7 k# U9 v* U9 H
! |. o3 Z/ L3 s
0 V F e+ z2 T2 z1 T
" T: K7 z3 M/ `
|
zan
|