- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 563371 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 174234
- 相册
- 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表格/ |; D. |+ D/ Q3 W, J# T5 r9 I
效果图:$ E* A v4 [) e( s7 y3 E" }
+ s; R8 Y% O" y4 b. t& T7 s
1.工先利其事必先利器,首先我们得下载相应的库:3 n( T, ^. o" Y
pip install requests* w9 n6 U- p# v
pip install lxml
* B0 f( }- B& g' h% apip install xlwt
: M5 @5 n3 M, X3 H: S8 N% g
' Q) @2 b7 y$ C& T! z. p6 z+ y, C" N/ I! y0 ^2 N, Y
requests 向网页发送请求* Y8 n. m' {- q0 S, O
lxml 处理xml文件(xpath)- h- f9 m) b$ c0 @9 l/ f
xlwt 对Excel做写入操作
0 @3 @2 M( N" p! E, `1 r/ g0 p2.爬取b站热门视频的信息:* N5 J0 G5 J0 M9 p& m* I
打开b站热门视频页面:
" ?! S, I; {) U2 T& }. ]' T
( s% \" j2 Z! H5 S( M
按f12进入开发者选项,然后点击选中你要获取的页面信息,即可找到该信息在该HTML文件中的什么位置(这对我们用xpath获取元素属性和元素值很重要),例如:
, E5 b; Y; F9 y& F0 i7 Q k$ v
6 }; h* N- g6 t+ }8 a
代码如下:
" d! q' G6 [- B0 T. _% P& M# 爬取b站热门视频信息
- y' B$ L4 J8 d3 Zdef spider(video_list):$ `0 r: G4 h' Q. J
url = 'https://www.bilibili.com/ranking?spm_id_from=333.851.b_7072696d61727950616765546162.3'
- S/ V! C" {9 P+ W, m) P( r html_data = requests.get(url).text$ i1 f5 r, C) X( M- H/ h
selector = html.fromstring(html_data)9 C/ E. `$ \7 z! g7 {
infolist = selector.xpath('//li[@class="rank-item"]')
" I2 P! }' w8 v1 U! c# u+ D for item in infolist:0 I# i! H9 E! B$ _. r1 c* E
rank = "".join(item.xpath('./div[@class="num"]/text()'))* P4 I2 l) n$ t: X8 y6 S
videolink = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/@href'))* m' o) E! g0 Z1 [; f
title = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/text()'))
! E# w) @' @' L7 t1 H6 ~8 { playinfo = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/span/text()')).split("万")! V* O; j9 u/ I, d; q* U. x/ Q
play = playinfo[0] + "万"" P7 G/ Z, i1 ~& k; \$ E k1 o
comment = playinfo[1]# k' h" a, R. V
if comment.isdigit() == False:
; p) W. V1 b" V( I comment += "万"
$ N2 s" q5 @+ L8 A9 V upname = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/span/text()'))
. B% B3 L8 E7 x2 y uplink = "http:" + "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/@href'))1 m, q; S/ B9 {# N, n, o4 |( Z
hot = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="pts"]/div/text()'))" u( [8 m- z9 J
video_list.append({
$ D& R j& N: y3 ^4 s7 f) E 'rank': rank,
) j* q. n Q1 y6 x 'videolink': videolink,$ S" F6 K/ i% _5 Z% b' A7 \
'title': title,, h2 w" u+ e7 Y+ h
'play': play,
8 J. X8 ]! g! o 'comment': comment,# J: e& F" A* L% ^& X6 H
'upname': upname,
. {$ t) r1 H" u+ M3 V \ 'uplink': uplink,) D& }/ L$ f/ J r- g J, H
'hot': hot
4 `, J! U, x" y& z, s })
L! ~3 a% c3 b& n$ X2 o/ C! c return video_list
7 E E1 ?3 f, U/ y. F9 r7 c ]& R1 H5 d6 u" T4 f7 P
% p, B9 `; A, f' D, Q$ j! q$ h3.将我们拿到的信息集合(video_list)写入到Excel表格中:8 [ |' _1 @: ^! h
xlwt的基本使用方法:3 v1 [' V1 L5 i0 b9 ]
import xlwt' p P1 I- x* P1 s i- B6 R
# 创建一个workbook (并设置编码)5 i7 |2 }& K2 V7 ]' c
workbook = xlwt.Workbook(encoding = 'utf-8')
6 @8 I9 q% v& V) ~" _8 d+ I: ^, G# 创建一个worksheet1 [7 ?# g' v& n) A& D, P; Y
worksheet = workbook.add_sheet('My Worksheet')1 ^9 q! H& j3 n5 s& m1 g7 W' x! I
6 v9 w* r0 ]5 p+ r3 L" n
# 写入excel
. H' _8 H Z- ~( c+ h/ e# 参数对应 行, 列, 值,(格式)
M* i# U- A: J1 V1 V! r9 Kworksheet.write(1,0, label = 'this is test')2 _6 _# p% G/ i" |
# 保存
0 b( r4 c# Y: ?! T& x4 T#参数为你保存该Excel文件的路径3 k6 ~6 t5 l4 P z0 J
workbook.save('Excel_test.xls')
% Q' \/ k7 O t9 n: M+ s2 A! S0 R+ x
4 k, v) P) {8 c# U' d% V 如果我们想要点击视频名或者up的名字可以跳转,那么我们就要使用Excel表格的HYPERLINK方法:* `/ e! U4 H/ U9 j. Z1 ]
HYPERLINK(“http://www.baidu.com” ; “百度”)
" j, x7 K! `) S) M+ p* l6 r4 W百度为显示在单元格的信息,而前面的链接为跳转链接。
# e0 J1 m ^ Y! j/ Cxlwt.Formula()方法需要传入一个字符串s,s=‘HYPERLINK(“http://www.baidu.com” ; “百度”)’。
, }5 T* Q1 [( I7 i3 ]/ t代码如下:
" |% m& V3 u- V# 将爬取到的数据写入Excel表格. T/ D: e: V* q2 f! @( Q7 W
def write_Excel(video_list):
+ s) R/ q3 } L& D6 g/ {, { print("将b站热门视频信息导入到Excel表格:"). a# P5 H3 O# Y, a. ^1 \
workbook = xlwt.Workbook() # 定义workbook
2 R/ j# u% E8 C% ?/ ^8 M! h sheet = workbook.add_sheet('b站热门视频') # 添加sheet
, s; ~9 K( ^! E; e: k- n xstyle = xlwt.XFStyle() # 实例化表格样式对象- _4 e/ ~, {* g
xstyle.alignment.horz = 0x02 # 字体居中+ H7 K+ K1 V9 @. U/ ?, n$ F, n
xstyle.alignment.vert = 0x01 # 字体居中
$ u' o) a" e1 p4 |( T head = ['视频名', 'up主','排名', '热度','播放量','评论数'] # 表头
0 q- M: E6 @# @) p) }5 v, B4 f" a for h in range(len(head)):
! }+ ~9 U- t# _ ] sheet.write(0, h, head[h],xstyle) # 把表头写到Excel里面去
: j- b* a/ |5 X/ e i = 1/ j$ } V9 L+ z( V3 {
for item in video_list:& [+ w" u% f4 F) S' v4 \ D9 ?
# 向单元格(视频名)添加(该视频的)超链接
3 S) H0 C7 K6 ^- Q title_data = 'HYPERLINK("'+item["videolink"]+'";"'+item["title"]+'")' # 设置超链接; c9 i, H% p8 w
sheet.col(0).width = int(256 * len(title_data) * 3/5) # 设置列宽
) q- E `9 X N% |9 n8 F sheet.write(i, 0, xlwt.Formula(title_data), xstyle)
) w; G0 v! `9 f. k* u4 p# V; ?2 N name_data = 'HYPERLINK("' + item["uplink"] + '";"' + item["upname"] + '")' # 设置超链接
9 `& O+ f6 u% j4 u# w sheet.col(1).width = int(256 * len(title_data) * 3 / 10)
( O; V4 x. W+ U& [ sheet.write(i, 1, xlwt.Formula(name_data), xstyle)
, P: z- A$ K5 m* N# Q4 t* x# ] sheet.write(i, 2, item['rank'], xstyle)" v0 i' Z* [" A% h$ K
sheet.write(i, 3, item['hot'], xstyle)# }4 C1 N h" m4 m, l" H
sheet.write(i, 4, item['play'], xstyle)3 J; O/ c6 j# g, ?' U# ]& g
sheet.write(i, 5, item['comment'], xstyle)8 L7 E" I% |; G" R8 |. |! O
i += 1
% t' x1 T! k7 j, x # 如果文件存在,则将其删除
/ ?3 ~( {4 f- W if os.path.exists('D:/Test/b站热门视频信息.xls'):
) I. F2 Y% {, Y: M os.remove('D:/Test/b站热门视频信息.xls'). \* F; e* b, {! p* F
workbook.save('D:/Test/b站热门视频信息.xls')
! v& R8 G( M( O9 F9 H7 U print('写入excel成功')( q! [1 O4 E' s! Y0 A+ a; r$ |
print("文件位置:D:/Test/b站热门视频信息.xls")
( z" N! K! D9 h3 F1 a% C& ~5 L; n$ b8 H% h+ j% m# ^% T
! g+ u5 _; t9 b, u8 Z6 T; F9 P% Q
4.在入口main中调用上面两个函数9 r3 v! e- b2 G* v' P3 t6 T
完整代码如下:# Q c, M, C4 F& V6 g* e2 D
import requests/ f! e2 B( N+ o2 z) `- Q
from lxml import html
2 u) D% ]) [" \4 W& D2 t5 b5 [import xlwt
% q- G- {* N7 q- }import os
5 B/ F0 O1 t& Z7 Q N& g1 n/ S& E5 K3 r7 E+ h1 B* U+ s
# 爬取b站热门视频信息
; V1 v& V; d) w/ E8 `* H! y$ mdef spider(video_list):
% u2 |3 |6 }$ V- B4 f( C url = 'https://www.bilibili.com/ranking?spm_id_from=333.851.b_7072696d61727950616765546162.3': i" }6 |1 D! E$ P' ~4 i; U
html_data = requests.get(url).text
; f/ y3 Y9 \/ r- M; n/ T: Q+ ] selector = html.fromstring(html_data)2 u3 E9 U+ \9 n* F2 }! f; j3 A6 |/ _% t
infolist = selector.xpath('//li[@class="rank-item"]')1 S1 z( t: v9 g L3 u' C' A3 Q+ w
for item in infolist:
7 N$ o1 s2 |" e, F# ^" L; L rank = "".join(item.xpath('./div[@class="num"]/text()'))
~/ T) i% n0 _/ W( |& u& m* Q1 l videolink = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/@href'))
4 O( r5 z$ o. K7 ~0 L9 P; Y title = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/text()'))
* h; p* Z* X& X playinfo = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/span/text()')).split("万")
, N5 _8 z% D8 h play = playinfo[0] + "万"4 O4 k5 S6 y) {$ w; i- J8 |/ G2 P4 L
comment = playinfo[1]
/ I$ w% z _/ I1 A! ` if comment.isdigit() == False:
2 O2 d+ i4 H* p' d comment += "万"& v d5 A. P3 ?* D% N
upname = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/span/text()'))7 k3 f/ M) }: x# W" {( i
uplink = "http:" + "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/@href'))
6 T! c- l% o" U0 ^. }+ S) y hot = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="pts"]/div/text()'))
; a& `/ \8 Z8 [ video_list.append({, s5 Q$ `, y D: O$ Y
'rank': rank,
2 J) m# E9 x8 R! S: b& P 'videolink': videolink,! T' t5 V' o* Q2 b/ _, K$ Q/ w1 u
'title': title,' ]) l1 @3 O- @" y, M) S
'play': play,
) a; N. q5 u, M% Y, E# z; d2 \2 i 'comment': comment,
% K4 {" W; \. r' O 'upname': upname,
0 T# \; E1 {6 O# Z# s 'uplink': uplink,8 e0 U3 R! R" K; a
'hot': hot( z* C8 S) o, _3 e3 t
})" a) i8 P6 f$ Z1 X: A
return video_list
; p2 U0 D7 {. Y8 y- U
' u, \( k! a8 {$ v! N# 将爬取到的数据写入Excel表格
7 s# H b7 G# Rdef write_Excel(video_list):9 L1 v. B' w$ E, E: A! G
print("将b站热门视频信息导入到Excel表格:")
* p7 D9 h3 ]! s4 S3 p' G workbook = xlwt.Workbook() # 定义workbook' @' d. N2 X5 W4 L
sheet = workbook.add_sheet('b站热门视频') # 添加sheet
% n; y l t6 F4 v8 @ O) `) I* C xstyle = xlwt.XFStyle() # 实例化表格样式对象
/ Q" V2 ?6 g/ B" F5 F& E, ]! v xstyle.alignment.horz = 0x02 # 字体居中
3 ^& w+ d& [5 P, j, d xstyle.alignment.vert = 0x01 # 字体居中
1 n8 N2 y) h# O' f6 \ head = ['视频名', 'up主','排名', '热度','播放量','评论数'] # 表头# L# c" t( E. g8 X. Y+ G0 P- t
for h in range(len(head)):9 G% `1 B% N# C, T& F
sheet.write(0, h, head[h],xstyle) # 把表头写到Excel里面去3 }- H, W l: Q0 M5 s
i = 1
+ r+ s% g* G* K' ]& }3 E for item in video_list:
1 ^' W) C' o1 r0 e* G$ j& M # 向单元格(视频名)添加(该视频的)超链接
( u* M1 B0 ~4 o" u$ M% {1 | title_data = 'HYPERLINK("'+item["videolink"]+'";"'+item["title"]+'")' # 设置超链接- a; V1 ?+ O) C5 j; s4 [% F
sheet.col(0).width = int(256 * len(title_data) * 3/5) # 设置列宽 Z/ E2 F: q( X7 R
sheet.write(i, 0, xlwt.Formula(title_data), xstyle)
1 i7 N' Z+ X4 T& S name_data = 'HYPERLINK("' + item["uplink"] + '";"' + item["upname"] + '")' # 设置超链接8 S( T4 v5 O. W: @ [
sheet.col(1).width = int(256 * len(title_data) * 3 / 10)5 q4 f" E. X& j0 O
sheet.write(i, 1, xlwt.Formula(name_data), xstyle)0 K0 |4 R" {6 R6 O6 O$ t0 {! ^
sheet.write(i, 2, item['rank'], xstyle)
8 x# s1 q, Y- H8 k4 v sheet.write(i, 3, item['hot'], xstyle)
7 C# i3 `- |/ ]7 V, F" R sheet.write(i, 4, item['play'], xstyle)
6 R+ U0 r6 D* M6 } sheet.write(i, 5, item['comment'], xstyle) p" E1 V; j* f
i += 1
9 `+ A+ Z- Q! z # 如果文件存在,则将其删除: e: r9 P. Y8 v- L# \9 b
if os.path.exists('D:/Test/b站热门视频信息.xls'):( r D, o1 n A" L0 Z3 y
os.remove('D:/Test/b站热门视频信息.xls')5 _. ~+ ^" Q* Z1 s! x+ _! `
workbook.save('D:/Test/b站热门视频信息.xls')2 k: s) Y3 t3 Y8 X1 r) L' [
print('写入excel成功')
6 K2 {$ w( }; x& ~7 q/ D print("文件位置:D:/Test/b站热门视频信息.xls")
* W6 s7 c$ w2 v8 V; q7 P- O
- @/ V2 C. ^2 g! b3 g3 ]if __name__ == '__main__':6 m6 ^0 v( W% S) Q% Q
video_list = []
; ?# @# N. C" v6 k1 N write_Excel(spider(video_list))
8 s @8 t: N2 \$ H- A: X+ R
( F/ m! K# G0 t4 {" b* L5 p# A' L% y+ ?; i
4 F. d$ h& Y' w9 f# b4 N
+ ]" H- |6 W% k j9 o* [& |7 q: Z/ c1 Y, E% A) c
|
zan
|