在线时间 1630 小时 最后登录 2024-1-29 注册时间 2017-5-16 听众数 82 收听数 1 能力 120 分 体力 563412 点 威望 12 点 阅读权限 255 积分 174246 相册 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表格 0 R& y3 e! F" c: N6 m* c- m1 G
效果图:
0 t4 j: G: _/ M+ s
% s7 P8 C3 J( N: {
1.工先利其事必先利器,首先我们得下载相应的库:
: J1 l( f$ b5 T! \% i3 S pip install requests
% f" a* N+ ^% Q& u/ g4 | pip install lxml
; @: ` @9 N1 V% x- P pip install xlwt
! ]4 r O$ ~0 c X! l R$ V0 o ' _& M! J1 z6 g$ U
, ~" X% x# Z* t5 \( W$ w4 \# Z9 H requests 向网页发送请求 5 O1 V) B9 a) d' L' a% p
lxml 处理xml文件(xpath)
6 B/ i7 o' b' P& V( E, c xlwt 对Excel做写入操作 1 y3 C3 n/ F0 {7 d+ F
2.爬取b站热门视频的信息: ; }) m; \* G% Q, l; X/ t7 b
打开b站热门视频页面:
! t9 Q7 K4 M5 w& A" p3 d
" p! Y8 q$ P% E' l1 }8 L3 U
按f12进入开发者选项,然后点击选中你要获取的页面信息,即可找到该信息在该HTML文件中的什么位置(这对我们用xpath获取元素属性和元素值很重要),例如:
; Y3 @! S. U1 |. d
7 Z( \0 n' [( a" X7 U
代码如下:
9 M! K! ?! Y; e: H% F; u) A0 S& a # 爬取b站热门视频信息
0 _, v$ y$ U7 A& w: X; p$ H def spider(video_list):
) Y* I( \ j( f, m/ U! Q url = 'https://www.bilibili.com/ranking?spm_id_from=333.851.b_7072696d61727950616765546162.3'' L5 G! \, Z+ L- p, }
html_data = requests.get(url).text* ~# x: E) K6 o# p# O/ A
selector = html.fromstring(html_data)4 F& ^# F( v; o* m" N
infolist = selector.xpath('//li[@class="rank-item"]')
' _# r ~) ^+ F- k- N. y. d) ? for item in infolist:5 \/ `7 `% [( D1 m- S; n
rank = "".join(item.xpath('./div[@class="num"]/text()'))
4 M5 C9 n2 r: w( H videolink = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/@href'))
5 E# h$ c0 M! N2 { title = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/text()')); p' `, _* Y! j8 O1 O. K
playinfo = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/span/text()')).split("万")
% E! D' g% w1 O: U( T7 r play = playinfo[0] + "万"2 G0 h9 V5 a, `% u, E, g
comment = playinfo[1]
; [% p5 v6 S8 |0 | if comment.isdigit() == False:
1 _# `: G, b5 c+ o& f) i& h. n8 ^! M comment += "万"' \8 F& a! m# ?) e4 l& C7 C3 e( I
upname = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/span/text()')); d5 |3 z1 _1 f+ r3 E0 w
uplink = "http:" + "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/@href'))
* f3 k4 N/ L* U1 }) H hot = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="pts"]/div/text()'))7 E% q6 z! R2 \4 `7 B, M& k3 Q; _
video_list.append({
% m8 X# C( \4 y6 y9 r' v7 `1 i 'rank': rank,
7 _1 @) } ~1 H h 'videolink': videolink,
6 {7 [' ^& R) S) d+ v% p 'title': title,
* O) G3 y6 d5 D+ n- ~ 'play': play,7 k, F" t) u. n, D( Y
'comment': comment,
0 N7 M1 Y* W" \4 U 'upname': upname,
; x) X3 E" k7 ^: k 'uplink': uplink," d( Y/ J! q* X1 F
'hot': hot
- X+ d7 f0 }4 S" t7 _' H; _ })
0 n3 ~' E* p" P E return video_list$ V R" p: q7 c! ^3 r
: c; ?& L* P. T( o0 {7 o
3 G1 _& M' [. N& j
3.将我们拿到的信息集合(video_list)写入到Excel表格中:
3 P; X* f. z( F1 z% P. F xlwt的基本使用方法: ( `" z/ K- A/ t7 U' o6 W; f
import xlwt ( M' ?6 E0 j! l" w: _( ]
# 创建一个workbook (并设置编码)
p. @1 ]7 q+ w0 \! g, N# s, s workbook = xlwt.Workbook(encoding = 'utf-8') & T. x* Q8 w' n$ w# L
# 创建一个worksheet
) l4 m+ L) ^/ s$ _* a worksheet = workbook.add_sheet('My Worksheet') . A, c9 b2 ?0 r; J; O, Y, d" }) u: ?
2 l5 B5 m2 t9 i3 Z5 K# k7 w% `
# 写入excel
P( D( l# C& ~8 Z3 n9 c # 参数对应 行, 列, 值,(格式) " ~" m- x9 F9 a& R
worksheet.write(1,0, label = 'this is test')
: l% b* x8 v8 A" h/ F # 保存 5 h2 U7 n% H: P
#参数为你保存该Excel文件的路径
# }4 h- t9 K3 B% N/ G3 H workbook.save('Excel_test.xls')
: C- ^5 b4 Q1 u/ O. Y# V j- b+ N
0 A5 M$ _% B5 ~ ! L! a9 V& P1 f S. d' f1 z* U
如果我们想要点击视频名或者up的名字可以跳转,那么我们就要使用Excel表格的HYPERLINK方法: ; G; P' |5 T1 k: Y' V0 p8 q
HYPERLINK(“http://www.baidu.com” ; “百度”) / T$ t1 u2 X" _
百度为显示在单元格的信息,而前面的链接为跳转链接。
! F+ n% k7 L; s% ` q; x9 j8 g8 v xlwt.Formula()方法需要传入一个字符串s,s=‘HYPERLINK(“http://www.baidu.com” ; “百度”)’。 ; r# y. y/ r# f; k2 J( b$ _( A/ |
代码如下: " p5 z: L1 P. W6 U$ L& c* h
# 将爬取到的数据写入Excel表格 4 N) k: f% e6 S7 i7 R Z
def write_Excel(video_list): 6 u6 Z, A; a$ }) b7 ]
print("将b站热门视频信息导入到Excel表格:") " w+ G$ I6 p6 \! B8 p
workbook = xlwt.Workbook() # 定义workbook
]1 u9 a" e6 z- \9 D sheet = workbook.add_sheet('b站热门视频') # 添加sheet 4 x+ \4 ~8 S( s+ W4 @
xstyle = xlwt.XFStyle() # 实例化表格样式对象
; q+ I5 |/ C W5 K xstyle.alignment.horz = 0x02 # 字体居中
9 {# h; F, N. l: _ xstyle.alignment.vert = 0x01 # 字体居中
2 O5 A/ ]& y5 E head = ['视频名', 'up主','排名', '热度','播放量','评论数'] # 表头
H& j( z7 Z+ X& t6 J for h in range(len(head)): # J+ a% T, j5 \4 c, F
sheet.write(0, h, head[h],xstyle) # 把表头写到Excel里面去
8 S9 H# Z- S- a6 [: k# _* W i = 1 ! c% G8 b8 O" Y" L+ n/ C
for item in video_list:
! g9 v; q! }+ Q6 d # 向单元格(视频名)添加(该视频的)超链接
9 g0 q0 m0 v" k, u. A! f y title_data = 'HYPERLINK("'+item["videolink"]+'";"'+item["title"]+'")' # 设置超链接
( U) r( A1 M7 q: F& q! Q0 i) M$ x sheet.col(0).width = int(256 * len(title_data) * 3/5) # 设置列宽
6 j- T% {+ u+ @4 X% D) Q sheet.write(i, 0, xlwt.Formula(title_data), xstyle)
4 X; _5 x$ s0 M9 H' u% R! ?! _0 Q. g/ n name_data = 'HYPERLINK("' + item["uplink"] + '";"' + item["upname"] + '")' # 设置超链接
0 ?" @. t1 J. z+ c4 I, F. F7 J sheet.col(1).width = int(256 * len(title_data) * 3 / 10)
- f$ V4 K H9 ^& D3 j sheet.write(i, 1, xlwt.Formula(name_data), xstyle)
% h: n# I0 r4 I! F, B# F* o sheet.write(i, 2, item['rank'], xstyle) * M) Q( h1 O# e7 J4 }' I
sheet.write(i, 3, item['hot'], xstyle)
# ~1 `2 M; L: N# l$ g+ u! W+ i N sheet.write(i, 4, item['play'], xstyle) , z; _( h4 R; |
sheet.write(i, 5, item['comment'], xstyle) & i( L4 F% l" K; B
i += 1
8 k$ G+ I) c- s9 [ # 如果文件存在,则将其删除 6 ~$ {6 D# e1 L2 U) K1 T+ h9 b
if os.path.exists('D:/Test/b站热门视频信息.xls'): 2 Z$ h2 p W. r
os.remove('D:/Test/b站热门视频信息.xls') # {& R7 x6 u9 g, ?
workbook.save('D:/Test/b站热门视频信息.xls') " A$ l' ~* f1 h$ O
print('写入excel成功') $ ^( Y7 K5 d/ ?6 ~
print("文件位置:D:/Test/b站热门视频信息.xls")
! V& y" D( W$ Z3 m! V y1 K
# R: ]' h' p. D : M2 I" q/ \. { d! J
4.在入口main中调用上面两个函数
! A; p, n0 N; G% d# \* h7 L 完整代码如下: 8 J/ I9 d) q7 n! l' U
import requests
6 v, L$ I3 r; S from lxml import html
1 M. V2 B9 a S. A# t import xlwt : c+ w3 x* w. K W1 s
import os
6 h% Z9 V- ]) k: U ) {) j4 C, q) r7 e
# 爬取b站热门视频信息 x/ E5 a/ i4 o- K
def spider(video_list): 8 `' c, e; v: Q& Z6 j$ J6 F5 V, J
url = 'https://www.bilibili.com/ranking?spm_id_from=333.851.b_7072696d61727950616765546162.3' 3 M4 x8 \, V0 i+ A& j
html_data = requests.get(url).text
% y& {+ d5 W- A4 f' D) Y6 a. s selector = html.fromstring(html_data) $ @$ U: A' i; _' m+ l4 D. g- t
infolist = selector.xpath('//li[@class="rank-item"]')
: n9 m. @9 I" P; d4 T5 d% | for item in infolist: / r, b- X5 T* U0 y4 ?3 Y% w
rank = "".join(item.xpath('./div[@class="num"]/text()')) & {3 r, B# ?8 Y& E
videolink = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/@href'))
, l6 E- X* P' s+ F' _/ L+ z title = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/text()')) ) [$ T% A2 `/ d$ s5 }. g* `
playinfo = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/span/text()')).split("万")
4 Q. J! O; S5 A! \ play = playinfo[0] + "万" & Q# _. C7 N( \$ o* i
comment = playinfo[1] . L( {" b: e# E! H) y h
if comment.isdigit() == False:
! E1 n& i+ Y" @( L3 q comment += "万"
& N: M8 g* K a' }4 L upname = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/span/text()')) " E8 }5 s6 D$ X; x" y& n4 G
uplink = "http:" + "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/@href'))
( _! Y5 R" R; E6 c5 @ hot = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="pts"]/div/text()'))
9 [* L3 O% ]& B+ n7 J- ?" r4 u video_list.append({
7 |/ a. a: n$ ]$ S4 ^: L- ~ 'rank': rank, 2 v ?6 T; r |9 ~# Y; K2 m
'videolink': videolink,
, e' n6 k4 b, H" E7 l' W 'title': title,
! _3 @3 r! n9 T6 N+ B( { 'play': play,
5 n L7 m- V) I) o E4 E/ W2 J 'comment': comment,
( |. z/ C+ i7 } 'upname': upname,
1 g; \6 ]- i u! k9 H 'uplink': uplink, ' K( F1 c7 a9 S- d
'hot': hot - a' I# Y. p: U* E
})
3 V# f9 c# F0 W return video_list # G( h9 z$ t) e S9 L
& `9 i2 G) V# O5 ]( i # 将爬取到的数据写入Excel表格 4 f! B* e& d& ]* I* D; w* x
def write_Excel(video_list): 8 r3 ^1 @" H) x6 A1 v) y
print("将b站热门视频信息导入到Excel表格:")
2 d/ z" R& N0 Y+ | workbook = xlwt.Workbook() # 定义workbook A4 Y( B* I7 ^8 B+ J
sheet = workbook.add_sheet('b站热门视频') # 添加sheet ' K+ V/ U3 O# `! f$ D! s
xstyle = xlwt.XFStyle() # 实例化表格样式对象
, X! g$ T' ~. m1 | c xstyle.alignment.horz = 0x02 # 字体居中
% ^5 `4 j; n- L5 ] xstyle.alignment.vert = 0x01 # 字体居中
) v3 L) H5 O7 c0 u8 H2 s+ _* f$ } head = ['视频名', 'up主','排名', '热度','播放量','评论数'] # 表头
1 Y( p: r5 x3 J- n; W$ b for h in range(len(head)): " _4 f7 n& a; U+ e# A. I
sheet.write(0, h, head[h],xstyle) # 把表头写到Excel里面去
2 N- |: m' ^2 r9 E' F% t% R/ r- g' K- U8 w i = 1 9 Q: d' l" s8 ^
for item in video_list:
7 P) g* q3 L& H # 向单元格(视频名)添加(该视频的)超链接 : _! e9 X7 C' M" R% z; \4 {
title_data = 'HYPERLINK("'+item["videolink"]+'";"'+item["title"]+'")' # 设置超链接
$ W% y" ^* A# C$ V; V2 o sheet.col(0).width = int(256 * len(title_data) * 3/5) # 设置列宽
2 z9 ?& \$ c7 ]* t1 U* R sheet.write(i, 0, xlwt.Formula(title_data), xstyle)
- u& r! O$ T5 Z; p" l name_data = 'HYPERLINK("' + item["uplink"] + '";"' + item["upname"] + '")' # 设置超链接 4 ^( K* S( o/ m& m1 [ M
sheet.col(1).width = int(256 * len(title_data) * 3 / 10)
# H& |; A' i* x" ^7 @, t, u sheet.write(i, 1, xlwt.Formula(name_data), xstyle)
4 j" ?$ l* c2 D. E+ }: \ sheet.write(i, 2, item['rank'], xstyle) 0 m9 \* |4 t8 r; w0 {
sheet.write(i, 3, item['hot'], xstyle)
! p) e' l3 \& R! X7 y, u sheet.write(i, 4, item['play'], xstyle) ' A" u3 I" M8 B, f' l& ~
sheet.write(i, 5, item['comment'], xstyle)
' |0 Y" `( Y6 I3 j% ] i += 1 7 S4 ]; [1 }& v7 Z; I; Z
# 如果文件存在,则将其删除
/ k0 n" s# B" d7 L- c9 z7 q K if os.path.exists('D:/Test/b站热门视频信息.xls'):
7 l2 A6 n/ L& q' S os.remove('D:/Test/b站热门视频信息.xls') ' O& d2 D V$ ]1 Z3 q+ Z, s
workbook.save('D:/Test/b站热门视频信息.xls') 3 Y& n5 s5 U$ [2 T6 |, y
print('写入excel成功')
" H$ d: z* u6 S) H print("文件位置:D:/Test/b站热门视频信息.xls")
+ L) h" ]4 a% l/ ^! | 1 i+ \2 ?% L' @
if __name__ == '__main__': + e* Q8 m' L6 d' _+ w' B% P6 H
video_list = [] ! J& r$ ~) a- f
write_Excel(spider(video_list)) ; ]) K, j/ {5 u: u3 i
8 @( R7 @& L$ g
) q0 @' w; ]3 K % J* E/ v) }% q% }( w
3 R) C$ d- f1 L( k/ q 7 s4 S: f8 q. N k; P p1 B
zan