QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 4414|回复: 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表格
    , C! l, O  S2 O' s+ k效果图:# r$ J% m1 u9 d/ o
    1.png
    5 L& s# J! R8 r0 K. I& `1.工先利其事必先利器,首先我们得下载相应的库:
    ' K5 x' }  r: q# vpip install requests: }  P1 |; T8 V$ w% |% m
    pip install lxml5 H+ P0 ?  R  I7 s( P/ Y; U
    pip install xlwt
    % H! i9 U0 Y# W4 f
    3 W: v( v) {* f1 v, U9 C: u
    / Q. M5 A! x% }2 J8 v! E/ R( ~0 P: xrequests 向网页发送请求
    # u! E+ X+ i) E1 |* R( E0 Nlxml 处理xml文件(xpath)
    6 S. N& ?% y3 X$ exlwt 对Excel做写入操作' Z$ a2 [, |' M' G' p
    2.爬取b站热门视频的信息:
    7 ]7 F& B8 s- @3 C' {, U$ N  打开b站热门视频页面:6 C* M7 m% \# j$ j( f$ `: O
    2.png . U/ ^. m- p% N8 B5 M# z7 E- T
      按f12进入开发者选项,然后点击选中你要获取的页面信息,即可找到该信息在该HTML文件中的什么位置(这对我们用xpath获取元素属性和元素值很重要),例如:) g% M1 B& n1 R$ l0 }
    3.png + l, N( ?+ y. B6 o
    代码如下:
    $ _7 ~* T/ G) D  u5 L6 H# 爬取b站热门视频信息; C$ P- e0 J3 s) `  _  a+ N8 C, r
    def spider(video_list):$ ^3 _5 l6 t  n
        url = 'https://www.bilibili.com/ranking?spm_id_from=333.851.b_7072696d61727950616765546162.3'% Z6 f9 k/ A, T* J. [. e
        html_data = requests.get(url).text$ D9 J2 Z. V, S- a2 d6 a
        selector = html.fromstring(html_data)
    , Q) I; E9 [- t# x) u+ {' ?    infolist = selector.xpath('//li[@class="rank-item"]')( f' Z# b4 G/ G
        for item in infolist:
    % F  {0 b" d( w8 Z- U        rank = "".join(item.xpath('./div[@class="num"]/text()'))
    1 }9 }* O" T1 O, w- x# K        videolink = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/@href'))  [( k8 d' Z7 \, M% j( S+ z
            title = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/text()'))# o7 |% E3 M, P3 w
            playinfo = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/span/text()')).split("万")
    ' O+ J0 g, ?# z2 s        play = playinfo[0] + "万"* T1 \( I9 M8 Q5 o
            comment = playinfo[1]
    . D' z7 P, F: ]: y+ n5 F% B        if comment.isdigit() == False:1 w, h- j$ e2 F4 \! \5 X
                comment += "万"
    % j: \3 Q8 D1 ~: A" l0 L5 C6 W        upname = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/span/text()'))/ S/ e$ p% H0 i3 p' @; u
            uplink = "http:" + "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/@href'))
    8 s/ Y( m) ?/ H6 F+ N$ \        hot = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="pts"]/div/text()'))  s0 ]$ s) @/ |; z4 q# G
            video_list.append({5 q: G: a% _+ q# Y
                'rank': rank,: l) G4 e( E- l; [  J! H! ^
                'videolink': videolink,8 \/ E6 S4 `$ f* `
                'title': title,
    9 J& G4 O& |4 t# u8 E% F2 E            'play': play,
    / U5 u1 p1 O) {" @7 O            'comment': comment,- `9 k4 F, t/ m/ i8 P
                'upname': upname,& e' |! E; ]8 b5 a1 S0 R6 K
                'uplink': uplink,
    - }8 ]' D! c6 M: H6 `4 m! Z             'hot': hot& L: q5 R0 P3 J. P. {
            }); \* k4 d; O" J4 u9 ~0 W
        return video_list
    ' ?7 d' U" `4 l; L( V. v
    4 w& X2 E# J8 U( G8 b9 z+ K! l
    ) [% }7 s( r5 P; m& M% O
    3.将我们拿到的信息集合(video_list)写入到Excel表格中:% n+ H+ H  Y3 u; C( q0 a- G1 `
      xlwt的基本使用方法:6 p' ]% }) a+ ~# a+ B; J: y
    import xlwt! @' `$ v7 Z7 F6 x
    # 创建一个workbook (并设置编码)1 _( w1 p9 |' l* ?& [
    workbook = xlwt.Workbook(encoding = 'utf-8')  H% a# r, t( U* n
    # 创建一个worksheet0 f, }3 s" Z4 B# y" ?, k1 y4 B
    worksheet = workbook.add_sheet('My Worksheet')
    , G1 e/ J1 ~' h; e- _; _
    : y9 Y$ m% g4 ?3 Q- k9 E% Y% R# 写入excel
    , X# Y- y7 C3 @$ T+ x: g0 H" e# 参数对应 行, 列, 值,(格式)( e9 j+ n1 B. W, M! |" r3 _
    worksheet.write(1,0, label = 'this is test')
    7 |# y! P; U/ H. H' M# 保存8 x. ?6 e0 B* f8 O/ Y
    #参数为你保存该Excel文件的路径; K- D& C% `2 I' y
    workbook.save('Excel_test.xls'): K2 ]$ J) J" p  H

      X  e6 v: f4 u, \* x; ]" I% I  A( m% q1 E1 C8 r* W3 V
      如果我们想要点击视频名或者up的名字可以跳转,那么我们就要使用Excel表格的HYPERLINK方法:
    / j5 {+ j$ _, Y: ]5 H9 S- iHYPERLINK(“http://www.baidu.com” ; “百度”)
    9 g; r3 }6 `; y- i, o3 ?: s/ s百度为显示在单元格的信息,而前面的链接为跳转链接。
    2 n; T* k. w7 G' P% g! D+ axlwt.Formula()方法需要传入一个字符串s,s=‘HYPERLINK(“http://www.baidu.com” ; “百度”)’。' Y3 n% J3 U" B
    代码如下:
    2 ]+ M6 b; D7 r. c! Q8 f$ V# g, U# 将爬取到的数据写入Excel表格7 X- e% X" v) {, m9 Z# Z
    def write_Excel(video_list):- |4 W  U+ C- H, D
        print("将b站热门视频信息导入到Excel表格:")
    5 T: E& o. h' w. ?    workbook = xlwt.Workbook()  # 定义workbook  R: X. r' J5 l0 i1 T; E2 r
        sheet = workbook.add_sheet('b站热门视频')  # 添加sheet
    & n4 W* z$ @% a+ e' e; L# r! z    xstyle = xlwt.XFStyle()  # 实例化表格样式对象
    1 H' [0 x- y& N    xstyle.alignment.horz = 0x02  # 字体居中
    1 D5 ^/ U! ?; f0 u    xstyle.alignment.vert = 0x01  # 字体居中& t0 y4 M7 [# C) Y  b  C" R
        head = ['视频名', 'up主','排名', '热度','播放量','评论数']  # 表头
    . i/ s+ |) ?* m    for h in range(len(head)):
    8 d% f  Q6 j3 ]* K, i, F7 j        sheet.write(0, h, head[h],xstyle)  # 把表头写到Excel里面去+ O  m  l' `$ |$ C* [) g/ g9 s# Y$ I
        i = 1
    3 l& F( l5 R3 u* c& T# J5 W    for item in video_list:- n2 t2 u* S% N; ?4 l, c
            # 向单元格(视频名)添加(该视频的)超链接
    * z* R9 m6 q9 ^0 r2 |. p        title_data = 'HYPERLINK("'+item["videolink"]+'";"'+item["title"]+'")'  # 设置超链接. L/ o0 P* T6 m8 @
            sheet.col(0).width = int(256 * len(title_data) * 3/5)   # 设置列宽1 I2 c& x9 |1 d9 b, i  R
            sheet.write(i, 0, xlwt.Formula(title_data), xstyle)
    : c9 i( z, ^: b8 [        name_data = 'HYPERLINK("' + item["uplink"] + '";"' + item["upname"] + '")'  # 设置超链接
    9 E" n* j: d4 j& |0 L' W! R        sheet.col(1).width = int(256 * len(title_data) * 3 / 10)( H5 W& X2 ?  m$ A; J8 P
            sheet.write(i, 1, xlwt.Formula(name_data), xstyle)$ p: f9 k+ g7 P! E- }+ F0 p
            sheet.write(i, 2, item['rank'], xstyle)& O( d, Q/ d1 ]; S
            sheet.write(i, 3, item['hot'], xstyle)
    0 a1 {0 M+ W$ j; s        sheet.write(i, 4, item['play'], xstyle)
    $ b0 d4 u  b& ~9 c1 j        sheet.write(i, 5, item['comment'], xstyle)
    0 L0 K9 n, \4 y        i += 15 n9 M3 {: R$ p1 G+ T" k& ]
        # 如果文件存在,则将其删除
    6 a. T2 l% C5 @8 {9 `    if os.path.exists('D:/Test/b站热门视频信息.xls'):0 R1 w4 g3 w0 k% j; E
            os.remove('D:/Test/b站热门视频信息.xls')
    : |8 s% u. A. _    workbook.save('D:/Test/b站热门视频信息.xls')) n9 Y8 A: \, z0 s0 {
        print('写入excel成功')/ l4 z" z  k7 ~
        print("文件位置:D:/Test/b站热门视频信息.xls")0 p8 g& r5 u- v% k8 H! E- G/ O

    * g1 ]1 v$ D8 ]+ H( q6 v  g$ M5 [: i' m
    4.在入口main中调用上面两个函数
    - I( L) M% S9 i  K完整代码如下:7 }/ M; c4 v# V" V
    import requests
    7 S+ Y1 \3 T& X# X6 R& afrom lxml import html
    - w7 Y) f1 G8 ^  q. _0 v- ~9 |import xlwt( u! d1 s+ c3 d  Y( k+ N5 q8 z
    import os2 i2 e, Q6 b; h2 L9 Z% X% J

    " X$ {. v1 C$ x, l4 ^* q& w* Q5 R# 爬取b站热门视频信息
    ' d5 A# M' J5 Cdef spider(video_list):
    ( P- M8 P$ i9 ?2 Q1 ^: V    url = 'https://www.bilibili.com/ranking?spm_id_from=333.851.b_7072696d61727950616765546162.3'% O2 }7 n) }6 }/ _8 W$ y
        html_data = requests.get(url).text
      @) K7 g% b5 u, }8 H    selector = html.fromstring(html_data)- l9 B2 m9 R8 E" r* i
        infolist = selector.xpath('//li[@class="rank-item"]')2 J' X1 M/ ~- Z& e3 S; `& T9 A
        for item in infolist:* R$ b1 u: Y1 m) g( E
            rank = "".join(item.xpath('./div[@class="num"]/text()'))4 W7 g' ]7 |" M/ ]% H$ \
            videolink = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/@href'))
    ( c+ c1 N$ ~, {" d6 S) J        title = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/text()'))% G1 J; H& Q8 X- z. W
            playinfo = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/span/text()')).split("万")& `5 M4 C, p2 k1 T
            play = playinfo[0] + "万"
    * {; d1 |% G) O5 {$ A* c  Z        comment = playinfo[1]
    ) W( O6 d4 w1 J1 _: n" E/ r$ h* U        if comment.isdigit() == False:/ _- C# W2 \) E' M7 e4 G7 e- S
                comment += "万"
    6 I6 `( g: J8 f. c; P        upname = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/span/text()'))' N9 W" `5 W; `3 g8 s9 x
            uplink = "http:" + "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/@href'))
    ) t- x' p! `& ?- M        hot = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="pts"]/div/text()'))2 v% `' F) [' t9 G, H, r2 w
            video_list.append({9 D; x7 o* R  p8 Y# T
                'rank': rank,( b7 ~" ^) e$ }) _6 @
                'videolink': videolink,( O" ]4 Z, m6 M' h+ w
                'title': title,
    0 h% w* T3 @/ a' I9 W            'play': play,$ _. ^4 d: S( E* ^4 @3 S. J" X
                'comment': comment,
    % h' \8 c& H+ o0 u' R) c" I% C' Z3 m            'upname': upname,
    ) f  S9 h7 k5 Y; s            'uplink': uplink,
    # _+ y0 B% p6 K2 o, B# x             'hot': hot
    ( R2 y% p2 P5 B/ Y        })' ]7 B7 M5 ~$ M% `& v! t; Q% T$ I# K
        return video_list
    $ @- u* i1 ?: {* b# C5 }8 Q& a. t6 S  d2 L
    # 将爬取到的数据写入Excel表格
    4 e) a- ~( C- b; \4 edef write_Excel(video_list):
    9 e8 }7 e8 ?  |. U  R$ F  S    print("将b站热门视频信息导入到Excel表格:")7 U: M* A5 W! D- o* W- `
        workbook = xlwt.Workbook()  # 定义workbook' J8 X# E2 a: E, \' Y: l. d+ n
        sheet = workbook.add_sheet('b站热门视频')  # 添加sheet
      o: G4 _5 Q0 r# z2 L2 \    xstyle = xlwt.XFStyle()  # 实例化表格样式对象9 c9 m. N+ v' K3 C8 u2 q2 R" ]
        xstyle.alignment.horz = 0x02  # 字体居中  K  m& [! s6 G1 o
        xstyle.alignment.vert = 0x01  # 字体居中$ p# I: C. _" _0 W1 @( K8 t
        head = ['视频名', 'up主','排名', '热度','播放量','评论数']  # 表头
    5 ^; A! T2 b0 C; `/ g    for h in range(len(head)):
    7 r7 R$ T, a7 y( T        sheet.write(0, h, head[h],xstyle)  # 把表头写到Excel里面去& a) a: P5 U' z. l- M
        i = 1
    ; R( p8 h7 r4 t) w2 m) p    for item in video_list:( J* E7 t" B0 n) R, Z1 |7 W4 l
            # 向单元格(视频名)添加(该视频的)超链接! x5 S+ K! X5 e* V, E1 J
            title_data = 'HYPERLINK("'+item["videolink"]+'";"'+item["title"]+'")'  # 设置超链接
    ( G: _1 s6 b9 h$ \1 S        sheet.col(0).width = int(256 * len(title_data) * 3/5)   # 设置列宽
    9 l" c/ F5 V  {7 ?( {( f+ G        sheet.write(i, 0, xlwt.Formula(title_data), xstyle)( ]" C4 |3 B% b' N0 ]5 U1 X
            name_data = 'HYPERLINK("' + item["uplink"] + '";"' + item["upname"] + '")'  # 设置超链接
    9 Q  L  q" _  a, v2 ^        sheet.col(1).width = int(256 * len(title_data) * 3 / 10)
    0 l/ Y9 l, m0 S. C' Y        sheet.write(i, 1, xlwt.Formula(name_data), xstyle)
    - x* _( V' S( @) b1 a' M2 L( D        sheet.write(i, 2, item['rank'], xstyle)
    0 O2 S4 p5 Y2 {& ?+ X7 D& R. o" Y- n% [        sheet.write(i, 3, item['hot'], xstyle)0 {8 e( d. v* A9 H2 Q4 G
            sheet.write(i, 4, item['play'], xstyle)% `( a! |# G  H1 @
            sheet.write(i, 5, item['comment'], xstyle)
    3 K+ q5 A3 R. T7 p- D- l        i += 1
    ) @; c$ E6 ~/ _) F* s1 G    # 如果文件存在,则将其删除4 n! Z7 g* ]6 ^9 b
        if os.path.exists('D:/Test/b站热门视频信息.xls'):0 ^; H' I7 L$ _: C9 o: L
            os.remove('D:/Test/b站热门视频信息.xls')
    4 }4 E& Y9 D) n1 _    workbook.save('D:/Test/b站热门视频信息.xls')
    ! m& M) q- ?7 y. P4 F: M. S2 g" L    print('写入excel成功')$ J: Y; O3 M3 K' V
        print("文件位置:D:/Test/b站热门视频信息.xls")5 B% A7 D  {7 ^
    ; m( H/ f) b. ]+ r4 m) ~( m0 I
    if __name__ == '__main__':
    9 [# \! V$ L3 W  i    video_list = []
    6 T! k+ T+ E! D    write_Excel(spider(video_list))
    ) n9 C+ x* a- R
    / K4 V2 V1 Z( u5 d  P; l0 r  b5 G4 D1 B
    % K$ c- j/ j+ K, T' _3 W% I* ~9 e7 ~
    , N* m/ l0 o6 G, A0 B' m- i0 h

    , n3 A9 l; f( p# g
    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-18 11:38 , Processed in 0.464244 second(s), 54 queries .

    回顶部