QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 4448|回复: 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表格% t& }6 N) a: R# R* [) Y
    效果图:/ t0 A! X8 A' r' c' c
    1.png
    ) }1 \8 V3 N+ d/ U3 l5 V1 |  l1.工先利其事必先利器,首先我们得下载相应的库:
    3 u) ^. N9 t6 [2 j% I+ vpip install requests6 G6 s, y$ k/ k4 o
    pip install lxml
    8 V' Y2 i& V( i/ |" vpip install xlwt) N/ _* e; _* _! T' k2 T- O

    : j, a1 F& c+ w7 D( Z0 |$ u& t! z' N/ g' ?* S( x; v
    requests 向网页发送请求
    9 s$ H0 r9 B' a  L5 h+ Vlxml 处理xml文件(xpath)
    * Y; K* [& w4 v: N1 B; |/ bxlwt 对Excel做写入操作: z% t/ ]; s; S5 Z
    2.爬取b站热门视频的信息:
    , _; K" F, N3 f7 k! y' ?5 U  打开b站热门视频页面:
    # C! b$ g4 H1 ~1 {/ f7 L- {! h  k 2.png
      w+ D+ G( X0 X0 c+ ?2 [  按f12进入开发者选项,然后点击选中你要获取的页面信息,即可找到该信息在该HTML文件中的什么位置(这对我们用xpath获取元素属性和元素值很重要),例如:
    * l. W, I& s0 \3 I* J% E2 e 3.png 6 E; x8 W6 p6 H0 I# E( H
    代码如下:! f: }% y4 b, X0 R
    # 爬取b站热门视频信息
    , ^8 Z  G% M7 @1 c) R* bdef spider(video_list):# K: s) E5 l/ D! W
        url = 'https://www.bilibili.com/ranking?spm_id_from=333.851.b_7072696d61727950616765546162.3'
    " u' I0 X2 r  O* t) N# p    html_data = requests.get(url).text2 P0 t; g- u- ]! ?" {
        selector = html.fromstring(html_data)
    # X2 G: ]$ b7 H    infolist = selector.xpath('//li[@class="rank-item"]')8 Y) B( t9 f/ U# ]& W
        for item in infolist:
    ; \1 }0 z" k7 R( w        rank = "".join(item.xpath('./div[@class="num"]/text()'))( t2 I0 F  v' y1 }1 A, {# u
            videolink = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/@href'))- W( n% Y5 W2 ]
            title = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/text()'))# x5 A. t. v& o7 a, S/ \2 N, s
            playinfo = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/span/text()')).split("万")
    4 v8 P; G& t+ a9 R# R, v4 z3 q        play = playinfo[0] + "万": d6 o3 n" o: I5 E; j; h- T# C
            comment = playinfo[1]
    " L) }7 F4 ~4 |* E  f! N        if comment.isdigit() == False:
    + ]5 s& k5 b5 y0 k* L1 u+ z! R2 Y8 a% g            comment += "万"# D8 E& \6 s: u8 B  E+ Q. O  \
            upname = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/span/text()'))
    7 R9 `4 J1 O1 G. a1 y        uplink = "http:" + "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/@href'))2 T0 E- j$ `- x4 d6 r2 ^4 u
            hot = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="pts"]/div/text()'))6 e% S. Y. l/ @5 Q+ F
            video_list.append({; q0 q5 B1 ]. t" O/ D
                'rank': rank,
    . d+ ?5 d. `- f+ s( l8 P. A            'videolink': videolink,9 U# ?" J$ C- A
                'title': title,
    * I7 G4 b- C, L6 L            'play': play,5 |# Y2 L6 _! h0 |( f) v
                'comment': comment,
    - u7 a) a' G5 R/ |* |  |% ~3 g$ r            'upname': upname,
    , @8 m# t$ ?6 q; ^3 }            'uplink': uplink,
    : A' i# `: `  ~: ]2 f# v4 h. B             'hot': hot6 k3 n- a) u4 S. U) Z& ]
            })
    1 D' V6 ~* s/ S* ^5 H% \" u& o    return video_list  ^" H; x- r! g$ B& I) H# L7 z6 f$ ~

    % ^1 z! X. d1 M5 t% u& b
    0 K9 J- h9 E0 d  P& L
    3.将我们拿到的信息集合(video_list)写入到Excel表格中:
    " p8 D, G  D) t& w7 a  xlwt的基本使用方法:; h* U* F& W# D2 Z
    import xlwt- D# {0 d- v. }! A8 N5 B/ }
    # 创建一个workbook (并设置编码)
    ! G5 o6 L1 {) s8 }' Rworkbook = xlwt.Workbook(encoding = 'utf-8')% e- Q/ Q2 `1 l) r
    # 创建一个worksheet
    ! C$ x4 x% H% y3 k! ~+ Rworksheet = workbook.add_sheet('My Worksheet')3 b& M) m8 K. Z! s/ k1 X

    * G3 g# o! I' p: z0 D$ n5 Q# 写入excel& d/ R/ g/ \3 G) F
    # 参数对应 行, 列, 值,(格式)7 Z1 Q6 X; l6 D1 `+ B/ G6 m) [. _
    worksheet.write(1,0, label = 'this is test')
    8 \1 y% h+ [& ]3 O9 f# 保存$ u3 e  Q' A* w0 k2 b
    #参数为你保存该Excel文件的路径1 d4 B- Q% S6 w4 ?
    workbook.save('Excel_test.xls')
    8 e+ o7 X: l$ ]  j7 Z% k% J. _5 H9 j' g( r$ H2 i& V

    0 ^( S+ r: p& h: @) u. [: b  如果我们想要点击视频名或者up的名字可以跳转,那么我们就要使用Excel表格的HYPERLINK方法:$ P& U( `- z$ q! M6 z
    HYPERLINK(“http://www.baidu.com” ; “百度”)
    - V# I8 M9 Y, H1 I! T' [百度为显示在单元格的信息,而前面的链接为跳转链接。1 f4 Q2 x5 t* `% {. P
    xlwt.Formula()方法需要传入一个字符串s,s=‘HYPERLINK(“http://www.baidu.com” ; “百度”)’。
    : M( F' n& X6 `: E$ O+ ^! V+ y代码如下:
    . q$ C2 Z  h1 {" o+ F9 V1 ?5 C3 J( B" b# 将爬取到的数据写入Excel表格6 |& C) W3 T1 I1 d( m2 ]! f/ k* U0 [
    def write_Excel(video_list):2 |4 h* a# l+ H
        print("将b站热门视频信息导入到Excel表格:")2 ]( X. }- r/ e
        workbook = xlwt.Workbook()  # 定义workbook% Y6 f6 w6 c; D" @8 t
        sheet = workbook.add_sheet('b站热门视频')  # 添加sheet! [/ m5 U* }' J
        xstyle = xlwt.XFStyle()  # 实例化表格样式对象4 `2 d- E! O3 ?! \
        xstyle.alignment.horz = 0x02  # 字体居中2 F$ K+ [& G6 m+ s+ f
        xstyle.alignment.vert = 0x01  # 字体居中
    . o3 I* c. M: P* D0 J  n    head = ['视频名', 'up主','排名', '热度','播放量','评论数']  # 表头' T1 p& v6 n/ \) ~& P+ C0 s& }5 g
        for h in range(len(head)):  H! ?9 o- V& R& J
            sheet.write(0, h, head[h],xstyle)  # 把表头写到Excel里面去% h. P% x4 D. G& X
        i = 1" X" z2 R# U, z) A9 q+ f5 N9 k9 m
        for item in video_list:  I) l0 @1 b* P+ Q& g
            # 向单元格(视频名)添加(该视频的)超链接; I9 i6 [* `6 N1 O( d
            title_data = 'HYPERLINK("'+item["videolink"]+'";"'+item["title"]+'")'  # 设置超链接
    ( C2 b; l. G! ^- A) m) z9 x3 i! Q        sheet.col(0).width = int(256 * len(title_data) * 3/5)   # 设置列宽$ R8 R3 B# G2 W( f& y3 ]
            sheet.write(i, 0, xlwt.Formula(title_data), xstyle)6 A4 `/ F2 x( K
            name_data = 'HYPERLINK("' + item["uplink"] + '";"' + item["upname"] + '")'  # 设置超链接; X6 M6 ^( F1 p! V4 X; u
            sheet.col(1).width = int(256 * len(title_data) * 3 / 10)
    ' t) f2 p7 q* S1 c2 A3 Z8 X        sheet.write(i, 1, xlwt.Formula(name_data), xstyle)6 I  w$ k2 N" H# b7 y8 u( G
            sheet.write(i, 2, item['rank'], xstyle)
    4 [5 J- \- Z6 X0 t% }        sheet.write(i, 3, item['hot'], xstyle)
    # W: \7 B) E+ E% B0 D. d# O0 {        sheet.write(i, 4, item['play'], xstyle). x" b) c" x5 G! M7 f
            sheet.write(i, 5, item['comment'], xstyle)
    % s7 Y7 C+ w' E/ h        i += 1
    ' L  z& [, e8 i# k    # 如果文件存在,则将其删除4 X3 l: o* Z' w& `6 e0 C
        if os.path.exists('D:/Test/b站热门视频信息.xls'):8 `, s7 m: S' o0 ^
            os.remove('D:/Test/b站热门视频信息.xls')1 ~* N. A- h) T( t- [* u1 b
        workbook.save('D:/Test/b站热门视频信息.xls')
    * L  Y) @% f* V9 c, R1 }    print('写入excel成功')9 y5 Z! K7 n5 U2 B/ e
        print("文件位置:D:/Test/b站热门视频信息.xls")6 n( V* `8 F) h0 _( A! s7 S

    % T5 s( o9 o2 W9 m8 p5 c& m; q
    # P7 E% Q% ~) @4.在入口main中调用上面两个函数) C' D4 {* b8 v4 L5 N
    完整代码如下:
    5 K: f& Z' J; q1 nimport requests
    - b6 |( k; c- q' r8 p7 l# X" rfrom lxml import html% Y( |& H9 N* K. D1 k7 _5 _: d7 k
    import xlwt1 {; f0 v  G( Y8 [# y
    import os
    1 |# i1 Y9 @! X  d8 p: H' E* W( c/ T" W' }  r; [
    # 爬取b站热门视频信息% \' j* c2 h' c+ s
    def spider(video_list):. G: M0 W/ K4 B0 m2 j
        url = 'https://www.bilibili.com/ranking?spm_id_from=333.851.b_7072696d61727950616765546162.3'  S' I4 y% M5 `1 O, i, j2 H0 Y0 q5 ]
        html_data = requests.get(url).text
    / y  d% u9 U" x% j    selector = html.fromstring(html_data)
    7 g! @$ t8 c+ l0 d' e3 P7 _    infolist = selector.xpath('//li[@class="rank-item"]')
    ' H& I6 `' d% S* S) y+ O    for item in infolist:
    2 L+ W: r/ G3 b( R1 l; c0 a5 k        rank = "".join(item.xpath('./div[@class="num"]/text()'))
    ; E! u& r  N4 Q/ A2 d        videolink = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/@href'))% `; m) s6 ^$ N* x2 Q. `
            title = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/text()'))
      I( e* d" t" ~! R        playinfo = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/span/text()')).split("万")* q; C: {$ J5 p
            play = playinfo[0] + "万"( t& P1 U6 d3 }( q  ]
            comment = playinfo[1]  z# Y6 V) E7 ]% l; @1 Z/ }
            if comment.isdigit() == False:3 C) U1 r6 V5 H' _; O& K# F
                comment += "万"
    ; z' _8 m4 j/ ?4 u) P% [        upname = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/span/text()'))
    ) x( l" [+ H! p        uplink = "http:" + "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/@href'))% Z7 Y4 O) c9 D* w* U; Z/ V1 i' b
            hot = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="pts"]/div/text()'))6 N4 j7 m) X; H5 a, f- x
            video_list.append({: |/ H% {7 N3 t5 L* C
                'rank': rank,- e  w8 E9 \, F
                'videolink': videolink,
    . z- M2 ]0 o( q& Z' V/ x            'title': title,
    , X& w. H6 C' X; j7 I            'play': play,
    . J" h, r- v0 I0 _# L            'comment': comment,
    7 E% ^) Q' G( f( f! |            'upname': upname,6 w8 E  B7 i' i2 c4 C% O
                'uplink': uplink,6 l$ y( T( M3 ^
                 'hot': hot
    . G! q. n! [3 n* A; ^        })& H9 Z0 H8 e* J
        return video_list
    7 ~+ T8 G4 C+ ^1 Q6 ]8 L6 Q" S! [$ ^+ k
    2 h" E5 E3 ], L5 B# 将爬取到的数据写入Excel表格# V* _* r" H0 p
    def write_Excel(video_list):. s% i+ F2 ]" U
        print("将b站热门视频信息导入到Excel表格:")3 {+ K$ }: B" w0 K0 |5 \
        workbook = xlwt.Workbook()  # 定义workbook
    + J" [3 q$ U8 C+ |    sheet = workbook.add_sheet('b站热门视频')  # 添加sheet
    # Y5 |  U! e3 x7 O/ v. ]    xstyle = xlwt.XFStyle()  # 实例化表格样式对象
    7 Q# w% Z5 k9 t2 Y9 o    xstyle.alignment.horz = 0x02  # 字体居中+ t3 l& I$ ^% Y) F
        xstyle.alignment.vert = 0x01  # 字体居中2 E. ~0 d1 d3 f+ d6 I9 c
        head = ['视频名', 'up主','排名', '热度','播放量','评论数']  # 表头. U% i/ B& @# E
        for h in range(len(head)):
    ) |+ @; Y0 \7 M+ d% F0 b* v5 q' q        sheet.write(0, h, head[h],xstyle)  # 把表头写到Excel里面去  f5 q% p- X* w* A
        i = 17 H6 z4 Z0 A$ C7 a' N
        for item in video_list:
    % q6 j" ?$ Z# k" n$ n! E! L        # 向单元格(视频名)添加(该视频的)超链接
    ' U2 v0 D" D" }7 v        title_data = 'HYPERLINK("'+item["videolink"]+'";"'+item["title"]+'")'  # 设置超链接
    ! l8 c' L7 h4 b/ r  e        sheet.col(0).width = int(256 * len(title_data) * 3/5)   # 设置列宽& ?  @7 h0 ?4 n
            sheet.write(i, 0, xlwt.Formula(title_data), xstyle)5 X$ S' ?# m9 W, R
            name_data = 'HYPERLINK("' + item["uplink"] + '";"' + item["upname"] + '")'  # 设置超链接
    6 o7 W) O2 o) S; T4 F+ B" p        sheet.col(1).width = int(256 * len(title_data) * 3 / 10)& x! Z4 I7 D& `( j7 T" L
            sheet.write(i, 1, xlwt.Formula(name_data), xstyle)
      r/ ~" w- P0 P        sheet.write(i, 2, item['rank'], xstyle)
    7 ]; X! z+ {9 ?* _        sheet.write(i, 3, item['hot'], xstyle)  Q) f% X. E3 m: {9 V- W
            sheet.write(i, 4, item['play'], xstyle)9 F2 F7 Z8 Y! S) V: }# Y0 E
            sheet.write(i, 5, item['comment'], xstyle)
    2 l7 K; Q+ r6 E) g& ^9 V- x        i += 1' P' @5 {/ ]2 y" P# _/ W/ N+ D
        # 如果文件存在,则将其删除
    6 p% S( q9 Y6 g0 l. h    if os.path.exists('D:/Test/b站热门视频信息.xls'):
    ! `  X8 l+ W% ~# y        os.remove('D:/Test/b站热门视频信息.xls')' T# j3 x# C* S% _+ ]
        workbook.save('D:/Test/b站热门视频信息.xls')
    4 a- c: I! D, Y) u* Y    print('写入excel成功')
    & S) i0 a( [% }( L) s5 r$ I    print("文件位置:D:/Test/b站热门视频信息.xls")
    , R' V9 j9 y* ^. R; z% D9 ~6 g$ R7 V& O/ T( V# E
    if __name__ == '__main__':
    1 G2 `$ \. v+ j    video_list = []* m' i# }% ~2 h  w3 i/ u" C! q
        write_Excel(spider(video_list))! r! d5 ~  \- N& W

    : p: Z, E7 j* ]$ O$ q  C$ f" w- _" j% [, W* H8 i. L, F* k

    " F) n. r" o. q& }# ]  {( s9 ?9 ]; ?' R- J- [, ^

    : W5 U" Q. J4 T% `" X
    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 10:05 , Processed in 0.466323 second(s), 54 queries .

    回顶部