- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 564566 点
- 威望
- 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表格; ~5 B: [; _% Y: y! C1 r
效果图:
& \; A5 y1 _, X6 y/ B9 C, G ]( V
' d+ F- V! T' q& J" K% H8 S3 c1.工先利其事必先利器,首先我们得下载相应的库:# ~6 N( e& P. z: ~
pip install requests8 ?9 M$ w' j* m% X h
pip install lxml
2 p W% E- O7 Epip install xlwt; m4 }) S; {+ _. m1 C
3 X( x# @" H% a- W( }2 R+ A
0 q o6 Z7 e' f. n! S, U3 Grequests 向网页发送请求0 V6 X6 J, e- ?- c
lxml 处理xml文件(xpath): [ g, Z$ U* W6 P
xlwt 对Excel做写入操作
( h3 x5 r# _( V7 V9 H" J4 o2.爬取b站热门视频的信息:
% m' ]% N) R2 o3 a0 F! @( ] 打开b站热门视频页面:6 a, u7 m2 o |' V/ `
' _+ u5 m9 J- G1 z8 Q
按f12进入开发者选项,然后点击选中你要获取的页面信息,即可找到该信息在该HTML文件中的什么位置(这对我们用xpath获取元素属性和元素值很重要),例如:1 @! M# b) D- U0 U V( s
5 i: x. J: {0 r7 b' J a4 T
代码如下:' Y$ S2 `/ Q# W Q! \
# 爬取b站热门视频信息
% R" G! i& c( s- }1 ddef spider(video_list): ~2 h2 e2 x, A9 }1 W8 s: N
url = 'https://www.bilibili.com/ranking?spm_id_from=333.851.b_7072696d61727950616765546162.3'
7 K6 B r# o ~2 }5 g& D; r { html_data = requests.get(url).text
( T; M5 j$ {5 @# g/ M( y- v+ V selector = html.fromstring(html_data)3 W+ a7 N6 r7 E- N, K7 e# U1 Z
infolist = selector.xpath('//li[@class="rank-item"]')1 X; E7 f, P; u' \& x: E
for item in infolist:
- F7 c3 W1 |; ~0 W8 O9 h rank = "".join(item.xpath('./div[@class="num"]/text()'))$ K5 Z/ d: Q& h* N2 b) l ]
videolink = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/@href'))
# t! [1 O' x' s2 S3 L7 X+ W title = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/text()'))- W- S, U. k4 P. V
playinfo = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/span/text()')).split("万")7 h4 @; G p# a9 x' D0 m
play = playinfo[0] + "万"/ |4 j: t% G% ^' |
comment = playinfo[1]
) b: x: v6 f& P if comment.isdigit() == False:+ {* ` g7 a2 O8 ^0 G, L
comment += "万"
" N- {& S% J' ^" G0 \( s: k upname = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/span/text()'))$ @- h( \, ^! X' J
uplink = "http:" + "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/@href'))' u# Q5 b0 Z0 s& ]: m. M) r
hot = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="pts"]/div/text()'))
5 |: p: g3 W0 ^- ?0 B O video_list.append({
+ h# Z3 g9 P6 ]0 y- I% J 'rank': rank,& |* A2 z- F. V7 E' v _
'videolink': videolink,
3 o( G3 I1 n+ ^/ E+ ` 'title': title,$ ?9 W" s- @! ^- G8 {
'play': play,3 A; G. _' L P8 ?
'comment': comment,
: K! W+ f7 G: ?9 h o* F, @& W& g 'upname': upname, S$ s+ f8 M7 a5 w! e4 g' J5 e. s
'uplink': uplink,8 ~1 p: W9 X, Y" h. I
'hot': hot
' n7 X8 F, [8 _. n })# @- h' F4 ]5 B# a0 B
return video_list
+ O2 `$ ]% L6 d. {
% r9 }0 Y- I% K' U. `* E8 |3 h% T, q2 V$ K' I
3.将我们拿到的信息集合(video_list)写入到Excel表格中: B, h, i! T' J/ {' W, }: f* I3 [
xlwt的基本使用方法:
) r' i8 C- F5 |* G# eimport xlwt
5 R t2 d+ m" X( ?# Y+ ]3 q8 g# 创建一个workbook (并设置编码)
* H( D$ K$ x5 Y' ?- G4 B6 p5 _workbook = xlwt.Workbook(encoding = 'utf-8')9 O* N6 B6 q E" T' p j6 W
# 创建一个worksheet
Z4 d: a7 p, U8 ~worksheet = workbook.add_sheet('My Worksheet')
' b r# L7 [6 u% e2 |4 H- t
. `2 b" L6 j4 u) [, S# K& e. ]# 写入excel! N' m4 V& U) M7 H1 G# Z+ u
# 参数对应 行, 列, 值,(格式)
) ?. j9 x" h- z' j' R6 iworksheet.write(1,0, label = 'this is test')
- O/ Z* \3 W% p2 U1 k. |5 r; X# 保存) D6 G9 v, @' d( n: a
#参数为你保存该Excel文件的路径- [2 N7 t% E. y i4 w0 t ?2 n) A2 T
workbook.save('Excel_test.xls')1 P8 X m9 B# y
7 K* X4 K& z% h: T6 x% ]
3 z7 @; e! L; B
如果我们想要点击视频名或者up的名字可以跳转,那么我们就要使用Excel表格的HYPERLINK方法:
# u; x" ~5 P2 ~- j+ V/ cHYPERLINK(“http://www.baidu.com” ; “百度”)- F& Q# S& L) ~1 m) E, l
百度为显示在单元格的信息,而前面的链接为跳转链接。
- s4 h) A2 B7 e% C1 Y' W9 C4 U4 D) [xlwt.Formula()方法需要传入一个字符串s,s=‘HYPERLINK(“http://www.baidu.com” ; “百度”)’。
* ?4 E' S" b" s+ ^代码如下:' y* h+ g" `8 `; b& d. d
# 将爬取到的数据写入Excel表格$ p! _6 y6 t6 s; V t& K H, \
def write_Excel(video_list):
. n# }& p4 |; k+ u$ M' M print("将b站热门视频信息导入到Excel表格:")0 r+ K6 e2 ]4 _4 m
workbook = xlwt.Workbook() # 定义workbook( s" w2 l# U2 B$ [! u
sheet = workbook.add_sheet('b站热门视频') # 添加sheet
; r+ p8 E& r. b* S5 j" B& U xstyle = xlwt.XFStyle() # 实例化表格样式对象
1 ]) l! Q }8 ^% u2 x3 O xstyle.alignment.horz = 0x02 # 字体居中& e" m- _! b7 d9 x
xstyle.alignment.vert = 0x01 # 字体居中
! d$ J8 n9 G# R, Y; Y% q head = ['视频名', 'up主','排名', '热度','播放量','评论数'] # 表头; D* c( _$ F& V9 O$ v% y' h
for h in range(len(head)):. ~+ }7 c( F2 x; i! Y
sheet.write(0, h, head[h],xstyle) # 把表头写到Excel里面去
# v e' e9 F* L7 _ i = 1# j! H. f8 k/ ]1 y0 V
for item in video_list:# p# R6 u- [7 c, g/ g* t. j
# 向单元格(视频名)添加(该视频的)超链接$ e0 I" K8 y/ r! n+ s! ]
title_data = 'HYPERLINK("'+item["videolink"]+'";"'+item["title"]+'")' # 设置超链接( i) N0 |7 [ R
sheet.col(0).width = int(256 * len(title_data) * 3/5) # 设置列宽
; K6 W* n' l8 l$ T( K sheet.write(i, 0, xlwt.Formula(title_data), xstyle)! L% A7 b- p3 X- N% [; ^
name_data = 'HYPERLINK("' + item["uplink"] + '";"' + item["upname"] + '")' # 设置超链接
6 V) P: S; o2 H3 X0 c sheet.col(1).width = int(256 * len(title_data) * 3 / 10)! ^/ m% ?( {9 w: I
sheet.write(i, 1, xlwt.Formula(name_data), xstyle)
; G8 ?# N* q$ y& H t4 y0 ?. u( q m sheet.write(i, 2, item['rank'], xstyle)
O3 C- U: @2 n# \ sheet.write(i, 3, item['hot'], xstyle)
1 N/ H' o+ T F! C- \7 R3 g' w: m+ ` sheet.write(i, 4, item['play'], xstyle)
( Y6 ?, p8 o6 ^3 D3 s" V9 J3 q sheet.write(i, 5, item['comment'], xstyle)
% [# ]) p' s5 h$ g% m3 h i += 1
- A. c8 l5 G$ o5 u3 `, ~- k8 a% ~1 d # 如果文件存在,则将其删除- Y7 }" x0 }6 u+ D
if os.path.exists('D:/Test/b站热门视频信息.xls'):
6 T( }8 I2 L# I7 f os.remove('D:/Test/b站热门视频信息.xls')2 _& d2 w, J1 i: ^4 k
workbook.save('D:/Test/b站热门视频信息.xls')
6 w( _5 V e& j* G+ U% n$ u0 z print('写入excel成功')
7 I$ q/ `( Z! d4 F- g print("文件位置:D:/Test/b站热门视频信息.xls")
) Z6 E+ |9 H( o' o
/ `2 f m" a) e; u
8 {0 C' Z; N* U3 G4.在入口main中调用上面两个函数
" p) {1 q) c5 t! Y- d3 O5 u完整代码如下:3 |* u4 `! _) W" @! [
import requests, K: g! f( e1 b
from lxml import html- I: \8 l& z( n& b
import xlwt
' F( E* }. v) u9 n+ ~2 N' wimport os, H' s7 G' a. Z
* ^& n0 }5 a+ i5 B& Z
# 爬取b站热门视频信息
9 j6 n* A" {3 A9 X: I8 l! Xdef spider(video_list):( U! k! r: y2 e" X
url = 'https://www.bilibili.com/ranking?spm_id_from=333.851.b_7072696d61727950616765546162.3'
5 b) d0 e! S2 v html_data = requests.get(url).text% @# O" l4 U2 R+ v
selector = html.fromstring(html_data)9 R6 I5 C9 j+ V# [* B `
infolist = selector.xpath('//li[@class="rank-item"]')
( s" l4 y+ T2 Z( {5 m, _ for item in infolist:
( {. h' m; Q# J8 c rank = "".join(item.xpath('./div[@class="num"]/text()'))4 F5 z4 y) L1 @4 F# C
videolink = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/@href'))9 Q i. ?: j1 v- t
title = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/text()'))
% e* |( \1 v6 x! T5 w) i! U playinfo = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/span/text()')).split("万")1 t& X- j5 [/ D) e% V0 Y
play = playinfo[0] + "万"
/ n6 {+ U+ h! Q" m- M# D- P comment = playinfo[1]
5 `/ ?' R9 z7 W/ c; {6 ~/ j if comment.isdigit() == False:
9 r: W8 q0 J4 m! C/ N1 e comment += "万" S: }. T2 U! M I0 V4 x
upname = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/span/text()'))
( q& Z3 C5 ]9 H0 k7 | uplink = "http:" + "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/@href'))
1 _) M; ^: y& d% f hot = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="pts"]/div/text()'))4 D- N! j! H) `9 G* o% B
video_list.append({$ y& z) D4 u2 z, t1 _$ y
'rank': rank,
7 l9 F: k2 R) z+ S4 k; | 'videolink': videolink,- z7 R4 f/ s9 V( F
'title': title,
- X( o B! K) `9 A! A2 H 'play': play,
7 P h2 t: y1 H$ ]8 u 'comment': comment,
# ~ v. _5 V' H1 {* p 'upname': upname,/ q$ ^/ L# m R
'uplink': uplink,
6 o- ^- D1 Q! g. z 'hot': hot) x% k+ }/ {3 k4 h, n
})$ o3 C3 C. ^6 Z9 G( D3 h2 W
return video_list' p5 a/ |" {- a2 v7 l) M* i
` I8 G' `4 J
# 将爬取到的数据写入Excel表格
% ^/ i! ^( s- C; b7 R, ]: @9 @5 ~def write_Excel(video_list):
) H7 G1 f1 _. @/ V5 { print("将b站热门视频信息导入到Excel表格:") v4 U! T5 E# P' ?8 |9 X
workbook = xlwt.Workbook() # 定义workbook% D! M% B3 U- j1 h- D6 ~
sheet = workbook.add_sheet('b站热门视频') # 添加sheet
" X: I" F: e6 J- k. D2 S xstyle = xlwt.XFStyle() # 实例化表格样式对象* g. q) N# Y- _: m; m( Y- J4 \
xstyle.alignment.horz = 0x02 # 字体居中8 j% a) A2 C+ @, W+ b+ m
xstyle.alignment.vert = 0x01 # 字体居中, J) g0 |4 Y, B# M! } ~
head = ['视频名', 'up主','排名', '热度','播放量','评论数'] # 表头* @! x: b1 e w
for h in range(len(head)):
7 a/ k/ J/ W1 M8 g sheet.write(0, h, head[h],xstyle) # 把表头写到Excel里面去( l+ T3 Y5 k/ h# r+ ^, q
i = 1
' f& t& ]( n y/ t8 U9 y/ ` for item in video_list:
. [* ^% x' _+ x # 向单元格(视频名)添加(该视频的)超链接
( @ g. m9 n9 i$ L6 f% f- ]- h9 | title_data = 'HYPERLINK("'+item["videolink"]+'";"'+item["title"]+'")' # 设置超链接5 d% B: C/ W2 A, w# ~7 d
sheet.col(0).width = int(256 * len(title_data) * 3/5) # 设置列宽
, V5 o0 z2 G$ c/ ` sheet.write(i, 0, xlwt.Formula(title_data), xstyle)
. n1 [) B" G" V6 G& X0 V; j. t0 Y. j name_data = 'HYPERLINK("' + item["uplink"] + '";"' + item["upname"] + '")' # 设置超链接+ o$ Z/ \9 r. }
sheet.col(1).width = int(256 * len(title_data) * 3 / 10)1 \( {8 k' w& d. ^/ K
sheet.write(i, 1, xlwt.Formula(name_data), xstyle)+ s1 X& P9 _# V7 h3 _7 b' E* h
sheet.write(i, 2, item['rank'], xstyle). q$ g7 a/ h5 z
sheet.write(i, 3, item['hot'], xstyle)
9 `" J4 L' l! d sheet.write(i, 4, item['play'], xstyle); r. \" V9 E( O, {8 b8 r6 Y7 ^- a
sheet.write(i, 5, item['comment'], xstyle)! ^) Y1 G/ N0 B. x3 _
i += 1
6 T' v, A/ W! q( P& W # 如果文件存在,则将其删除
( Q z$ o: w5 M7 k: m- c9 `" o# Q if os.path.exists('D:/Test/b站热门视频信息.xls'):3 g/ n+ K2 u, j
os.remove('D:/Test/b站热门视频信息.xls')
; c) x% g$ ?0 e) G9 M workbook.save('D:/Test/b站热门视频信息.xls') o9 P! D* C6 ~. K3 D9 ^$ H' C' o
print('写入excel成功')9 @- p- e$ x5 U+ t3 g
print("文件位置:D:/Test/b站热门视频信息.xls")2 q, ?/ X' k: E% `4 i* l% g+ M
% Y# D6 h. p; m# n) X6 f& m
if __name__ == '__main__':3 d; z+ X) ^7 \9 U4 L
video_list = []
1 I9 b0 O& ]! W$ ^( @$ C- \ write_Excel(spider(video_list))
, W" F; W5 L! F" t% |* F/ N8 k9 R+ {9 h S" Y4 T" t
+ D# \, _" ] W8 I4 A4 Y: h/ ^# l
' ?4 F) @- T- Y8 w( k$ Q" a0 o! H
% v1 A) Q/ `$ j. `- ]! o
|
zan
|