QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 4416|回复: 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表格
    - Y1 t6 w5 K2 L8 q效果图:0 Z& E$ b/ I6 R, g& A4 K7 e" w* g- t
    1.png 9 O5 b4 g" O1 L6 g) Q$ ], ?
    1.工先利其事必先利器,首先我们得下载相应的库:
    , ]7 s0 |% O: K- s. v+ M7 }0 b) v6 Tpip install requests, g! r" @' i) M) N' L  u! o# v
    pip install lxml: B) r" f9 |3 y+ o  `, q
    pip install xlwt; b) X" e# ]3 e5 z" t

    + F/ T2 |/ ~) v  L9 S
    6 j' p" v' l6 G8 Lrequests 向网页发送请求; p) ?1 h$ A8 i8 f& U, _
    lxml 处理xml文件(xpath)
    + \! c+ Q9 G3 U& txlwt 对Excel做写入操作
    . e- W6 Z6 X3 f) @2.爬取b站热门视频的信息:
    3 u( _3 k9 {6 X! x  打开b站热门视频页面:
    / @! z$ O4 i; v, m6 } 2.png
    ' H$ i2 V& t) v1 s( S- b  按f12进入开发者选项,然后点击选中你要获取的页面信息,即可找到该信息在该HTML文件中的什么位置(这对我们用xpath获取元素属性和元素值很重要),例如:# z' Q/ ?/ b) Y- w' g  f
    3.png
    7 s- F' u. o$ b& P0 m+ V3 o代码如下:
    : P# F  o6 U" Q$ z( N3 b# 爬取b站热门视频信息
    , R- \4 u8 l& ?" Rdef spider(video_list):! H3 F$ R% A1 S9 V2 Q6 x# I, V. ^
        url = 'https://www.bilibili.com/ranking?spm_id_from=333.851.b_7072696d61727950616765546162.3'# D8 E( Z- a0 D  ]3 J: I
        html_data = requests.get(url).text
    : |8 u+ V) {1 H! C% j; a2 w    selector = html.fromstring(html_data)
    $ m! K: W0 g: F7 a6 ]- b    infolist = selector.xpath('//li[@class="rank-item"]')
    # H/ u% B: W1 j' h% B& K+ g    for item in infolist:
    / h- D& u8 \9 R5 l        rank = "".join(item.xpath('./div[@class="num"]/text()'))! N  h  I9 n5 q
            videolink = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/@href'))# d6 A5 z! B' f  i
            title = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/text()'))! f! h2 g5 I9 m
            playinfo = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/span/text()')).split("万")  W% k' J! H. ]* i( B6 p
            play = playinfo[0] + "万"
    3 {) e0 m: X. v$ v4 R        comment = playinfo[1]
    4 L7 s; ]- p% v3 i- Y        if comment.isdigit() == False:1 A/ z6 ]- M- N/ A5 F: d
                comment += "万"2 X3 K0 T# q$ o) g# W+ f9 v
            upname = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/span/text()'))
    3 |8 U* f' T! I# m- A, R% p' W$ K        uplink = "http:" + "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/@href'))
    / d0 m+ l) T$ Z9 L! r( e: @        hot = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="pts"]/div/text()'))' q2 q. H% \% W7 o' _
            video_list.append({) w  I  [% l9 M6 m0 E) N. g6 K
                'rank': rank,. ^2 d) Y4 C# a1 H
                'videolink': videolink,
    2 J; l, K% T$ B: C            'title': title,. L/ P: l) a/ w& ?# ~0 k
                'play': play,
    5 z4 u; M) u8 u, h5 \            'comment': comment,* E* k) Y, _1 ]
                'upname': upname,
    0 Z( r6 m* w& Z" q/ t( v            'uplink': uplink,
    ( M5 W% Z# P% G, t( ~             'hot': hot
    9 N3 s7 L3 ~2 F        })
    9 G; ?* F2 S9 i( `/ B) S2 B    return video_list
    ) ^- w( n6 ~0 M& F: y
    + Q  [7 [" j+ z% Z
    2 P# S2 J" @3 ?+ h* t1 N
    3.将我们拿到的信息集合(video_list)写入到Excel表格中:( E' n2 |: q, O4 T7 b& q
      xlwt的基本使用方法:5 {5 x3 V: n+ |! q
    import xlwt' K4 }7 N- x7 a- x$ i! L  V: T
    # 创建一个workbook (并设置编码)& j1 k, `. m! w
    workbook = xlwt.Workbook(encoding = 'utf-8')8 q8 H+ y: _# ]$ B1 f
    # 创建一个worksheet
    , j5 l8 I, g, X7 d' L6 Nworksheet = workbook.add_sheet('My Worksheet')0 \  T  d  I' m4 O& L% ]

    ( L: r$ g' i: |$ O/ w# 写入excel
    3 V4 r4 q) C, L, E# 参数对应 行, 列, 值,(格式)
    / q+ J0 z/ S  |& Y- h! p* w& I% rworksheet.write(1,0, label = 'this is test')+ ]; [( _5 j" k4 ?8 f  T/ L1 w
    # 保存
    & b& Q/ d4 |- j0 E9 ~1 O3 [9 U6 J#参数为你保存该Excel文件的路径: O5 U! s  ^$ {
    workbook.save('Excel_test.xls')
    . n" m* l8 l, ?# b* s  t% Z5 o; y
    4 ~6 o$ B6 W' }# K4 W4 T! x3 B- Y
    - l+ j5 X5 e! a6 G+ X4 f  如果我们想要点击视频名或者up的名字可以跳转,那么我们就要使用Excel表格的HYPERLINK方法:' |3 N$ d* s" Z" v
    HYPERLINK(“http://www.baidu.com” ; “百度”)
    0 x; x5 x+ f/ I" l3 Q& U5 A7 h2 j  A百度为显示在单元格的信息,而前面的链接为跳转链接。
    ' I2 u& a$ ^0 R/ axlwt.Formula()方法需要传入一个字符串s,s=‘HYPERLINK(“http://www.baidu.com” ; “百度”)’。+ _0 V- L& _4 i- U
    代码如下:
    . P8 I; a+ {, ^1 E  t+ o& k# 将爬取到的数据写入Excel表格
    , |+ Q  L" N) J1 }; f. Jdef write_Excel(video_list):
    * u! f1 j* m, }9 p! n2 m    print("将b站热门视频信息导入到Excel表格:")
    . |& ~  k9 K, z- D: N# W: H& P+ H) k    workbook = xlwt.Workbook()  # 定义workbook
    9 `$ m; D. g0 l& W. X    sheet = workbook.add_sheet('b站热门视频')  # 添加sheet4 N2 B) p3 P0 c+ S' _! z; d
        xstyle = xlwt.XFStyle()  # 实例化表格样式对象( y; D% g- h) x7 K7 S6 _* \
        xstyle.alignment.horz = 0x02  # 字体居中
    # F2 P, Q, K) ]$ }$ I8 d/ q0 T    xstyle.alignment.vert = 0x01  # 字体居中
    7 ^/ i) v, T- p4 m; u* ^    head = ['视频名', 'up主','排名', '热度','播放量','评论数']  # 表头
      R* q+ }' L. R    for h in range(len(head)):) K' I. h) `/ C+ p9 y& o7 T: b. b
            sheet.write(0, h, head[h],xstyle)  # 把表头写到Excel里面去
    % W1 m& o" Y* T  V, \    i = 1! T7 m9 W0 Z3 p6 z9 C8 Y! q- C
        for item in video_list:
    " e% Z$ i  D$ D. g; Y        # 向单元格(视频名)添加(该视频的)超链接8 h: I( ^! h, N1 A" }9 \9 X
            title_data = 'HYPERLINK("'+item["videolink"]+'";"'+item["title"]+'")'  # 设置超链接
    ' s7 q' ?1 r8 a* H, V0 C' d% u8 H! |        sheet.col(0).width = int(256 * len(title_data) * 3/5)   # 设置列宽
    / S: a8 q$ @0 ~5 h0 m; Y        sheet.write(i, 0, xlwt.Formula(title_data), xstyle); M4 h, E0 m) k' U# y
            name_data = 'HYPERLINK("' + item["uplink"] + '";"' + item["upname"] + '")'  # 设置超链接5 b2 X( A$ \8 V# i5 E( }# @" _
            sheet.col(1).width = int(256 * len(title_data) * 3 / 10). c. s2 K0 `& J5 }6 E1 N
            sheet.write(i, 1, xlwt.Formula(name_data), xstyle)! b+ o, _. v. `+ H6 U) v4 F+ R
            sheet.write(i, 2, item['rank'], xstyle)5 c' S+ B$ D3 p6 M
            sheet.write(i, 3, item['hot'], xstyle)
    & _8 }9 Q5 K4 [# e) _/ b7 D" ^# H        sheet.write(i, 4, item['play'], xstyle)7 e" z$ n, |2 l+ U/ f" b) n
            sheet.write(i, 5, item['comment'], xstyle)
    ) d# H2 S6 c) w5 \        i += 1) z/ W6 Z) _7 k" b5 E2 y
        # 如果文件存在,则将其删除
    7 b5 B6 U  C) |$ {6 r    if os.path.exists('D:/Test/b站热门视频信息.xls'):
    0 S, M5 d  r" A        os.remove('D:/Test/b站热门视频信息.xls'); t/ }* U2 a/ R. [. T
        workbook.save('D:/Test/b站热门视频信息.xls')
    2 k1 v. M% p/ X    print('写入excel成功')
    : E, Z5 a! U! H" j4 `' S    print("文件位置:D:/Test/b站热门视频信息.xls")
    " v  R% L' U2 n4 e% ?, d# j5 i4 S; P/ M' ?! B" c0 H/ ]: S! ]$ s- k

    " U' X6 S1 }( a4 N3 v4.在入口main中调用上面两个函数) c; v4 A& ]# X5 ]1 v
    完整代码如下:7 y! [6 [8 N+ V3 ~0 u
    import requests4 y1 i8 Y+ C/ I5 _
    from lxml import html2 x3 G& H2 P0 x7 F
    import xlwt
    7 Y0 }! j; ~; L- `: t& ]import os5 |+ i) i' M" [& N. g6 ^) D! k

      x$ D$ Q& P2 k+ o& P( y" `# h# 爬取b站热门视频信息1 N! I) L6 t" y4 @! A: Q/ Q
    def spider(video_list):
    # L% L& a( y' p1 k7 F* e% N" m    url = 'https://www.bilibili.com/ranking?spm_id_from=333.851.b_7072696d61727950616765546162.3'0 b/ @+ l, {  `* e
        html_data = requests.get(url).text
    1 O; E+ u/ U0 [. M    selector = html.fromstring(html_data)2 I! a3 Z6 i! z0 J
        infolist = selector.xpath('//li[@class="rank-item"]')! y" b9 v( s( m
        for item in infolist:
    ! }7 W2 s- K9 K- T7 w% K1 v. C$ u        rank = "".join(item.xpath('./div[@class="num"]/text()'))
    7 n% ]; U3 D' X6 E$ J8 d        videolink = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/@href'))
    # d, i3 \6 p% ]: w% e        title = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/text()'))6 |; U" A4 N/ R
            playinfo = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/span/text()')).split("万")3 W& m* \& N, O2 @& {7 P6 y
            play = playinfo[0] + "万"
      I7 W6 T8 N& M4 I' O        comment = playinfo[1]( y# \1 t3 U5 X
            if comment.isdigit() == False:
    % G7 i- `9 Y. S" ]            comment += "万"
    8 n0 F- _+ n. a4 }9 R        upname = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/span/text()'))
    * j9 o# F6 |" {) {6 r        uplink = "http:" + "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/@href'))
    4 o  X$ o7 f  c6 ]3 n# X0 D$ v        hot = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="pts"]/div/text()'))
    5 N0 u& }/ s  T! n: z, p) |        video_list.append({
    , J" w  u3 h3 s6 c. U  }            'rank': rank,
    0 G8 i9 d2 Y" V  A- f! E- V            'videolink': videolink,
    ' `% h: i# a! B            'title': title,
    , `' W: U! G* `' m* Q            'play': play,2 i& E$ y+ j, p+ M0 e; p
                'comment': comment,/ a+ M% E% h; z- A
                'upname': upname,
    0 E: K0 r; q& L            'uplink': uplink,
    2 J8 R1 q6 b, M# o             'hot': hot* ^. Z8 t( O; l1 E1 s/ Z* `, \/ r/ u
            })
    ' Q. i' b6 B5 F1 d    return video_list9 e' b/ |( l5 q
    " K0 Y+ K5 V( L; |' S7 w
    # 将爬取到的数据写入Excel表格4 H7 P) N3 x. H- S
    def write_Excel(video_list):' D9 T3 u- M9 J( l: o1 ]) t
        print("将b站热门视频信息导入到Excel表格:")
    2 u4 |* ]' [* @8 y0 v( z    workbook = xlwt.Workbook()  # 定义workbook
    , k* d$ \0 \6 W    sheet = workbook.add_sheet('b站热门视频')  # 添加sheet
    & F3 _8 ~. X, C$ u    xstyle = xlwt.XFStyle()  # 实例化表格样式对象
    ' f( x9 b1 G; O8 s" \. N* t2 w    xstyle.alignment.horz = 0x02  # 字体居中
    & N% O# O; ~" C    xstyle.alignment.vert = 0x01  # 字体居中( e0 V# c& p! d
        head = ['视频名', 'up主','排名', '热度','播放量','评论数']  # 表头
    ( X  Y# q# R% o8 e/ D( Z0 G& W    for h in range(len(head)):
    . ~( @7 e+ Y* D3 _$ u        sheet.write(0, h, head[h],xstyle)  # 把表头写到Excel里面去
    + W+ g+ x5 Z# U4 H    i = 11 m+ y# f( c/ q9 G$ Q8 w) J
        for item in video_list:# }  n/ d6 O, o! d
            # 向单元格(视频名)添加(该视频的)超链接8 h6 _# L2 R# ?' C. n7 e+ `
            title_data = 'HYPERLINK("'+item["videolink"]+'";"'+item["title"]+'")'  # 设置超链接
    3 `3 Q1 c, \7 d& F        sheet.col(0).width = int(256 * len(title_data) * 3/5)   # 设置列宽5 w  |/ h8 w6 v* O
            sheet.write(i, 0, xlwt.Formula(title_data), xstyle)9 B* R* ^. d/ q) V: _: y
            name_data = 'HYPERLINK("' + item["uplink"] + '";"' + item["upname"] + '")'  # 设置超链接
    6 [1 T) _9 g( g' C8 e( |        sheet.col(1).width = int(256 * len(title_data) * 3 / 10)
    # I8 `7 b5 G0 ]5 J        sheet.write(i, 1, xlwt.Formula(name_data), xstyle)  W7 q2 T( C: z+ }# A) p6 U
            sheet.write(i, 2, item['rank'], xstyle)' _, @) K0 g8 S9 h
            sheet.write(i, 3, item['hot'], xstyle)
    $ q1 e/ Q6 g! c: N$ F        sheet.write(i, 4, item['play'], xstyle)* Y! w9 M. r) g/ W) p* N
            sheet.write(i, 5, item['comment'], xstyle)8 N: r4 L% n5 [1 P8 z4 s7 a1 l
            i += 1
    1 A, C2 s( x4 J. K    # 如果文件存在,则将其删除# E( _/ O' o4 p7 z5 R
        if os.path.exists('D:/Test/b站热门视频信息.xls'):( e; L( H& @; K3 c
            os.remove('D:/Test/b站热门视频信息.xls')3 h+ V8 Q$ Z% q: B2 C3 z5 u; P! `
        workbook.save('D:/Test/b站热门视频信息.xls'): R( d) |0 ^) v$ H
        print('写入excel成功')# _- O# ]2 D- ?$ Y  R
        print("文件位置:D:/Test/b站热门视频信息.xls"); I. P& M, y6 v  \5 z: [5 ~

    5 N5 y% x! v$ Z7 v8 V$ A# Jif __name__ == '__main__':/ S0 q, B+ v% j! a
        video_list = []$ G9 o0 A" S1 ^: G
        write_Excel(spider(video_list))" B( B+ @$ s3 U4 z0 @0 e9 u$ H
    # k  p" X2 O" q$ K& E8 N

    4 h5 d' q: Y0 a) ^
    6 {) `' V9 K/ `- [4 a* ?$ ^7 d. y' X* R! X* u# u

    0 s5 g% ]. m/ y- I  T' r
    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-4-19 05:32 , Processed in 1.562527 second(s), 54 queries .

    回顶部