- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 564568 点
- 威望
- 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表格1 H, ~& q3 B, ?$ I0 J
效果图:( G% q9 q& z' S3 n% |# o
# H3 g& J3 M o8 d* l
1.工先利其事必先利器,首先我们得下载相应的库:
) }6 \ Z4 v# |- q+ c9 ]+ j$ bpip install requests% D! s% c3 b$ J( G+ t t! h
pip install lxml: D# [9 e0 p' n* n! E# P# Q
pip install xlwt& z/ ]3 }- x; g/ E8 l
/ J0 ^ Z) k1 Y6 D0 r9 G& ~5 P7 Q
; ]. t& J' B; g, O2 ]" vrequests 向网页发送请求# p+ R2 G6 M$ r) V$ r% j
lxml 处理xml文件(xpath)
% p! w& G; W p% m. }" B, x9 }6 E, x! ixlwt 对Excel做写入操作
$ X; N/ C* T* Y; a j- \* G! _2.爬取b站热门视频的信息:8 v- |0 s; T) D
打开b站热门视频页面:
# I8 T. r# M5 O: [8 N5 I F5 U! c
" |+ \ R! z% E9 u& w0 t4 h1 x 按f12进入开发者选项,然后点击选中你要获取的页面信息,即可找到该信息在该HTML文件中的什么位置(这对我们用xpath获取元素属性和元素值很重要),例如:
, g, B/ g! f9 h9 h' k
5 G0 `$ z$ C4 J代码如下:
; F- R+ ~- H: H. y0 \# 爬取b站热门视频信息, J+ C1 B' t$ z
def spider(video_list):5 [# e1 [: t+ ~6 g# x/ E7 a( Z
url = 'https://www.bilibili.com/ranking?spm_id_from=333.851.b_7072696d61727950616765546162.3'8 ?. d8 ^" q! \
html_data = requests.get(url).text
, } L: O& _/ o9 {$ z. Q selector = html.fromstring(html_data)( ]# f" l$ r( Y5 g8 b2 _- |
infolist = selector.xpath('//li[@class="rank-item"]')
% J1 _* j# H T, @# l for item in infolist:; ]2 m! q5 h8 h0 r% P& D& u
rank = "".join(item.xpath('./div[@class="num"]/text()'))8 u9 ?/ _ @8 {5 _) P* Q+ u
videolink = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/@href'))
9 b9 ~) J" e' H: X/ S) y title = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/text()'))" j, n8 T+ J% K' S. \% x
playinfo = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/span/text()')).split("万")
# S' x( t$ w) g8 V" k# q0 u7 A play = playinfo[0] + "万"5 o8 W0 a% H) P, W1 q# o9 Y- d
comment = playinfo[1]+ m6 C4 k# v# p% X) F$ s) l
if comment.isdigit() == False:$ k7 m: C/ |5 ^5 V
comment += "万"7 ?- |. ^( Q* G. N
upname = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/span/text()'))1 N4 }( [ E- R- e9 O
uplink = "http:" + "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/@href'))
# W, c% O8 Y4 N$ m8 ?) C hot = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="pts"]/div/text()'))+ f. ]( j3 h( R2 w3 g3 i
video_list.append({
+ Z1 _ m! s+ x7 ]$ h- `) D$ B 'rank': rank,
! R& a: ~$ m) O/ v# ? r$ `. H# x 'videolink': videolink,1 V# I$ _" a) L: E
'title': title,
* Y: a" e# }' M- C; l 'play': play,
2 G+ S, a5 n& E2 n* g 'comment': comment,4 m6 l4 @& k3 g8 M; ?& j
'upname': upname,
$ x7 a( K5 Z+ L 'uplink': uplink,
% S/ T* z1 q0 Z+ d 'hot': hot
7 _& @ Y1 b5 z$ |( A9 ^ })
2 C) F8 ^8 X& p0 O' V6 M return video_list
& Y( V2 u6 g. E$ N* t! j; c! `# [2 E: f
. G) `* p2 m* { t
3.将我们拿到的信息集合(video_list)写入到Excel表格中:4 @% l( C! V/ l4 C9 W
xlwt的基本使用方法:
2 L. t C `! Y0 {6 P$ Timport xlwt
' V8 j, g q. k P& I: c# 创建一个workbook (并设置编码)
/ h5 q( ]) S0 S4 y: x/ W2 Iworkbook = xlwt.Workbook(encoding = 'utf-8'). R, r# w* }7 X( i6 N" i
# 创建一个worksheet7 {. \& y* o3 Q' j* B
worksheet = workbook.add_sheet('My Worksheet')/ F1 u( ~4 }5 b( k% z
, |5 b* l7 L, ?" }* w) T
# 写入excel6 T; V( v6 A2 |/ q
# 参数对应 行, 列, 值,(格式)
% c" ~' P# q* b( Q- }worksheet.write(1,0, label = 'this is test')
8 e9 ^- u9 D. N/ F# 保存: r1 T e* B, ~% Z9 _
#参数为你保存该Excel文件的路径
, ~0 [4 h8 Q2 E2 Bworkbook.save('Excel_test.xls') W" D* y9 l- q3 Y9 `
2 [9 [$ H; T7 ~8 F K$ g" \
( ]) a& v9 O! [
如果我们想要点击视频名或者up的名字可以跳转,那么我们就要使用Excel表格的HYPERLINK方法:
) Z( _- T# F# O5 j9 i M, z" F* AHYPERLINK(“http://www.baidu.com” ; “百度”)
& V3 y' K. H* s. i4 m9 C9 o0 u4 s百度为显示在单元格的信息,而前面的链接为跳转链接。
4 P- Y3 r( u4 I9 t& e- W% Bxlwt.Formula()方法需要传入一个字符串s,s=‘HYPERLINK(“http://www.baidu.com” ; “百度”)’。/ Q& I9 ^0 I, Z2 p
代码如下:
: ~- D. a' K. j! x& h# 将爬取到的数据写入Excel表格9 r9 {, g7 i6 j: }. p
def write_Excel(video_list):( R- O+ i& a' D% u' _
print("将b站热门视频信息导入到Excel表格:")6 N9 [& m( w) E9 s" F1 ~% r: v
workbook = xlwt.Workbook() # 定义workbook/ Z4 i' y( r# `! p) l
sheet = workbook.add_sheet('b站热门视频') # 添加sheet) o- M( W4 y+ N5 `& T, N: S
xstyle = xlwt.XFStyle() # 实例化表格样式对象
# f# \: J* P- Q' u* H. ^1 C xstyle.alignment.horz = 0x02 # 字体居中! _1 I6 T# ]2 L, V
xstyle.alignment.vert = 0x01 # 字体居中2 G" F* H3 F# z) ~; |9 w
head = ['视频名', 'up主','排名', '热度','播放量','评论数'] # 表头
7 |2 B/ [% V+ p8 p* E for h in range(len(head)):
) y$ H1 v( i/ c sheet.write(0, h, head[h],xstyle) # 把表头写到Excel里面去2 A- n& h, v: ~0 k+ g# e
i = 1
' }) S0 ?/ ~( s: Z' Y. m for item in video_list:9 W1 P9 m' M9 g- X2 ?
# 向单元格(视频名)添加(该视频的)超链接9 T: o0 N/ e: }2 C; M9 @3 L' ?# ]
title_data = 'HYPERLINK("'+item["videolink"]+'";"'+item["title"]+'")' # 设置超链接1 f5 J; |( G1 p7 w0 |
sheet.col(0).width = int(256 * len(title_data) * 3/5) # 设置列宽
( Q$ ~" y6 n8 X. h+ P; L sheet.write(i, 0, xlwt.Formula(title_data), xstyle)3 a) `; ?+ L$ a5 T& p) R6 z6 y
name_data = 'HYPERLINK("' + item["uplink"] + '";"' + item["upname"] + '")' # 设置超链接3 A! u. ]$ L7 v8 V4 h1 Y9 C
sheet.col(1).width = int(256 * len(title_data) * 3 / 10)
. S7 R+ o0 K, h+ D sheet.write(i, 1, xlwt.Formula(name_data), xstyle)5 E/ K6 ?4 }4 h& W8 G* I
sheet.write(i, 2, item['rank'], xstyle)
' f3 ?8 j6 O% o. Y! L) p sheet.write(i, 3, item['hot'], xstyle)
$ ~# g9 ?4 P: x sheet.write(i, 4, item['play'], xstyle)
1 b( [; \: { g$ h K% [9 s7 W/ r9 I sheet.write(i, 5, item['comment'], xstyle)1 p6 p; P- r3 i& c7 j1 H3 A s
i += 1 _* V' h6 | u) p) s* g
# 如果文件存在,则将其删除
9 b3 g$ J% @( d0 b( s% v7 T if os.path.exists('D:/Test/b站热门视频信息.xls'):
, d% D& C4 m* |, a: z os.remove('D:/Test/b站热门视频信息.xls')
7 M! a$ b" Z! P8 O' C- d+ X; _0 |$ X workbook.save('D:/Test/b站热门视频信息.xls')
- c! [1 D7 O% t* S! ` print('写入excel成功')) ?/ ]/ m# G5 E* ?1 A
print("文件位置:D:/Test/b站热门视频信息.xls")
; p; Z3 Z* @2 _4 C/ R* D) c- k, y2 c8 \: |4 j% b& u, `- B0 \. Z
+ Z8 C; C# e0 l4 G B0 B. s+ c0 p
4.在入口main中调用上面两个函数
+ [* I. { m, M7 K) i完整代码如下:, p5 w5 ?7 o2 W
import requests9 m; {) u* x7 k+ [
from lxml import html, e4 V( \1 |8 J! p
import xlwt
" M" j) F& e9 Aimport os
- [* x5 n) T" M1 I1 a$ x# }
9 T4 F( U- W8 |# 爬取b站热门视频信息
; N1 H3 R( ^4 ~% t y/ w& _def spider(video_list):& B7 C% p, R$ y E
url = 'https://www.bilibili.com/ranking?spm_id_from=333.851.b_7072696d61727950616765546162.3'
3 k. Y8 Z& H- B6 l& z html_data = requests.get(url).text# ~- _6 n$ R1 Y" e5 P
selector = html.fromstring(html_data), _* F% I1 B% n
infolist = selector.xpath('//li[@class="rank-item"]')& V8 ` {1 D' D. G* [
for item in infolist:
! _/ @1 [& w1 z rank = "".join(item.xpath('./div[@class="num"]/text()'))' Y" c) z* r2 Q( a1 B, n* x
videolink = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/@href'))
3 ?+ m* l; J( p: i' G title = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/text()'))+ s9 n( v7 L* Q% P3 E
playinfo = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/span/text()')).split("万")* u" l# U3 f( g* N
play = playinfo[0] + "万"
% w" \+ I' M3 R& E# b comment = playinfo[1]4 _, O; t/ n2 E
if comment.isdigit() == False:
7 d+ }# ~* r, f3 x3 B+ w% J comment += "万"& t; t2 G4 G/ Z5 M6 u5 D
upname = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/span/text()'))
' A$ l9 m8 |6 r1 I M6 d% v uplink = "http:" + "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/@href'))
5 m$ f1 H* T ^' D% S9 Y9 _ hot = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="pts"]/div/text()'))
9 w! z, l- B& ?$ K* {2 R video_list.append({
Q. x0 z* n8 M9 U 'rank': rank,
- d8 K4 s0 ]7 P 'videolink': videolink,
o+ U$ E+ _$ Q, x0 ^ R" r 'title': title,' t8 F' G) D5 B7 H0 b/ Q$ w6 Q
'play': play,
. i5 L# r+ r4 U 'comment': comment,4 \- z' d4 \4 H, ? U6 m: x
'upname': upname,5 y* I+ W v4 _' A. |3 D4 K2 q
'uplink': uplink,
% j2 e( g0 x- W2 \6 a% o% n 'hot': hot8 U& c) z' r2 P( M
})
; e+ W( E" d9 g2 Y+ u7 f return video_list
) t7 H% r/ s3 C
& [. O7 O3 o- Y: u# 将爬取到的数据写入Excel表格
8 J3 r) v! k' Q( e* Zdef write_Excel(video_list):
# V. a$ V2 H6 \" |; q print("将b站热门视频信息导入到Excel表格:")" e" A+ q0 B; x% C5 g: C" N, o1 C
workbook = xlwt.Workbook() # 定义workbook
& a Q R% i+ T8 ]8 N9 J% d; G sheet = workbook.add_sheet('b站热门视频') # 添加sheet4 P" T2 \1 T: |. u9 a
xstyle = xlwt.XFStyle() # 实例化表格样式对象/ f- w' l6 A6 \% u7 I
xstyle.alignment.horz = 0x02 # 字体居中3 a d5 J* A1 B. U- w$ J
xstyle.alignment.vert = 0x01 # 字体居中
, j+ U8 U8 K8 U+ [& n8 d head = ['视频名', 'up主','排名', '热度','播放量','评论数'] # 表头
7 `8 b* t* q4 E8 g! o! A6 { for h in range(len(head)):5 ]* p8 J9 x$ Y" Z) Y
sheet.write(0, h, head[h],xstyle) # 把表头写到Excel里面去
h! e" n+ ]' s' o& L i = 15 ~' C# _) a; h z: U
for item in video_list:
1 |, f* G% G; p9 z # 向单元格(视频名)添加(该视频的)超链接" l/ Y2 p% v) i
title_data = 'HYPERLINK("'+item["videolink"]+'";"'+item["title"]+'")' # 设置超链接7 @( U! v3 a( y! j& _% F, D' x
sheet.col(0).width = int(256 * len(title_data) * 3/5) # 设置列宽
* D; U( `6 |; e7 @* y) Q sheet.write(i, 0, xlwt.Formula(title_data), xstyle)
; N( z* u2 P) w. I& c- c name_data = 'HYPERLINK("' + item["uplink"] + '";"' + item["upname"] + '")' # 设置超链接% w% \" n: l, [% H; V
sheet.col(1).width = int(256 * len(title_data) * 3 / 10)
% o; p1 B9 D# I* H sheet.write(i, 1, xlwt.Formula(name_data), xstyle)) N% y7 \( C$ g8 E9 X
sheet.write(i, 2, item['rank'], xstyle)# @* C! Q0 z" `
sheet.write(i, 3, item['hot'], xstyle)/ c+ B `/ t4 M' b5 \3 w% C6 p
sheet.write(i, 4, item['play'], xstyle)$ t) }/ R1 w. E8 M, d6 `! F# f9 I
sheet.write(i, 5, item['comment'], xstyle)5 v' J* S ]2 F. d
i += 17 T( N+ m& c: T. i% d/ ?" ?7 l
# 如果文件存在,则将其删除
1 b! L4 H6 U) K+ e1 b if os.path.exists('D:/Test/b站热门视频信息.xls'):
: n6 i' g" n2 v4 {8 Q os.remove('D:/Test/b站热门视频信息.xls')4 S7 V7 l2 u2 U: {! D4 m4 P
workbook.save('D:/Test/b站热门视频信息.xls')
4 m: ?# H6 w+ ^6 ^2 x/ t% U print('写入excel成功')
9 o* s! x+ S- s6 B9 | print("文件位置:D:/Test/b站热门视频信息.xls")3 T$ ?4 D8 z# T
$ J& e8 c# }( \0 z' a! ^7 pif __name__ == '__main__':
* o. Q( d& k, P" E6 i ~8 `) E4 \ video_list = []
, d; }1 ^' {$ Z; U: n/ n' v% t! h5 ` write_Excel(spider(video_list))+ N9 R2 U# K: {* c
! e& M. F- {9 S! {
( j' p4 [ o. a6 `' Q
5 N% {- J2 d9 @! K+ o
3 o7 l( e5 @6 H; d* U
8 j1 k0 \+ y" {: E7 c |
zan
|