QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3904|回复: 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表格
    9 Y( J8 v' ?, @. w' n" u/ x效果图:$ }6 [  }% f* i8 Z! [6 y% Y
    1.png
    - A9 q! @. U$ D, B  B1.工先利其事必先利器,首先我们得下载相应的库:# b8 y& F: @' o8 P1 F' W( G/ q. H
    pip install requests6 i' v& Y: V7 n* r9 o
    pip install lxml, Y  w9 D8 o" ~+ @
    pip install xlwt
    5 u/ L9 Q; A. G- {2 ?+ p2 n4 A( q; r0 W! T& w! y3 H
    & z9 J$ a8 n, E- h) h( T: b
    requests 向网页发送请求- g" D7 g9 U+ A3 z, x
    lxml 处理xml文件(xpath)
    * i( p5 C) I6 G1 @  [xlwt 对Excel做写入操作% d6 H+ r9 n4 K! i- C
    2.爬取b站热门视频的信息:3 r1 D& n3 |( P. A( f. {
      打开b站热门视频页面:' z% y! o9 f: x1 {4 C
    2.png
    7 s' ~" S) g- c5 l  按f12进入开发者选项,然后点击选中你要获取的页面信息,即可找到该信息在该HTML文件中的什么位置(这对我们用xpath获取元素属性和元素值很重要),例如:
    0 p7 n$ d0 F8 c+ r 3.png ; u) X: L7 f# i# I* c
    代码如下:$ A: H8 a6 G& v" A5 N6 ?3 [$ p
    # 爬取b站热门视频信息
    ; F1 q) N! t" T- q6 Edef spider(video_list):! m4 D) @! E" H: G2 C7 j
        url = 'https://www.bilibili.com/ranking?spm_id_from=333.851.b_7072696d61727950616765546162.3'9 C; ~/ P9 U& _9 j/ f! Q
        html_data = requests.get(url).text) M& G1 w5 D3 i, s, S, g" D' T3 D
        selector = html.fromstring(html_data); e- N# B; B* N% @8 N: e* |, F* z
        infolist = selector.xpath('//li[@class="rank-item"]'). Q! h, y7 q+ H+ k3 `# h7 ?
        for item in infolist:4 L7 t/ e* X0 q4 s8 }1 z  S
            rank = "".join(item.xpath('./div[@class="num"]/text()'))/ S' V- h! ~5 l' m6 w8 e; p
            videolink = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/@href')); p  l4 k1 W- U. A+ S- b
            title = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/text()'))
    & s2 D( s3 f+ }& r9 a. [7 {        playinfo = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/span/text()')).split("万")
    ' }( E9 f1 v  S% p. [4 q        play = playinfo[0] + "万"
    ! g+ [  ?1 E2 @2 w        comment = playinfo[1]
    # T- J$ Q. J& b* b        if comment.isdigit() == False:
    / b! b- |+ f1 k% o4 _            comment += "万"6 b7 S6 V$ ?$ [+ K" o* x
            upname = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/span/text()'))0 C' ]5 s1 m# Z/ z
            uplink = "http:" + "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/@href'))/ `/ `" m+ D# t  o
            hot = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="pts"]/div/text()'))
    , a# S# g  S& g0 m5 c        video_list.append({
    1 W. U: b8 T1 n1 B& c            'rank': rank,0 d! y- Y9 M0 |3 j  s/ P. s
                'videolink': videolink,/ h+ B8 I  B0 y( t! W  G1 s
                'title': title,
    & t$ m) A( {1 y. O            'play': play,
    * o5 f1 r( Y. z+ r3 q8 r- o$ |            'comment': comment,
    # x: T- Q4 s9 f            'upname': upname,1 v5 @  e  I8 H2 K' y/ e3 }
                'uplink': uplink,% W6 \# Y8 z  d+ B7 Y, v& g  j
                 'hot': hot
    # O! v" f0 o, c! q+ x. ^4 ~( Z5 X        })
    ( V5 n% J$ |! V; `2 [" E    return video_list/ C* ]8 \" O: }9 s' z' G

    2 ~! j3 T  x% [, o2 [: N
    3 s. E1 F  D7 j$ d: p
    3.将我们拿到的信息集合(video_list)写入到Excel表格中:
    0 U9 V; i& a% W& }  xlwt的基本使用方法:7 w* g2 T6 W$ ~* ^: }; k; f+ Z
    import xlwt/ {$ ~! M  P' f  @4 K) o% T2 v2 x
    # 创建一个workbook (并设置编码)
    7 N" @& [. q8 t0 A5 Gworkbook = xlwt.Workbook(encoding = 'utf-8')
    # I4 K. y+ Y* }8 p: I# 创建一个worksheet; U/ l( k6 B( X0 _2 d/ G
    worksheet = workbook.add_sheet('My Worksheet')+ K1 q8 h- t9 N" Q4 k* D' J

      Y1 g0 x6 W6 D/ n0 ?6 R6 U# 写入excel6 ^2 H& S" n; a" K  t
    # 参数对应 行, 列, 值,(格式)9 [: `3 w1 T6 Z5 X7 N
    worksheet.write(1,0, label = 'this is test')
    7 g: y3 M5 C* i$ N' t# 保存
    3 Z1 Z5 m$ h  m& O1 u, t2 z6 n" V1 B#参数为你保存该Excel文件的路径
    ' r- z9 a/ H  F9 W( iworkbook.save('Excel_test.xls')
    ' ~' W7 d, P+ V6 ~- D5 {, g  C' h9 `
    * V$ a, c/ R! I: j5 H
      如果我们想要点击视频名或者up的名字可以跳转,那么我们就要使用Excel表格的HYPERLINK方法:- T( D( E0 U: l
    HYPERLINK(“http://www.baidu.com” ; “百度”)5 Z6 [. y7 ~! |/ F; s
    百度为显示在单元格的信息,而前面的链接为跳转链接。
    2 L" T- S: {) E$ l" jxlwt.Formula()方法需要传入一个字符串s,s=‘HYPERLINK(“http://www.baidu.com” ; “百度”)’。. A3 G) ]9 J& ?  r' c7 i
    代码如下:
    4 F" R# {/ W6 V! c! _" ]' i% Z9 P$ K7 {# 将爬取到的数据写入Excel表格4 y) [7 u6 P$ e/ z
    def write_Excel(video_list):& y: |) |( z( \& O& j: Y  a5 j
        print("将b站热门视频信息导入到Excel表格:")3 ~3 n; R" [; _/ Y/ f3 e
        workbook = xlwt.Workbook()  # 定义workbook) E' `2 C, N' W6 t( O4 N4 d
        sheet = workbook.add_sheet('b站热门视频')  # 添加sheet) G0 V0 f& m/ Z* A: T/ j
        xstyle = xlwt.XFStyle()  # 实例化表格样式对象
    $ H& C+ }: I6 b1 E    xstyle.alignment.horz = 0x02  # 字体居中5 W9 z( B# H3 T( ~, }8 o' h% i
        xstyle.alignment.vert = 0x01  # 字体居中
    7 G4 X! g- P+ ]. Y8 a  J# V9 ?  J    head = ['视频名', 'up主','排名', '热度','播放量','评论数']  # 表头: o; ?) f( {- G0 D+ ?3 G6 w
        for h in range(len(head)):, C2 S0 J. x( d" y  o! G
            sheet.write(0, h, head[h],xstyle)  # 把表头写到Excel里面去
      j7 P4 ]- Y1 b0 ]( t% h: R    i = 1: v  K0 I" v! \% P
        for item in video_list:
    , P& f, `  o# y( t5 l" t0 N        # 向单元格(视频名)添加(该视频的)超链接
    ( ^3 J& U: {5 z        title_data = 'HYPERLINK("'+item["videolink"]+'";"'+item["title"]+'")'  # 设置超链接
    & X) V. m  V6 k- q( ^% N        sheet.col(0).width = int(256 * len(title_data) * 3/5)   # 设置列宽) K; Y- r2 \. r
            sheet.write(i, 0, xlwt.Formula(title_data), xstyle)
    1 F9 g) X* i, G- Q" l: }1 ]  M! ~) S. Q        name_data = 'HYPERLINK("' + item["uplink"] + '";"' + item["upname"] + '")'  # 设置超链接: f2 a- P1 `9 R7 o% y: J- K
            sheet.col(1).width = int(256 * len(title_data) * 3 / 10)2 D( f" z& e0 L, r
            sheet.write(i, 1, xlwt.Formula(name_data), xstyle); {* d4 t9 U. X# Q
            sheet.write(i, 2, item['rank'], xstyle)9 c0 @. C$ B( b' u: b4 n
            sheet.write(i, 3, item['hot'], xstyle)
    4 _% m; D% g% A' C        sheet.write(i, 4, item['play'], xstyle)
    - q4 Q" C% c4 t- Z$ i0 W        sheet.write(i, 5, item['comment'], xstyle). X% a: t4 f& n& N
            i += 1
    . h9 U9 c5 C2 D! a    # 如果文件存在,则将其删除1 S) [% e% G8 d, y) {1 z; @. L5 e! v
        if os.path.exists('D:/Test/b站热门视频信息.xls'):
    # f1 h8 J7 v  _        os.remove('D:/Test/b站热门视频信息.xls')
    6 f' E1 k7 v; k$ Y    workbook.save('D:/Test/b站热门视频信息.xls')" H, h; _( d$ [0 B
        print('写入excel成功')" L' {( W. B1 ]6 `9 o/ V6 V
        print("文件位置:D:/Test/b站热门视频信息.xls")
    # Z% g  m6 p  U* |0 }2 A2 O( z- \4 s0 C( p- Z

    # g2 B; b7 Y! c, `4.在入口main中调用上面两个函数
    - H& `/ k8 B& ]' W7 u# J+ Z0 l0 i完整代码如下:+ w, @1 R) n" h& ]! H
    import requests
    * i- l- n7 J; L* y3 o" f8 [from lxml import html! O3 ~# K0 ?9 u: F& x% S  Z
    import xlwt
    ) j6 S# c0 O) H+ r  Simport os
    ; r) d! U+ O- r; {5 M% g4 v  U, m+ @& i: y
    # 爬取b站热门视频信息) a' l9 l! f) Y, ]0 x
    def spider(video_list):6 a/ r+ l2 H9 l5 P! t
        url = 'https://www.bilibili.com/ranking?spm_id_from=333.851.b_7072696d61727950616765546162.3'
    6 Z; k2 _+ n$ {7 g    html_data = requests.get(url).text+ i+ G1 P% Q! v1 A  k
        selector = html.fromstring(html_data)
    " w$ P% i& I% }; v; b# z" U: J    infolist = selector.xpath('//li[@class="rank-item"]')
    9 P% ~% ^) C5 ?, F    for item in infolist:1 f% {3 `1 C1 E( C; s7 K" b# p
            rank = "".join(item.xpath('./div[@class="num"]/text()'))
    + m8 ^" L- P8 p, o, m        videolink = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/@href'))& H* V: J. s* ?# R4 |' x# M. t
            title = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/text()'))
    - Q" {1 Z9 |- G" f" g, {2 B8 q8 ^        playinfo = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/span/text()')).split("万")
    9 X: V& a& B. J9 D        play = playinfo[0] + "万"8 @) Q  \/ q" _
            comment = playinfo[1]
    ( U3 u4 I0 a" u! P        if comment.isdigit() == False:' x, _+ ]% [! f* p' D
                comment += "万"* M, J% W; ^- ^* g
            upname = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/span/text()'))
    8 W2 m3 }, B7 M( u1 D" z        uplink = "http:" + "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/@href'))% B" ?6 F; ]5 R4 U$ z
            hot = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="pts"]/div/text()'))
      m/ h: {) d! q- x0 @2 T7 O; J7 E        video_list.append({
    , D6 s- w( ]2 Q, u7 H% r            'rank': rank,
    % N2 n9 l! z1 ]3 U# h7 W            'videolink': videolink,5 o9 N$ h; e0 d
                'title': title,
    8 }2 i+ r' v: j, `            'play': play,
    ; Z5 e% {- U9 K) ?0 d: @: h+ Y* x            'comment': comment,
    7 j! w0 Q4 ?& l% Y  @# m            'upname': upname,9 W. B2 f/ v; L: ]" z
                'uplink': uplink,
    & j  y4 f( @; v+ u             'hot': hot
    5 `$ G3 S% e4 m) H' K5 {. |. x: E) z        })
    & b7 ?8 r( _9 n9 G& `+ X    return video_list
    4 S: y) ^! d/ Q( E  V2 g5 _9 P
    " ]' v- f1 p3 k/ V' b# 将爬取到的数据写入Excel表格
    . E' a' z) f3 L. K( u( e3 pdef write_Excel(video_list):
    : X+ u9 F9 O( S0 J    print("将b站热门视频信息导入到Excel表格:")
    4 p2 D4 o5 t- a$ s    workbook = xlwt.Workbook()  # 定义workbook: F# j# P! l5 M% Y' ^
        sheet = workbook.add_sheet('b站热门视频')  # 添加sheet4 X/ b2 e1 {4 |" `
        xstyle = xlwt.XFStyle()  # 实例化表格样式对象# y7 S: s5 V- @, j( E6 g
        xstyle.alignment.horz = 0x02  # 字体居中5 F" J$ q! s$ Q. {7 d; @
        xstyle.alignment.vert = 0x01  # 字体居中+ s1 c: j/ {+ p1 P
        head = ['视频名', 'up主','排名', '热度','播放量','评论数']  # 表头9 l8 k+ w6 y# H* l
        for h in range(len(head)):; u+ Y) H; h1 D% N
            sheet.write(0, h, head[h],xstyle)  # 把表头写到Excel里面去
    ; a( _# L2 Z  z( V/ k* q    i = 1, a$ X6 X/ t: d9 X! S& M
        for item in video_list:
    - i9 z  H& p1 X1 C- q        # 向单元格(视频名)添加(该视频的)超链接
    " V5 x. b9 w( T/ M/ }7 |        title_data = 'HYPERLINK("'+item["videolink"]+'";"'+item["title"]+'")'  # 设置超链接  j& W% A9 a, z3 u. n
            sheet.col(0).width = int(256 * len(title_data) * 3/5)   # 设置列宽3 `; I4 y' o, u; l8 x7 k: A
            sheet.write(i, 0, xlwt.Formula(title_data), xstyle)
    ! ?6 M! I# a$ t7 C0 [, D" G4 Y        name_data = 'HYPERLINK("' + item["uplink"] + '";"' + item["upname"] + '")'  # 设置超链接
    8 n% |+ J* e! z0 I4 ]        sheet.col(1).width = int(256 * len(title_data) * 3 / 10)
    7 v6 l" C2 M1 t        sheet.write(i, 1, xlwt.Formula(name_data), xstyle)
    0 T' }6 M: j* o2 S        sheet.write(i, 2, item['rank'], xstyle)6 e! c; K; T0 Y+ |7 O( K
            sheet.write(i, 3, item['hot'], xstyle)
    1 P+ B1 K. d+ m( Y. [* Q' m        sheet.write(i, 4, item['play'], xstyle)
      Q" {9 {" M) v# L- _        sheet.write(i, 5, item['comment'], xstyle)
    : k; u  V, ~4 \1 ]3 w. m        i += 1. ]8 N) m5 f$ ~1 W& C* w3 O
        # 如果文件存在,则将其删除
    . x2 k4 ^6 V4 }, C    if os.path.exists('D:/Test/b站热门视频信息.xls'):
    5 O$ L2 N7 V/ X" n' P        os.remove('D:/Test/b站热门视频信息.xls')
      t* `- F7 P0 y    workbook.save('D:/Test/b站热门视频信息.xls')
    : S' T' F7 `6 g, c+ z) I6 Q" K" E    print('写入excel成功')
    # Q  a4 G3 X3 `6 |7 V* T    print("文件位置:D:/Test/b站热门视频信息.xls")' Y1 e" b7 N+ w0 r& r2 k5 x/ P

    8 }) S4 S! n( T; eif __name__ == '__main__':7 b1 _; i6 X' e
        video_list = []
    5 n" C/ w* |% @    write_Excel(spider(video_list))9 Q: u+ u" `- j, s5 }# \

    : ~' w5 E- C  K. K$ e4 e: Q: D+ J& k" w: S; F/ e: \

    6 p5 E7 X2 t6 [: L: z" ^5 M
    8 ^% ^2 q4 L' [" Y$ g
    4 X( a2 a" s# l
    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, 2025-9-9 23:41 , Processed in 0.311124 second(s), 54 queries .

    回顶部