QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 4464|回复: 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表格4 h- J/ i- j1 L7 q% k/ B6 E( |
    效果图:
    1 W5 v% U$ t9 n" a2 x; Z- Z 1.png 0 E" ~0 A5 y' S0 o( l. Y, N- G
    1.工先利其事必先利器,首先我们得下载相应的库:9 G8 A+ t/ n% {4 ]+ y; P! q: N
    pip install requests7 n! p- w6 M' B$ P% H. h
    pip install lxml
    : I! J5 o( h+ V( E; vpip install xlwt1 ^1 u9 o0 q  R7 O3 R: d
    + V4 C: b2 u+ z! D
    0 W* L9 _6 i- B. E; K
    requests 向网页发送请求
      g- s; G7 ^! V: X5 O4 S  E! dlxml 处理xml文件(xpath)- z% V$ C- E( c1 y1 \& u1 x
    xlwt 对Excel做写入操作6 Y. q# A1 a5 u4 a
    2.爬取b站热门视频的信息:/ X) M$ ]2 B2 N# N
      打开b站热门视频页面:5 L# g' L5 o# A7 A0 {: J, u
    2.png . V" V1 [8 ^) X" h( E
      按f12进入开发者选项,然后点击选中你要获取的页面信息,即可找到该信息在该HTML文件中的什么位置(这对我们用xpath获取元素属性和元素值很重要),例如:
    6 _+ N# `  E) }, k+ ~ 3.png
    0 A% C# _: \9 V5 W. d8 n6 v代码如下:" z# F" A4 J# K2 x9 g0 @
    # 爬取b站热门视频信息
    / [0 O2 y/ X. G1 ?6 ldef spider(video_list):% T; B' l) J7 v
        url = 'https://www.bilibili.com/ranking?spm_id_from=333.851.b_7072696d61727950616765546162.3'
    & R/ \6 p% f" H7 m- T  X5 o6 C- w    html_data = requests.get(url).text2 S) U, w5 q8 R+ q2 P9 H/ O( Z7 ]
        selector = html.fromstring(html_data)) r( x* _' C; A+ }, T8 q
        infolist = selector.xpath('//li[@class="rank-item"]')9 E* G) L- K. [. H; M
        for item in infolist:
    " J; k1 C& B5 E- r$ a- T0 ]        rank = "".join(item.xpath('./div[@class="num"]/text()'))
    ' j& |( X- w# l( p6 y9 v        videolink = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/@href'))
      \) P3 R7 a) d+ h( p5 B: o, d        title = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/text()'))
    , Q8 R2 M8 H8 S5 c/ v- W' P# G; u2 ]        playinfo = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/span/text()')).split("万")
    ( _0 U2 C: ]" g. B0 K$ e. {        play = playinfo[0] + "万"
    , O6 @7 g8 W: ^' @, U( P8 n        comment = playinfo[1]0 V$ [( Y4 v) Q- Z! N
            if comment.isdigit() == False:; y+ l9 A7 x' E. h2 z- O# J
                comment += "万"% {! F+ y, X, ?. }0 A+ D# G1 l1 x
            upname = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/span/text()'))% a: A4 R; u0 u+ p- S9 g1 g
            uplink = "http:" + "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/@href'))4 [9 Y2 w2 F- q, i
            hot = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="pts"]/div/text()'))
    / H; H* ^: C8 s% u5 Y! f, ^        video_list.append({
    2 y; `5 j( u2 W" C& f2 R            'rank': rank," d- E" x3 i1 N: F+ v6 J2 s
                'videolink': videolink,
    6 d0 G3 b0 e# l1 o            'title': title,# Q; {( T; [. H0 G0 A1 O
                'play': play,
    . a4 P6 ~9 n, O            'comment': comment,
    ; p- x; g( o+ @5 G: B! s% B            'upname': upname,
    ' f" K4 u" Q; o' i9 }. z            'uplink': uplink,/ W; h/ n3 y; N
                 'hot': hot
    - k2 P/ |- z3 w! P8 z. v0 l        })
    5 F  w5 I; J& Z- x$ t0 V/ N: X    return video_list) v* A! _0 n) u: v- M+ F& p! W

    3 G  l2 c5 h/ [6 [

    + U0 A8 ^. @! B% p3.将我们拿到的信息集合(video_list)写入到Excel表格中:" O3 O- J7 x) U! Q8 R
      xlwt的基本使用方法:
    9 r8 g- i; w" v2 I/ \3 Rimport xlwt0 O' d" M- K4 p, V7 b2 c8 P
    # 创建一个workbook (并设置编码)1 R4 y5 U' \9 B3 T0 H
    workbook = xlwt.Workbook(encoding = 'utf-8')* n$ X4 F* H2 y; R7 _- j0 `5 {; B- h: w
    # 创建一个worksheet" O% Z3 e0 Y; Z; Y
    worksheet = workbook.add_sheet('My Worksheet')% a1 P# ~  f5 z7 p
    - Z% g, J2 w5 F
    # 写入excel( h. o1 p0 R4 j2 h9 `
    # 参数对应 行, 列, 值,(格式)5 c3 T/ z6 C' v7 Q7 q, ~5 O6 B8 b
    worksheet.write(1,0, label = 'this is test')9 d$ h( J# \0 z: X+ J8 r
    # 保存; p8 M7 D2 @7 |- R2 }: O% |+ j; z% F9 l
    #参数为你保存该Excel文件的路径  ]6 j4 b9 C3 ?) Q3 ~+ W
    workbook.save('Excel_test.xls')# z1 {- ^1 k) m- H3 r
    * C- `1 Y) f7 |8 ~2 z5 S# N

    - P# k' J! C: d6 m) x  如果我们想要点击视频名或者up的名字可以跳转,那么我们就要使用Excel表格的HYPERLINK方法:
    - t( j$ O: D4 aHYPERLINK(“http://www.baidu.com” ; “百度”)5 I1 V" d* w0 R  t$ O# f, V
    百度为显示在单元格的信息,而前面的链接为跳转链接。  g, H0 P& f  C8 \; n) \" B# w
    xlwt.Formula()方法需要传入一个字符串s,s=‘HYPERLINK(“http://www.baidu.com” ; “百度”)’。7 i) v* T" y% ~- l' ^" F
    代码如下:' h) c( P& i3 E* `0 t  l: x0 F- h4 d
    # 将爬取到的数据写入Excel表格
    ' C; w, i. x4 J% N# Hdef write_Excel(video_list):3 O+ A6 n0 d& \9 |5 \
        print("将b站热门视频信息导入到Excel表格:")2 a2 f( E# z. i
        workbook = xlwt.Workbook()  # 定义workbook3 ^8 g9 e* Z* l8 R5 Q* K; Z1 `
        sheet = workbook.add_sheet('b站热门视频')  # 添加sheet  K7 b4 ^5 [4 b7 d6 W& g
        xstyle = xlwt.XFStyle()  # 实例化表格样式对象
    0 e" S' F; }  U9 p9 _" [9 d    xstyle.alignment.horz = 0x02  # 字体居中
    + g; d- X% e2 z7 E0 l" |% R0 r0 v    xstyle.alignment.vert = 0x01  # 字体居中. a$ C& S4 u+ G5 `
        head = ['视频名', 'up主','排名', '热度','播放量','评论数']  # 表头8 r. i8 k' z+ [8 X  w# k
        for h in range(len(head)):) t( u4 g+ B" K; {' A  t# Y
            sheet.write(0, h, head[h],xstyle)  # 把表头写到Excel里面去
    - C5 h/ n5 I# E. L) s    i = 1- }, p5 ]$ c; R/ h
        for item in video_list:. I( U4 V! s! o. j4 V
            # 向单元格(视频名)添加(该视频的)超链接6 d2 m9 L% f# G
            title_data = 'HYPERLINK("'+item["videolink"]+'";"'+item["title"]+'")'  # 设置超链接: ?+ k. e3 C' F2 B# i) ^! b
            sheet.col(0).width = int(256 * len(title_data) * 3/5)   # 设置列宽1 W7 {! h& i' L
            sheet.write(i, 0, xlwt.Formula(title_data), xstyle)7 @0 [! E- t7 q1 N9 T
            name_data = 'HYPERLINK("' + item["uplink"] + '";"' + item["upname"] + '")'  # 设置超链接
    7 A/ u( P0 l" c# O        sheet.col(1).width = int(256 * len(title_data) * 3 / 10)
    6 O# U6 z1 `- R4 W" K1 o8 p        sheet.write(i, 1, xlwt.Formula(name_data), xstyle)4 `: ?7 w& h. x6 X/ r
            sheet.write(i, 2, item['rank'], xstyle)! Q- K: ?; ~: e4 T" J
            sheet.write(i, 3, item['hot'], xstyle)
    + k4 y; j, Q* @% [1 f6 O, D        sheet.write(i, 4, item['play'], xstyle)2 v" `  _; x4 M- U
            sheet.write(i, 5, item['comment'], xstyle)4 j! m. M$ }" S% D. n' E
            i += 1
    4 l& m! w3 |- k" H1 C    # 如果文件存在,则将其删除5 j/ _; c4 I" f9 v, O7 ~$ r
        if os.path.exists('D:/Test/b站热门视频信息.xls'):
    5 Q2 @9 g: A# K        os.remove('D:/Test/b站热门视频信息.xls')5 T$ \+ S+ Y1 w! ^
        workbook.save('D:/Test/b站热门视频信息.xls')
    6 g* o  k- s7 r& B$ F+ l    print('写入excel成功')( X/ R/ d+ c) Y  Y; k
        print("文件位置:D:/Test/b站热门视频信息.xls")
    6 J6 L) G. g5 h7 D3 e
    / ^4 F. i/ H( w6 D
    0 ~4 T' K6 X8 M8 Q" q% u$ B# j$ h4.在入口main中调用上面两个函数
    * M8 r% A5 J% T/ }0 T# }完整代码如下:
    : n! O+ r. x$ J) b, E$ n; W2 c8 Yimport requests
      E/ V2 e0 W6 Z" v6 r" `/ Dfrom lxml import html2 J- s8 v% A9 Z6 `; b+ [
    import xlwt
    ! v6 I" ~5 K7 F7 Q0 l8 [8 `import os& E& u4 d0 d' o" V/ @0 O

    5 s% }0 o$ @! Q  g1 S2 k6 k* M# 爬取b站热门视频信息# ~5 U/ G/ A# e, y( m: K" H
    def spider(video_list):2 m* Q- j* y9 j9 s
        url = 'https://www.bilibili.com/ranking?spm_id_from=333.851.b_7072696d61727950616765546162.3'% d% l% [! C9 Q# L' n# r( X) u
        html_data = requests.get(url).text
    + y  r$ k) X8 S5 p: ]; g- r    selector = html.fromstring(html_data), m5 P" f6 ^( X
        infolist = selector.xpath('//li[@class="rank-item"]')
    $ ^4 B6 K* I! \! S8 A* g    for item in infolist:5 \$ e$ A( D0 K) L3 W% C8 z/ G% A
            rank = "".join(item.xpath('./div[@class="num"]/text()'))+ ]' m( _; O, e$ }- ~$ [
            videolink = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/@href'))) K; w, x7 k1 s: f
            title = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/text()'))/ ^( _* }& m0 M
            playinfo = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/span/text()')).split("万")$ Z& B2 Q6 u2 z6 L
            play = playinfo[0] + "万"6 V* b$ ~6 o! S  J
            comment = playinfo[1]
    $ o( K9 g- C# D        if comment.isdigit() == False:
    : b1 F+ b- @/ W1 F3 Y            comment += "万"
    5 T; r3 }8 t4 d& m        upname = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/span/text()'))
    - B* X4 m* _. Q. z/ j        uplink = "http:" + "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/@href'))
    ( `2 d" f- R9 [/ v; I0 b        hot = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="pts"]/div/text()'))
    & E+ b4 X, k7 J- O& x; O1 D4 R        video_list.append({4 |( q& b8 r, @" A- G% _0 K
                'rank': rank,) N! @) e; m( b  u- G0 \; Z! i/ E
                'videolink': videolink,
    5 [# T7 m1 U& |            'title': title,
    - e1 F; J. f7 e) p/ j+ S0 i            'play': play,
    6 ]# D( k, h6 i9 G. K" n& d$ N) m1 d            'comment': comment,6 m/ U1 @( {! z' K1 W
                'upname': upname,
    + \8 @7 C. B  N/ f            'uplink': uplink,
    ) V+ U9 v. N' a7 ~             'hot': hot; U, T0 [% V, |# x0 l' W
            })" I5 C# R( N9 D6 R, J1 l2 o
        return video_list
    5 a( f4 X, _( m% F0 \  p5 Q# Z# |/ E$ J" P* V# j7 F
    # 将爬取到的数据写入Excel表格
    2 |$ I3 I* h2 w0 @: ]def write_Excel(video_list):
    * j" u, @+ p' u0 f    print("将b站热门视频信息导入到Excel表格:")* j; I) z# Y0 u  }0 l
        workbook = xlwt.Workbook()  # 定义workbook: H8 \+ R' s! Q7 g& M  @
        sheet = workbook.add_sheet('b站热门视频')  # 添加sheet
    5 q1 M' Z- `3 b    xstyle = xlwt.XFStyle()  # 实例化表格样式对象
    7 h: B2 I& L4 A5 C2 j    xstyle.alignment.horz = 0x02  # 字体居中
    8 U7 Z8 y6 F" r    xstyle.alignment.vert = 0x01  # 字体居中
    ( b% _4 c7 N8 g+ b9 j2 B    head = ['视频名', 'up主','排名', '热度','播放量','评论数']  # 表头
    3 N4 H- y3 h$ W; V1 p    for h in range(len(head)):, w5 d6 \1 j& d; P
            sheet.write(0, h, head[h],xstyle)  # 把表头写到Excel里面去
    - p5 S( [  G; k, n. f    i = 18 C5 R9 Z. ], o4 T
        for item in video_list:5 v) c6 M2 D" n, P5 L' T7 p
            # 向单元格(视频名)添加(该视频的)超链接
    ) ~; M# i5 R1 o: c5 A        title_data = 'HYPERLINK("'+item["videolink"]+'";"'+item["title"]+'")'  # 设置超链接
    & c4 }& {& {- s9 p* u4 n4 ?        sheet.col(0).width = int(256 * len(title_data) * 3/5)   # 设置列宽4 d8 A4 J& X9 J0 w6 K; L
            sheet.write(i, 0, xlwt.Formula(title_data), xstyle)) D! B3 f, ~5 `5 p# s  r
            name_data = 'HYPERLINK("' + item["uplink"] + '";"' + item["upname"] + '")'  # 设置超链接
    5 |& g5 C9 y& P- g7 A- z        sheet.col(1).width = int(256 * len(title_data) * 3 / 10)
    / A7 Z5 [- w6 i        sheet.write(i, 1, xlwt.Formula(name_data), xstyle)
    5 |( m) n% j, R) I7 U, m5 I        sheet.write(i, 2, item['rank'], xstyle)" R3 l  z* M$ _. S9 I/ ~
            sheet.write(i, 3, item['hot'], xstyle)
    0 e' K& _6 l, m' J) c        sheet.write(i, 4, item['play'], xstyle)
    1 J" @2 X' j, ]* i$ l3 ^( V        sheet.write(i, 5, item['comment'], xstyle)
    8 S% a: F" m+ [  X        i += 1
    $ t; v; {1 A8 j( L3 J# c    # 如果文件存在,则将其删除' O! F$ o) {) c& D9 |
        if os.path.exists('D:/Test/b站热门视频信息.xls'):1 W3 y$ T- |3 G  r
            os.remove('D:/Test/b站热门视频信息.xls')
    : g. X6 T* j( e& C9 j% G  t3 N2 |    workbook.save('D:/Test/b站热门视频信息.xls')
    + W1 d9 m% B% F. I    print('写入excel成功'): \" _* W# N  r; U
        print("文件位置:D:/Test/b站热门视频信息.xls")
    + `" s3 ?; k6 }" C  X% E7 a# t- a: \! {2 o+ [
    if __name__ == '__main__':
    8 u6 j; _0 O4 u" k: H# W  K0 g$ d    video_list = []
    " S& r: ]. q" N0 E; q7 s    write_Excel(spider(video_list))
    ) e. I& I6 ?- x& |) w$ h/ U
    ; m! i9 L4 R  Z9 ^+ x- k$ N# B! \5 ~

    3 L* G) |8 ^# L# c5 Z8 |! L! q/ ?7 B& S+ J8 q
    # a1 _" g) N+ z; }# l6 _. J
    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-9-1 13:49 , Processed in 0.474922 second(s), 53 queries .

    回顶部