QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 4446|回复: 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表格
    2 y- }; @& R/ a' z3 L% ~) v效果图:
    9 x# W1 F* J: E0 I% | 1.png
    8 I7 t' a% m( E+ m$ `6 Q1.工先利其事必先利器,首先我们得下载相应的库:
    & N$ @% m2 d" k2 Xpip install requests
    6 s3 H7 h- t; r% ?$ W8 E5 a% Zpip install lxml/ @2 w6 b$ c6 z; p
    pip install xlwt
    ; P! o; p& Q( Y: B- |0 N6 L1 f9 {7 z8 i+ v

    , ~% I: z4 ~5 d( }) s: G( U% erequests 向网页发送请求9 G. p& k2 f8 r3 \5 s' f9 z2 W% Z2 G1 X( O
    lxml 处理xml文件(xpath)
    % Y. _- p, b8 \& k* uxlwt 对Excel做写入操作! H1 K! |3 v8 I( q4 X% i
    2.爬取b站热门视频的信息:
    ) e' [8 z5 U' b3 m  打开b站热门视频页面:& g! Y& f5 l% `6 Q
    2.png
    $ a7 o4 l; S1 F, x' T  按f12进入开发者选项,然后点击选中你要获取的页面信息,即可找到该信息在该HTML文件中的什么位置(这对我们用xpath获取元素属性和元素值很重要),例如:6 J9 n$ [1 X0 D3 g3 [5 F
    3.png
    / A9 ~. E; B- ^9 P3 Q$ K$ b代码如下:7 I$ M! m$ u$ j& P
    # 爬取b站热门视频信息3 t2 e. O/ l  ]
    def spider(video_list):
    . \; k- ?; a/ [  i  B    url = 'https://www.bilibili.com/ranking?spm_id_from=333.851.b_7072696d61727950616765546162.3'
    3 m. ^) a) t9 V: ?5 H5 U    html_data = requests.get(url).text( o9 N) P6 M2 t2 R1 K
        selector = html.fromstring(html_data): Y* G4 Q0 ]0 h. t. Q1 u3 I: q
        infolist = selector.xpath('//li[@class="rank-item"]')
    8 }' H+ H. M( H! b6 S. x: }    for item in infolist:* e3 o# b1 S8 J
            rank = "".join(item.xpath('./div[@class="num"]/text()'))
    1 v: x( c( a/ A4 B" p5 d& N$ Y        videolink = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/@href'))
    # n& ~# B: L# g! _, r. ?) n2 M        title = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/text()'))
    & J  v  P8 d* x  x, n        playinfo = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/span/text()')).split("万")4 e  b# |3 f$ P# y
            play = playinfo[0] + "万"/ \0 K# ~9 x/ S7 ~- H
            comment = playinfo[1]
    , D( O+ L4 C6 a3 s3 r% c        if comment.isdigit() == False:
    0 L! \& S' A, d0 O6 p. a9 G            comment += "万"
    ( H9 p& @" _3 H, x$ C0 [  W4 l        upname = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/span/text()'))
    ' l3 B7 ]& Y2 K: Y: U) W        uplink = "http:" + "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/@href'))
    " m+ i% L5 g: q. V- j) d        hot = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="pts"]/div/text()')). J6 Q+ a9 y8 x/ u- h
            video_list.append({
    / @) v: u6 w) g' R# E) w! p! S( n5 V            'rank': rank," P0 x+ ~9 z% v' s" c% }& O: p" u
                'videolink': videolink,
    9 ]5 B9 f7 {; Y: _            'title': title,! p7 J+ D4 z3 H3 x5 ]/ d6 a
                'play': play,, v& d, J+ Y6 h! w; x
                'comment': comment,
    ) f2 r# d* T. x* }            'upname': upname,
    : x$ E4 Q3 D6 v% v: Q/ G% h* l# v# y            'uplink': uplink,+ b% Q- c- j% t8 y+ [. F' T. w
                 'hot': hot  Y# Q% T7 x$ b8 N9 e6 v$ u
            })+ j+ r  o+ Y+ ^
        return video_list3 L% n/ j8 q$ m; b; s* r& U- X8 K3 ^

    ) Z# T0 _7 v! R
    4 M% l" Z1 x2 j
    3.将我们拿到的信息集合(video_list)写入到Excel表格中:
    % E5 V4 v8 M/ J0 Y) s( M  xlwt的基本使用方法:$ P8 p& @: u6 G( S6 G. D# P
    import xlwt+ Z: H/ T/ B. S7 Y3 w
    # 创建一个workbook (并设置编码). `# Z0 h+ d6 G" ~+ O
    workbook = xlwt.Workbook(encoding = 'utf-8')
    ( ^% K( Y2 L3 K) ]1 I" _# 创建一个worksheet
    6 M" \) T: W, T& fworksheet = workbook.add_sheet('My Worksheet')
    8 E% D9 m6 b% t, W1 c% H: d) a
      N# Y) V  \4 H2 [: v% S9 Y# 写入excel
    - o9 ?9 I" h% W' F# 参数对应 行, 列, 值,(格式)
    2 `$ W! g. `0 _+ kworksheet.write(1,0, label = 'this is test')
    * Z8 z9 i" _4 [# 保存: X3 Y+ n6 J& p
    #参数为你保存该Excel文件的路径
    . n& H3 v, a  y5 g# `- Jworkbook.save('Excel_test.xls')$ D$ c( h1 H/ p
    3 T- @* F; d# \, c

    " R5 p( d7 _  F% T. Q# Z  如果我们想要点击视频名或者up的名字可以跳转,那么我们就要使用Excel表格的HYPERLINK方法:
    . P6 o9 H4 F6 jHYPERLINK(“http://www.baidu.com” ; “百度”)
      h" Z5 ]8 Z0 i- ]3 J: y; L3 I百度为显示在单元格的信息,而前面的链接为跳转链接。& ?) b: r& ~' v0 k; U
    xlwt.Formula()方法需要传入一个字符串s,s=‘HYPERLINK(“http://www.baidu.com” ; “百度”)’。) r/ p0 a7 g5 F) S
    代码如下:% Y3 l" r5 q) m9 i( P3 j" P
    # 将爬取到的数据写入Excel表格! q- r% ]8 X9 k( d2 b+ v
    def write_Excel(video_list):1 m" F1 r' ~2 j9 ~8 F" z
        print("将b站热门视频信息导入到Excel表格:")
    ( {$ U  H; M/ z; y7 c: B6 ~) _5 Z    workbook = xlwt.Workbook()  # 定义workbook
    5 e" q7 Y  k2 a    sheet = workbook.add_sheet('b站热门视频')  # 添加sheet/ i$ w3 G: _+ c' r1 j  u0 f2 \4 v1 E
        xstyle = xlwt.XFStyle()  # 实例化表格样式对象6 P8 r) I1 m! u7 b! D
        xstyle.alignment.horz = 0x02  # 字体居中
    ' C" h! D3 C1 x/ z1 g  o    xstyle.alignment.vert = 0x01  # 字体居中4 n! W) K7 p3 s6 e0 Q" b( v  e
        head = ['视频名', 'up主','排名', '热度','播放量','评论数']  # 表头
    ; t5 R9 r+ s. R* d    for h in range(len(head)):
    ! j8 @" A5 I  n) a4 G  M        sheet.write(0, h, head[h],xstyle)  # 把表头写到Excel里面去& B) P* u( P& M# z
        i = 1# @( Z: j1 I4 Z: N; l5 W& P# O( w
        for item in video_list:4 i# m. g. p5 R$ y9 w9 n3 \
            # 向单元格(视频名)添加(该视频的)超链接
    9 X5 E- u) i* e( a        title_data = 'HYPERLINK("'+item["videolink"]+'";"'+item["title"]+'")'  # 设置超链接: Y4 u9 I: t# q' ]& R- T
            sheet.col(0).width = int(256 * len(title_data) * 3/5)   # 设置列宽
    7 U/ K: W2 D/ R' Y# K* Y( M        sheet.write(i, 0, xlwt.Formula(title_data), xstyle)
    : i; [$ E' |4 Z$ h' R: ]  g        name_data = 'HYPERLINK("' + item["uplink"] + '";"' + item["upname"] + '")'  # 设置超链接; E& z* X% v# e& }2 @7 f1 @
            sheet.col(1).width = int(256 * len(title_data) * 3 / 10), A& y* d4 G( S& k8 [: O7 R  F
            sheet.write(i, 1, xlwt.Formula(name_data), xstyle)1 _- u$ `! Z6 ^  y, \6 q8 k
            sheet.write(i, 2, item['rank'], xstyle)
    + q9 n5 n* W, D2 d# _2 x: B+ w        sheet.write(i, 3, item['hot'], xstyle)  V* V8 k: j; `: X0 h
            sheet.write(i, 4, item['play'], xstyle)
    1 ~( W# o7 P# h2 q5 m( I. i        sheet.write(i, 5, item['comment'], xstyle)
    & r' z8 ?! p3 E; R9 g6 z        i += 1
    - |0 u$ U( h5 U, e    # 如果文件存在,则将其删除! P9 \5 w5 w4 Z) U* G" R
        if os.path.exists('D:/Test/b站热门视频信息.xls'):7 l; l* `$ K5 z7 L3 H
            os.remove('D:/Test/b站热门视频信息.xls')$ |; M. a* C# V
        workbook.save('D:/Test/b站热门视频信息.xls')
    7 @' k2 Z7 |* {; Y) a    print('写入excel成功')) w& r8 J7 n* I( j! ]: k1 M
        print("文件位置:D:/Test/b站热门视频信息.xls"). o7 T  D1 i$ Q3 q# n

    1 f5 v# s" [+ z5 P5 Z- N; @# s$ O' e; R
    4.在入口main中调用上面两个函数
    ) h; `) N% H" R8 W# S完整代码如下:  I; i) Y: U% {1 U% F+ ^9 I: e
    import requests# O  R4 n$ s( S& Z# Y: l
    from lxml import html
    1 s  J, ?" E4 c7 L# F0 v+ N3 c# V1 Cimport xlwt2 {1 O4 O/ [8 w) _5 Y/ W/ h( W7 c
    import os% b& i& D* X- e* l' P

    . U& `& ~! w# F% b( N$ r# 爬取b站热门视频信息6 |* _9 |  j+ k( z6 w* A* P
    def spider(video_list):
    2 X, S# }7 F6 _5 ?+ u* a    url = 'https://www.bilibili.com/ranking?spm_id_from=333.851.b_7072696d61727950616765546162.3'2 C! N- L% V5 G& z  h; y* E3 G3 D
        html_data = requests.get(url).text$ `) t8 y0 I1 i
        selector = html.fromstring(html_data)
    6 P9 x9 Z2 ]  ~3 u  W/ K4 r    infolist = selector.xpath('//li[@class="rank-item"]')
    $ U" l2 Z1 ]. q) ]- ~- E    for item in infolist:$ m  J/ I) s3 Y# K9 o9 N
            rank = "".join(item.xpath('./div[@class="num"]/text()'))+ `% J  n0 J: u2 ?6 j
            videolink = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/@href'))8 n2 u( u1 p" }0 q* ]
            title = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/text()'))+ l/ R# K' y9 M: \7 i
            playinfo = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/span/text()')).split("万")
    3 d6 L0 Z3 |' _( h' E        play = playinfo[0] + "万"
    1 P6 ]/ G$ a" |        comment = playinfo[1]1 b$ u! P: ?  x( L; `
            if comment.isdigit() == False:
    # T# }% n2 G1 c            comment += "万"" {. D% Q) b4 v/ e
            upname = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/span/text()'))
    2 V* [0 G) U* v9 k: Y        uplink = "http:" + "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/@href'))
    % x5 N& P3 u0 b/ [, d8 I( \        hot = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="pts"]/div/text()'))
    1 A- v1 j; G0 M5 T; b+ X        video_list.append({
    7 V5 o9 c3 O' @! }+ K0 ^            'rank': rank,; [$ D" S, I% g, D: }, u4 ~5 i
                'videolink': videolink,$ ?  i- `5 l$ q  P* u2 W! d6 `
                'title': title,: [" x6 t- x* T1 x% X6 W
                'play': play,
    6 r# z* v1 z# i1 ^/ q            'comment': comment,
    " g. F/ {- k( y; L            'upname': upname," B. p/ m9 T6 C) x4 W. v' b, d
                'uplink': uplink,
    8 n- E5 V3 ?# S             'hot': hot" O, V4 |% D, W& |7 g" ^. R
            })
    ' U7 h1 F1 r. g4 x1 k2 u$ J    return video_list7 L+ C0 M$ o0 p+ D) P

    5 o1 v& ^) a7 m& D$ O% T# 将爬取到的数据写入Excel表格' }7 q2 {5 U  r; e5 ~0 x. R
    def write_Excel(video_list):
    # l5 B8 L' m5 I+ h8 c; U1 H    print("将b站热门视频信息导入到Excel表格:")
    * }+ y" H# i  ?0 i, W  W, t3 H    workbook = xlwt.Workbook()  # 定义workbook
    , ]8 O! F" a! G' u7 F    sheet = workbook.add_sheet('b站热门视频')  # 添加sheet
    , O  M5 }! S) J1 Q1 k; e/ C    xstyle = xlwt.XFStyle()  # 实例化表格样式对象' O3 v( L6 J# S5 R  q0 t
        xstyle.alignment.horz = 0x02  # 字体居中
    3 B5 r: I+ z; ?4 m2 N9 g, g) U5 i    xstyle.alignment.vert = 0x01  # 字体居中
    7 N9 m" o* }( \    head = ['视频名', 'up主','排名', '热度','播放量','评论数']  # 表头/ A4 x0 \' Q% F& h7 m" e
        for h in range(len(head)):; q' p- @3 P" |( c
            sheet.write(0, h, head[h],xstyle)  # 把表头写到Excel里面去
    " _3 o& u) X5 p1 w+ r. u  u7 p( l    i = 1
      N( N2 F5 \! H5 R+ y    for item in video_list:6 t5 w3 G5 D1 x" K
            # 向单元格(视频名)添加(该视频的)超链接
    4 W. Y4 L; T6 X3 c1 X5 `$ T        title_data = 'HYPERLINK("'+item["videolink"]+'";"'+item["title"]+'")'  # 设置超链接' N: O* N" p. q$ e- u6 n/ h
            sheet.col(0).width = int(256 * len(title_data) * 3/5)   # 设置列宽
    % D2 N( I4 p& @# G        sheet.write(i, 0, xlwt.Formula(title_data), xstyle)
    ' @' R- d: }  H& _; c, s        name_data = 'HYPERLINK("' + item["uplink"] + '";"' + item["upname"] + '")'  # 设置超链接
    ( B9 _0 K# c) o2 M5 |. z" M* I. w        sheet.col(1).width = int(256 * len(title_data) * 3 / 10)
    0 ^2 f# \  F* ?7 v        sheet.write(i, 1, xlwt.Formula(name_data), xstyle)
    ' W& m: w$ [# ~5 D        sheet.write(i, 2, item['rank'], xstyle)* t' Q7 M1 K# w) ?. }
            sheet.write(i, 3, item['hot'], xstyle)# f; `, ?0 ^$ _$ w9 K
            sheet.write(i, 4, item['play'], xstyle)
    9 y' O0 o; n# n7 z8 \        sheet.write(i, 5, item['comment'], xstyle); q2 |, ]) M* d: k
            i += 1% ~3 f4 b+ o! E
        # 如果文件存在,则将其删除8 F9 O0 f) @3 ]) Z; n8 ~7 z
        if os.path.exists('D:/Test/b站热门视频信息.xls'):+ ]- ?/ t' i+ @* X2 w; N1 n
            os.remove('D:/Test/b站热门视频信息.xls')" ~+ X1 b' e, _% i6 S
        workbook.save('D:/Test/b站热门视频信息.xls')
    * ^3 V2 z* T* D) W" p5 t7 o' C9 Q) s    print('写入excel成功')
    % F, F* n* B1 H/ U! h    print("文件位置:D:/Test/b站热门视频信息.xls")
    - s8 O$ M7 }9 R7 Z5 ~/ p7 t/ ~& a4 E
    9 \% I/ R, e2 Q" Rif __name__ == '__main__':
    8 ~* b$ ^0 t' N( K. G# S    video_list = []
    5 m4 _3 J" L* y7 z: v+ `    write_Excel(spider(video_list))
    & D& ~9 s0 X( H2 M' L; D- q$ {# \/ l; D# g% v/ Z2 K! D

    4 _! M  c. l) M3 u5 @( @
    1 O; G0 }6 P3 g
    8 N; M: Y' A( d2 Q! \* U  ~+ \8 u+ U7 t
    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 07:26 , Processed in 1.058671 second(s), 54 queries .

    回顶部