- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 564561 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 174591
- 相册
- 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表格
; }8 @' A5 T& r2 H3 p2 x+ p效果图:: N: @1 O3 `* ~& E3 @
/ F* k q5 M4 A: R
1.工先利其事必先利器,首先我们得下载相应的库:- D6 y9 S5 O0 H0 U: O. R% i8 w% D
pip install requests5 t7 k4 }- O' q! ~) y
pip install lxml1 y4 }. b# }3 U5 G3 q L
pip install xlwt; C9 A3 \- r4 e4 e" N
+ ~ S7 x5 ?. p' s. U* F4 ~7 A9 K2 W. ^: C0 {5 x* B
requests 向网页发送请求
2 t5 `( ~# N8 O: }5 V3 c% o2 Hlxml 处理xml文件(xpath)
4 v" z- w$ ^ W7 \: zxlwt 对Excel做写入操作1 u+ c! `* E- G! K$ i2 M8 a
2.爬取b站热门视频的信息:8 M6 A c+ q( s% k1 B8 j
打开b站热门视频页面:! y+ C/ O9 @" Q4 t( b" f( ~
# T8 s g/ J0 H6 }0 J5 d: F1 ` 按f12进入开发者选项,然后点击选中你要获取的页面信息,即可找到该信息在该HTML文件中的什么位置(这对我们用xpath获取元素属性和元素值很重要),例如:
2 L2 p% }) {( N. U" g+ `: G
- g5 ~; c+ Q0 \2 k% w代码如下:' o8 B% M& y. W/ U$ M$ p
# 爬取b站热门视频信息
! |3 x2 T+ _( ^# J7 M0 p6 qdef spider(video_list):1 {- l. s2 b/ t" T/ ?6 A) G
url = 'https://www.bilibili.com/ranking?spm_id_from=333.851.b_7072696d61727950616765546162.3'
0 }0 m) ?4 i9 x9 R# A3 ~ html_data = requests.get(url).text
* ]$ K+ o; C, e: k selector = html.fromstring(html_data)
$ D! [9 |8 Q- D) s! Q infolist = selector.xpath('//li[@class="rank-item"]')
2 j7 H$ E$ C6 l6 w- Z* \+ y for item in infolist:
' s( O" ^9 o. O3 m! t rank = "".join(item.xpath('./div[@class="num"]/text()'))7 b1 F6 R2 M* [8 q2 @" i
videolink = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/@href'))/ g' d5 S. O' M5 G
title = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/text()'))
0 k+ x) z, {+ c" w; s playinfo = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/span/text()')).split("万")& x# T+ F$ \. Q: W2 V
play = playinfo[0] + "万"& L7 ^" J! D' U! B! m3 Q
comment = playinfo[1]. J" q* ?# ?/ J6 U& E4 u
if comment.isdigit() == False:. v( e: q! v) M
comment += "万"
0 e4 D6 O: ^" R upname = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/span/text()'))
C* y& M: T8 T0 b6 {5 @* ]7 s uplink = "http:" + "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/@href'))
- V% N6 s8 q+ F Z8 ?9 R6 |+ h hot = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="pts"]/div/text()')). ~2 L ~2 u/ ]
video_list.append({- z6 K! }; G" |/ \$ U" m
'rank': rank,
! b- ]. b m8 ]: f 'videolink': videolink,0 ?! l( d2 m( Y+ k- \- |9 F; o
'title': title,
* t/ P% M/ N" | ^5 h- Q | 'play': play,# D1 K1 l) F6 m4 i r) e$ k
'comment': comment,- Y, n9 i2 z2 O! p& F6 {
'upname': upname,
8 m+ {- e9 R# w# v' T, e 'uplink': uplink,* {3 d: W& {/ z9 O8 T
'hot': hot
6 y. I+ K; l2 b5 i# K8 k })
9 G- I9 U, _5 n8 T return video_list. U. z: V& {2 j; y( P: j/ @
4 A) N! j6 r: X5 H9 V3 F2 T' ^* }# W# L1 d: ]9 J
3.将我们拿到的信息集合(video_list)写入到Excel表格中:
& B$ D0 N2 S! [* I) c. X+ M) Z xlwt的基本使用方法:
- V8 m- F1 D( _9 G, |) z3 Aimport xlwt
: [1 j' F3 y0 _8 D* k# 创建一个workbook (并设置编码)
6 H: C; N- z+ |" E. lworkbook = xlwt.Workbook(encoding = 'utf-8')
) L& b3 ?3 S/ H6 k" ~5 K# 创建一个worksheet
% w5 C/ i/ \, u) U9 m" g1 n' u3 B/ Eworksheet = workbook.add_sheet('My Worksheet')
9 [7 u) @- M9 I3 |* m) I& K+ N) {7 @/ v
# 写入excel9 U- f- Q, `1 N2 [7 d7 S/ Y4 T
# 参数对应 行, 列, 值,(格式)
- [8 e, ~$ @, {$ k% pworksheet.write(1,0, label = 'this is test')
. W" n, _1 j1 r- V4 O+ ]# 保存
( {. x+ r' Q- |. f: F) @* Q#参数为你保存该Excel文件的路径( g; B7 I F* Q
workbook.save('Excel_test.xls')& e; q2 x: i. L1 p. b" N- u
, X3 s5 w, X& s t
. K$ t8 x" I" u
如果我们想要点击视频名或者up的名字可以跳转,那么我们就要使用Excel表格的HYPERLINK方法:. |$ P; V' i& f5 U
HYPERLINK(“http://www.baidu.com” ; “百度”)' D/ ]) J5 w/ O
百度为显示在单元格的信息,而前面的链接为跳转链接。
( m* c* }* W9 w+ X. U+ _* f6 gxlwt.Formula()方法需要传入一个字符串s,s=‘HYPERLINK(“http://www.baidu.com” ; “百度”)’。
' U+ e( k4 a6 _2 O1 y代码如下:- Z; u2 a& |- y; @! D3 |$ A: D4 d
# 将爬取到的数据写入Excel表格
. _$ Z2 Z9 [6 G: n8 L! l6 |$ tdef write_Excel(video_list):4 M# r* g! Y' e/ Y- L! l, u3 M
print("将b站热门视频信息导入到Excel表格:")
3 H, p1 E: _- A2 c6 C. t workbook = xlwt.Workbook() # 定义workbook
3 E/ x( j% T% u: W sheet = workbook.add_sheet('b站热门视频') # 添加sheet
( g1 z! ^) s5 c$ k/ c7 M2 @ xstyle = xlwt.XFStyle() # 实例化表格样式对象
( ?6 l1 b/ B; I7 `' i xstyle.alignment.horz = 0x02 # 字体居中4 d" D" X- ^; \2 j$ t8 w4 ~
xstyle.alignment.vert = 0x01 # 字体居中8 J: m+ U' Y# O9 b% l! L2 H
head = ['视频名', 'up主','排名', '热度','播放量','评论数'] # 表头
* P' |+ L& _6 j% u1 N/ b7 Z for h in range(len(head)):
( o0 v0 N1 o: V2 A7 A9 |! |1 d sheet.write(0, h, head[h],xstyle) # 把表头写到Excel里面去 D; c: Y& p5 J
i = 15 }0 F: L( n$ R7 g. K# n! _" ?
for item in video_list:
# `' @& z9 T# ~5 C # 向单元格(视频名)添加(该视频的)超链接
( E; \7 t- y. r3 W/ h title_data = 'HYPERLINK("'+item["videolink"]+'";"'+item["title"]+'")' # 设置超链接
# a/ W: U- f7 E7 W7 @7 c sheet.col(0).width = int(256 * len(title_data) * 3/5) # 设置列宽' y9 q8 [( @; l+ ]! ?5 f( R3 n& A
sheet.write(i, 0, xlwt.Formula(title_data), xstyle)
. |2 H a f' l9 {1 w& l/ d name_data = 'HYPERLINK("' + item["uplink"] + '";"' + item["upname"] + '")' # 设置超链接
. {1 i* Q4 B4 R& L9 q sheet.col(1).width = int(256 * len(title_data) * 3 / 10), B) X* w8 c, M. A* q! T/ @- ~
sheet.write(i, 1, xlwt.Formula(name_data), xstyle)1 a( Q Y3 ]5 W; r( i" [& l- C' t8 n
sheet.write(i, 2, item['rank'], xstyle)% a1 z; R9 y" h' z/ H: l
sheet.write(i, 3, item['hot'], xstyle)
J7 P0 i9 Y/ |/ i1 W4 ^ sheet.write(i, 4, item['play'], xstyle)
2 @+ ?+ X) v7 G* |1 H sheet.write(i, 5, item['comment'], xstyle)8 C `; d& V! V* z" l- |
i += 1
& @4 x( g: `4 `# N- o/ o # 如果文件存在,则将其删除/ D0 M* g' }( b# n) b' C
if os.path.exists('D:/Test/b站热门视频信息.xls'):
: j) j$ q2 Y' Y( j/ O os.remove('D:/Test/b站热门视频信息.xls')) L+ P: t3 ~( \& u6 x/ w* Q
workbook.save('D:/Test/b站热门视频信息.xls')
! W, C( S. M! Q print('写入excel成功')- B$ o" Z0 |- J
print("文件位置:D:/Test/b站热门视频信息.xls")
7 X$ m- _/ } W% q- \8 W5 p
: `5 r7 t* I& t" [# z2 R$ _0 X$ Y) u& g) i0 w! f
4.在入口main中调用上面两个函数- V3 _: B" `& E
完整代码如下:
9 i5 ^6 ~. @' w, ^import requests
+ o. I/ T# V+ A5 Q% z9 Bfrom lxml import html! A0 f# Q! K6 F" I @
import xlwt" ?8 L9 n( K- A; M# N
import os5 U3 Y& S3 l5 a9 e N" k- z
8 |7 w3 v! u4 f% g/ v' r0 g" i& z
# 爬取b站热门视频信息( w _& I! a/ W& F( b& y& y
def spider(video_list):+ G$ b1 B1 u3 \- ~1 }2 k) @
url = 'https://www.bilibili.com/ranking?spm_id_from=333.851.b_7072696d61727950616765546162.3'& W" U0 s0 X; g/ y
html_data = requests.get(url).text4 j; O# z6 T0 H" b
selector = html.fromstring(html_data)5 l' q# c/ |$ j" y% H# P) b
infolist = selector.xpath('//li[@class="rank-item"]')
Y. u Z; U- a- p for item in infolist:
7 J f3 [# {4 U5 e# ~: [ rank = "".join(item.xpath('./div[@class="num"]/text()'))
+ |: j9 E1 f$ K7 K videolink = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/@href'))6 U9 K' N- t* \; p7 ~9 W; W; E
title = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/text()'))
w: ?+ y9 m; W2 c- }4 C9 f playinfo = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/span/text()')).split("万")
0 m `8 n9 k7 T" m play = playinfo[0] + "万" w( i$ M; |# b% Q
comment = playinfo[1]
2 ^5 }4 U7 U Y2 y8 {( H if comment.isdigit() == False:# N, z: Y0 g$ B# D" X( N7 p* v
comment += "万"
. U0 c+ R% \" O0 v* k6 L( [ upname = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/span/text()'))
; G: w8 D, b: t) U uplink = "http:" + "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/@href')) h4 k2 {" ~ `
hot = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="pts"]/div/text()'))( O- z* \, @# d8 {
video_list.append({
2 v/ G7 M& Q* @9 m3 x z 'rank': rank,
# {/ r8 C8 {% a& k8 t' s! s# c 'videolink': videolink,# M, h3 U1 R4 H' Z' l) _0 A5 a
'title': title,
# m, E6 B7 s5 I$ h8 _. j a 'play': play,0 z$ X$ u- i9 }9 U6 _$ b
'comment': comment,- L' J; S! J! D9 ]. b3 M
'upname': upname,) x1 I( A+ M! B: i, s1 M
'uplink': uplink,
. ~0 w# k% Z0 f: L$ P 'hot': hot
' i' i& d' }* Y$ w! y( k })& R/ q% [0 g7 _& V& Z* W: v
return video_list$ X; n' M$ c6 s! E5 c- O5 K
! s; L) q2 n( o6 G, R4 O# 将爬取到的数据写入Excel表格
; T5 V& S5 o3 t: rdef write_Excel(video_list):* Q5 ]1 ]9 a" w1 p) h' ~/ g- F4 H
print("将b站热门视频信息导入到Excel表格:")
% c1 ?) p1 b8 A: w9 H workbook = xlwt.Workbook() # 定义workbook
# ]2 y/ m4 C: _# m sheet = workbook.add_sheet('b站热门视频') # 添加sheet
4 w O2 l; I2 ^6 j xstyle = xlwt.XFStyle() # 实例化表格样式对象
6 O) V# x- {4 p# A xstyle.alignment.horz = 0x02 # 字体居中; }; w6 g: K6 j1 x# k
xstyle.alignment.vert = 0x01 # 字体居中
' O* Y# A& K, V; M9 M; x head = ['视频名', 'up主','排名', '热度','播放量','评论数'] # 表头
7 a5 n- J/ G, g& Z: D" Y# } for h in range(len(head)):6 x! r5 D* H0 G3 d6 s
sheet.write(0, h, head[h],xstyle) # 把表头写到Excel里面去/ W! ?% ^/ D. E$ J$ e, W
i = 1
, E( J* V7 q% N6 T# u7 V for item in video_list:. r5 Q/ E& n _
# 向单元格(视频名)添加(该视频的)超链接
6 l6 m( F5 A. O- y( L4 W title_data = 'HYPERLINK("'+item["videolink"]+'";"'+item["title"]+'")' # 设置超链接
& q/ E# ]' V# G sheet.col(0).width = int(256 * len(title_data) * 3/5) # 设置列宽; r, `! Q0 E0 t8 r" I
sheet.write(i, 0, xlwt.Formula(title_data), xstyle)4 ?2 I% j) A6 w. p5 ~2 G
name_data = 'HYPERLINK("' + item["uplink"] + '";"' + item["upname"] + '")' # 设置超链接
O# g. y9 M. Q& S sheet.col(1).width = int(256 * len(title_data) * 3 / 10)
" V% x0 f7 i4 p0 } J7 H sheet.write(i, 1, xlwt.Formula(name_data), xstyle)
( f" D9 e' N8 x- A4 p9 n& Z" u" o sheet.write(i, 2, item['rank'], xstyle)
) n9 R. q0 p& t& {" M: K8 ~; M sheet.write(i, 3, item['hot'], xstyle)# w; B" q/ U0 r4 F C
sheet.write(i, 4, item['play'], xstyle)7 \( o3 a% V7 [( [. c) o: e
sheet.write(i, 5, item['comment'], xstyle)
" X. p; B! z( p7 L( A i += 1
, p: M8 `- J! [ # 如果文件存在,则将其删除
) Z1 E& U1 {2 A" \) m1 Q if os.path.exists('D:/Test/b站热门视频信息.xls'):
% J6 K$ n& q3 `6 k os.remove('D:/Test/b站热门视频信息.xls')/ w7 h4 U. K2 o$ D- |/ q% z9 }
workbook.save('D:/Test/b站热门视频信息.xls')
' \0 v4 l- B: `. |& { print('写入excel成功')# _& M$ M" q2 S' x0 \! h
print("文件位置:D:/Test/b站热门视频信息.xls")! _4 r) j8 \" A( ?& q
$ h) O% t9 C: U7 R5 b' R% I2 q
if __name__ == '__main__':0 m/ A" G- [- B/ W% K
video_list = []
1 @+ V2 D6 J3 q# ^; L, t write_Excel(spider(video_list))' C4 E2 d: {) U% f6 W7 c
" ^6 g( D8 e: f
) Y6 e# k. O' w3 x
0 i1 H9 N/ _4 u7 h( }5 e* O0 o" y1 s% O$ i1 W1 r. p l: s
! `: o6 ^2 x* a1 `
|
zan
|