QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 4449|回复: 0
打印 上一主题 下一主题

Python 爬取b站热门视频信息并导入Excel表格

[复制链接]
字体大小: 正常 放大
杨利霞        

5273

主题

82

听众

17万

积分

  • TA的每日心情
    开心
    2021-8-11 17:59
  • 签到天数: 17 天

    [LV.4]偶尔看看III

    网络挑战赛参赛者

    网络挑战赛参赛者

    自我介绍
    本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。

    群组2018美赛大象算法课程

    群组2018美赛护航培训课程

    群组2019年 数学中国站长建

    群组2019年数据分析师课程

    群组2018年大象老师国赛优

    跳转到指定楼层
    1#
    发表于 2020-3-30 11:09 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    Python 爬取b站热门视频信息并导入Excel表格7 W. A( T: z! |/ Q  t6 |; p
    效果图:
    2 m. T4 d, z+ H; U) i/ y 1.png
    , I7 ^+ Q+ M% Q; S1.工先利其事必先利器,首先我们得下载相应的库:
    8 V; D$ i7 P1 N" [/ J2 upip install requests" J- t: E9 s; q; z3 I
    pip install lxml
    8 P( H- o5 O5 N1 k$ }pip install xlwt: `+ M3 t- s" F( E1 A

    ) Z/ B! S# `3 o/ s' n' m) h2 r$ U$ B" P
    requests 向网页发送请求& Z2 t  N6 \% C, M# W; ?) Y
    lxml 处理xml文件(xpath)
    $ u3 n5 _) [+ U( g! gxlwt 对Excel做写入操作8 U: N3 s' j! i' p0 Z) _( c3 O. ?
    2.爬取b站热门视频的信息:
    5 Z5 G. u$ Q" h% W8 Y+ c) Z  打开b站热门视频页面:
    + `9 Z. c, O- N0 i' j 2.png
    # B- {0 ^! i* ?) `7 E/ y) j  按f12进入开发者选项,然后点击选中你要获取的页面信息,即可找到该信息在该HTML文件中的什么位置(这对我们用xpath获取元素属性和元素值很重要),例如:
    $ w( a# o7 I8 l* f* t 3.png ! u, A7 M7 A, X* A) t+ N1 u/ X
    代码如下:# N4 l" B( x" m5 u" u' K' r
    # 爬取b站热门视频信息4 V( }- a% a4 q6 K9 }* R
    def spider(video_list):
    * t" K! x0 S& Q# ?    url = 'https://www.bilibili.com/ranking?spm_id_from=333.851.b_7072696d61727950616765546162.3'7 U, j( T. G# {* ?5 f
        html_data = requests.get(url).text
    1 W, J  h: o# x* p    selector = html.fromstring(html_data)( A' t5 t/ K  ]7 f% j2 S
        infolist = selector.xpath('//li[@class="rank-item"]')
    7 b) }2 R" T+ m4 N    for item in infolist:6 Q) z" z: K5 r9 X5 [) r
            rank = "".join(item.xpath('./div[@class="num"]/text()')). z% ]. B: w6 O- H, Q
            videolink = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/@href'))) p" i* @; _& ~% t5 d* [
            title = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/text()'))) ^; b% d4 e, d
            playinfo = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/span/text()')).split("万")
    ! ]* T! K; ?; d2 u$ e2 y. m        play = playinfo[0] + "万"/ A$ M: O# O' ?! ~/ }! A% G
            comment = playinfo[1]
    5 N$ U* o. c# q9 n        if comment.isdigit() == False:6 @8 r# K1 ^5 U4 _& o
                comment += "万"2 ]3 {1 Z& ^; [( D" v( j% C
            upname = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/span/text()'))
    . X( X. e; d# m" `0 \. S2 ^: V. N$ l        uplink = "http:" + "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/@href'))
    * G, z0 _, F  u* {        hot = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="pts"]/div/text()'))
    8 A6 `$ K' w: U" V        video_list.append({
    , j4 I- Z; L* p            'rank': rank,
    + P" a- s+ x( b% y            'videolink': videolink,4 ]5 U8 c% u5 ]/ P% x
                'title': title,
    ( ^' D, V. Q$ {+ J* y; l: M( r            'play': play,
    ; p* ~6 Z' _- G4 v' Y& S* }5 _, d            'comment': comment,
    ( Y; F) Q; f. ]7 F/ N            'upname': upname,
    ! G, D  }# R3 M2 z            'uplink': uplink,* d$ c, k1 Q# E
                 'hot': hot; L0 s) i& m7 [+ ^
            })' y; [' S4 d) J  S5 D7 B
        return video_list" L% g9 A3 ], ]/ u8 t2 n3 X  A/ X
    " T! Z0 z; |7 o2 Y

    . H6 s& F2 b+ o. F0 m3.将我们拿到的信息集合(video_list)写入到Excel表格中:& T! f7 V3 {0 I2 _6 \3 d2 U
      xlwt的基本使用方法:0 |) B" }1 Q& n, d$ A& ?8 C! k% M- D
    import xlwt* _, @* `$ N' E3 f- {, m
    # 创建一个workbook (并设置编码)
    , P3 x! o3 `+ L3 a" }3 }$ Pworkbook = xlwt.Workbook(encoding = 'utf-8')& Q9 y5 X3 G3 V: J  N  C
    # 创建一个worksheet
    ) v# c; X$ M$ xworksheet = workbook.add_sheet('My Worksheet')5 x0 ?/ i" C$ \1 e: t

    & J0 ^% c; N, x; S8 ]6 a# 写入excel! V. S+ V3 `0 K7 [5 e3 r% D
    # 参数对应 行, 列, 值,(格式); L8 u! ?9 r# c' U8 v. U
    worksheet.write(1,0, label = 'this is test')
    / s, G5 g" V* s9 L3 G6 ]# 保存9 E3 f: z6 F" L. @* C5 _4 h0 L* I, j
    #参数为你保存该Excel文件的路径
      K5 d8 u& K- Nworkbook.save('Excel_test.xls')
      ^5 h# W' ?' I0 l) J0 t# j7 n& d1 l% L' o& K# |

    1 |/ j( ~4 l* o/ S) D& H  如果我们想要点击视频名或者up的名字可以跳转,那么我们就要使用Excel表格的HYPERLINK方法:
    : Z, R. y2 F. f. S: q+ pHYPERLINK(“http://www.baidu.com” ; “百度”)
    3 m7 j# B& N+ {/ I* p% u百度为显示在单元格的信息,而前面的链接为跳转链接。
    0 b+ V. b, J& ~( x6 n. n& exlwt.Formula()方法需要传入一个字符串s,s=‘HYPERLINK(“http://www.baidu.com” ; “百度”)’。
    ( F+ b% A* r8 c" B5 K, }- R代码如下:! E% S. ~% x( r0 p- E
    # 将爬取到的数据写入Excel表格5 p$ R0 R8 h  u1 S  v5 ]1 A/ u
    def write_Excel(video_list):' L2 B8 R8 B8 N/ d, I" P
        print("将b站热门视频信息导入到Excel表格:")
    9 b& _' Q8 S6 J( e0 r  j2 d    workbook = xlwt.Workbook()  # 定义workbook
    . Y; P0 J9 o: w  d- o    sheet = workbook.add_sheet('b站热门视频')  # 添加sheet
    3 J% k& v" [) F1 X    xstyle = xlwt.XFStyle()  # 实例化表格样式对象
    " [0 p! ~7 k' W% T0 g9 [- O    xstyle.alignment.horz = 0x02  # 字体居中
    / U  O: W! p: e, \    xstyle.alignment.vert = 0x01  # 字体居中, O4 H3 H3 Y4 R, m! ?
        head = ['视频名', 'up主','排名', '热度','播放量','评论数']  # 表头
    0 R/ E2 l, L- c& Y) k2 @    for h in range(len(head)):
    . |. u; u6 A) _! u! @+ R        sheet.write(0, h, head[h],xstyle)  # 把表头写到Excel里面去
    $ ^3 f  [0 u- A    i = 1% c+ Z2 F* b; l7 \, K7 p" W0 ]6 C/ |
        for item in video_list:9 V; U  K) g: R  C6 r6 _+ b
            # 向单元格(视频名)添加(该视频的)超链接- h8 Z) T, [2 c% T
            title_data = 'HYPERLINK("'+item["videolink"]+'";"'+item["title"]+'")'  # 设置超链接
    : j1 O; m6 ~- n        sheet.col(0).width = int(256 * len(title_data) * 3/5)   # 设置列宽1 Q2 E1 {( N0 Y2 S/ P# o7 Y
            sheet.write(i, 0, xlwt.Formula(title_data), xstyle)/ x. U3 a5 I6 g* I& ?
            name_data = 'HYPERLINK("' + item["uplink"] + '";"' + item["upname"] + '")'  # 设置超链接9 _; l. j- X! B; Z
            sheet.col(1).width = int(256 * len(title_data) * 3 / 10)# t4 t. ?/ d- H; f
            sheet.write(i, 1, xlwt.Formula(name_data), xstyle)
    % {/ Y$ n) B/ p8 x+ T5 _        sheet.write(i, 2, item['rank'], xstyle)
    5 v3 o/ x5 J" L/ g        sheet.write(i, 3, item['hot'], xstyle)
    * W. C& O/ Y7 w$ t: K- d9 ]        sheet.write(i, 4, item['play'], xstyle)4 R9 C5 S% P  u/ f
            sheet.write(i, 5, item['comment'], xstyle)
      Z1 N0 `( V8 f4 a& u- @' i        i += 1
    % _( i5 y5 h4 ]" \$ ^    # 如果文件存在,则将其删除* T! {2 i; n/ o- H2 }
        if os.path.exists('D:/Test/b站热门视频信息.xls'):
    $ V" _0 K" Z. n4 b, ^        os.remove('D:/Test/b站热门视频信息.xls')
    0 n- P  r8 z) |    workbook.save('D:/Test/b站热门视频信息.xls')9 Q! E- K% ?# A1 n% h# t1 C
        print('写入excel成功')5 }1 o$ @& ?* }$ E
        print("文件位置:D:/Test/b站热门视频信息.xls")
    ! V, r1 Y7 i9 D# G9 N2 O
    6 [6 m& I8 d4 n
    7 z% n4 K, t- \7 s4.在入口main中调用上面两个函数' f. t1 x% }+ t! E$ W
    完整代码如下:
    7 Z9 j$ I/ Z. Cimport requests
    " a( M  w" _2 d+ _8 C9 a6 L7 ^$ jfrom lxml import html. V, B$ ]6 x6 ]6 d6 |
    import xlwt! S9 E4 W) H, f. w
    import os7 r8 i8 \: G% q% R4 [8 v

    ' y# n# c1 v: J% r& Z# b; h# 爬取b站热门视频信息" m8 l9 L  r' i" `5 F- r
    def spider(video_list):4 \' `: f) X1 F
        url = 'https://www.bilibili.com/ranking?spm_id_from=333.851.b_7072696d61727950616765546162.3'
    ! @9 ^2 `0 T2 m6 T/ p    html_data = requests.get(url).text/ G) A% l% ]- q% S8 ?
        selector = html.fromstring(html_data)9 O0 m: j( I) S
        infolist = selector.xpath('//li[@class="rank-item"]')1 w: C# \& K! D; S0 C
        for item in infolist:$ s" _: Y( P9 ]6 \3 F' n2 X8 y
            rank = "".join(item.xpath('./div[@class="num"]/text()'))
    , o+ k0 y* a5 ?        videolink = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/@href'))( s+ G( G4 _3 L  `6 m9 O7 f
            title = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/text()'))' i1 C  Y" ]) `" r5 M6 o
            playinfo = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/span/text()')).split("万")
    ( Q3 j* \  K5 T5 v9 k3 S% ?        play = playinfo[0] + "万"
    ) s$ H( H! A5 x  `) z        comment = playinfo[1]
    : ?1 [0 |" h% X% p8 h        if comment.isdigit() == False:
    * f( a7 ?( g. o7 K# N* t            comment += "万"+ U' b: A/ g! Q
            upname = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/span/text()'))
    9 ?& g9 j! H; A8 N( s- _        uplink = "http:" + "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/@href')), N5 r5 x9 Q8 [, {  S( w
            hot = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="pts"]/div/text()'))
    - Y- t7 m+ y! d8 k0 p        video_list.append({
    ! `' b5 `2 G7 U$ ]            'rank': rank,& L4 z5 a! w; f2 ?7 m
                'videolink': videolink,
    / [) m1 c4 Z  S" [/ c6 C            'title': title,9 q0 I# _# Z2 M. ]
                'play': play,
    6 C7 D4 I4 W. f0 ~4 x0 I            'comment': comment,
    6 d9 n7 }$ ?; x; {/ t' n            'upname': upname,4 c4 }$ j! {/ |" O2 U+ u/ m
                'uplink': uplink,
    5 b- R4 k* ]" |0 p             'hot': hot
    % a. U/ C% r7 @& Y! D2 q  D# F        }), ~% F+ I, k7 o
        return video_list
    1 |  h4 r, h9 K2 Y( y& Z7 d
    " R0 a3 D* ?+ y2 g' v1 Z4 [8 i# 将爬取到的数据写入Excel表格, ?; ?6 `4 f  u* i1 c; N
    def write_Excel(video_list):
    " l4 T. w3 o" f8 t    print("将b站热门视频信息导入到Excel表格:")
    # I8 S6 t6 t/ D* v% m( Y9 @( [& `    workbook = xlwt.Workbook()  # 定义workbook# N1 C% Y. e0 S) V3 ?5 W% y
        sheet = workbook.add_sheet('b站热门视频')  # 添加sheet
    3 _- u5 P2 ]$ e' X; ~    xstyle = xlwt.XFStyle()  # 实例化表格样式对象
    / p: i- X. s5 T- f, {    xstyle.alignment.horz = 0x02  # 字体居中6 U, U. q. v$ _$ I, Z
        xstyle.alignment.vert = 0x01  # 字体居中
    / T: b9 p. Q( B  n    head = ['视频名', 'up主','排名', '热度','播放量','评论数']  # 表头
    9 S, U8 M( {/ x    for h in range(len(head)):6 j% n% }0 k- [4 P  A2 ]
            sheet.write(0, h, head[h],xstyle)  # 把表头写到Excel里面去3 Y" h1 H% Q5 H0 T- K' E1 \3 z# b
        i = 1% u6 u! X) e: E  w
        for item in video_list:
    + G& h5 b- W( H2 ]  a4 G        # 向单元格(视频名)添加(该视频的)超链接
    : f, W5 I% i' Z. ]5 b1 i        title_data = 'HYPERLINK("'+item["videolink"]+'";"'+item["title"]+'")'  # 设置超链接
    8 K1 I6 ^  B( v7 c2 L        sheet.col(0).width = int(256 * len(title_data) * 3/5)   # 设置列宽
    9 X; V1 k+ W0 i- i: V        sheet.write(i, 0, xlwt.Formula(title_data), xstyle)9 t1 i* M2 |8 h1 S
            name_data = 'HYPERLINK("' + item["uplink"] + '";"' + item["upname"] + '")'  # 设置超链接0 x: y3 L$ W9 r
            sheet.col(1).width = int(256 * len(title_data) * 3 / 10)# K3 ]* n, n, p. Q% ?
            sheet.write(i, 1, xlwt.Formula(name_data), xstyle)! s+ F! ]* I; }" p5 R, A6 I
            sheet.write(i, 2, item['rank'], xstyle)4 ?+ w, |3 B2 j# _
            sheet.write(i, 3, item['hot'], xstyle)8 ~' h5 f! k+ v8 u1 m
            sheet.write(i, 4, item['play'], xstyle)
    ) E  Q' y$ I. m: U# x; F        sheet.write(i, 5, item['comment'], xstyle)( u4 X7 Q7 k* o1 _/ L
            i += 10 w+ I; |7 G/ j3 X6 r2 X# r/ \
        # 如果文件存在,则将其删除
    7 T# ]& H8 b0 ^- t2 }" d* s    if os.path.exists('D:/Test/b站热门视频信息.xls'):
      h3 f4 I- Y/ e% G& e1 A3 O        os.remove('D:/Test/b站热门视频信息.xls')5 E" P$ A4 j2 J2 E# a# K2 b
        workbook.save('D:/Test/b站热门视频信息.xls')
    , n. M# {, Z* p2 k    print('写入excel成功')
    * S7 b2 m" b, I, Z4 c    print("文件位置:D:/Test/b站热门视频信息.xls")
    : M8 }! x4 G8 _+ y; w: T6 Q
    1 b1 }' f1 C9 T& |; nif __name__ == '__main__':; _" D8 Z, r2 t: K' g% d
        video_list = []0 E- `+ {0 S# l6 V% r
        write_Excel(spider(video_list)). f! n% `4 V3 h

    3 B9 P4 J" P6 g4 h4 t
    ! x  I% A/ \- V3 u0 W) `. K$ R' \, w# t2 K7 q
    + z; A3 q3 d- e$ e) r0 M# f
    * X+ w' m/ d5 k
    zan
    转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
    您需要登录后才可以回帖 登录 | 注册地址

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

    关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

    手机版|Archiver| |繁體中文 手机客户端  

    蒙公网安备 15010502000194号

    Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

    GMT+8, 2026-7-18 11:01 , Processed in 0.440965 second(s), 54 queries .

    回顶部