QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 4415|回复: 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 h# r4 ~/ e  b+ e  T2 Z9 q  V* i9 M, V& I效果图:
    - u* Y9 N6 l* V9 z 1.png 5 t4 U$ U! |, \
    1.工先利其事必先利器,首先我们得下载相应的库:
    3 o0 U( X' \5 I+ s" l+ {4 z2 Lpip install requests) L" d' C- L' @# a( t
    pip install lxml
    2 E; Z$ f5 C9 ~1 U0 \; p% Wpip install xlwt
    1 B1 M: u3 N. q" ]6 g) x- v# e  G+ u! A

    2 c" E8 ~+ V: p5 i4 Z- Rrequests 向网页发送请求, D. \' A2 R4 N( p4 H
    lxml 处理xml文件(xpath)
    9 r+ U) ^/ S3 o3 x* B) A6 cxlwt 对Excel做写入操作
    # c. D9 x4 Z. d4 w, o1 [2 i2.爬取b站热门视频的信息:
    5 ~4 F. d  J5 Q  s  打开b站热门视频页面:  B6 m+ m. R1 ?3 n! P4 x: K, b
    2.png
      y, y1 f/ Y4 O4 h6 n7 j  按f12进入开发者选项,然后点击选中你要获取的页面信息,即可找到该信息在该HTML文件中的什么位置(这对我们用xpath获取元素属性和元素值很重要),例如:
    3 U- u1 C' G0 [; S1 m' O( t! Y 3.png
    5 p% D, F4 Y7 ]9 t; f; Q/ j代码如下:- F4 L6 \( N. R9 \3 c2 i6 B
    # 爬取b站热门视频信息
    ! q  Y/ Z) }; [& o# h4 N( Idef spider(video_list):) e" N( C9 x: ~- _# C! c
        url = 'https://www.bilibili.com/ranking?spm_id_from=333.851.b_7072696d61727950616765546162.3'
    - j5 v2 C+ j2 |5 z2 U    html_data = requests.get(url).text4 G! E! m, ^& t& _! s! x  Q
        selector = html.fromstring(html_data)
    1 e4 C7 V, m( w! \8 @3 B    infolist = selector.xpath('//li[@class="rank-item"]'): L& O+ P2 X+ }
        for item in infolist:
    + Q8 E* F% f6 C0 g        rank = "".join(item.xpath('./div[@class="num"]/text()'))
    1 j: Z* s% ?( `% C: V9 a* V        videolink = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/@href'))
    / E" o/ H) U" d9 x/ H        title = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/text()'))' g, R# Z5 B3 L0 A3 l. y
            playinfo = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/span/text()')).split("万")
    & ]% W; X7 D8 P7 J, N& o        play = playinfo[0] + "万", C8 V( Z0 R% L! |
            comment = playinfo[1]
    1 s/ m" J; v1 O        if comment.isdigit() == False:; c- i# ?8 b2 h1 \: i
                comment += "万"5 H# R6 |! C1 H. k
            upname = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/span/text()'))' w& ~3 R! t0 v
            uplink = "http:" + "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/@href'))
    8 p$ f7 x* F3 b) A1 E& q        hot = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="pts"]/div/text()'))
    3 E2 q& [9 ]3 l! ]% ^1 t4 H        video_list.append({* f* b4 r' n& h7 r$ L. e, ^* ~
                'rank': rank,2 p3 V. W( Z5 I$ }  I# }( k
                'videolink': videolink,5 F( @4 w* \$ J/ T. M8 p$ N
                'title': title,
    & I! o; ]1 t7 [0 n- [, g            'play': play,* ?0 `: j2 i) B, Q2 Q
                'comment': comment,
    $ z8 e" v- w# p3 l* z            'upname': upname,
    ; E" G( H  a& T5 G& K& M% c            'uplink': uplink,( G* _' G9 \: s9 P1 A
                 'hot': hot
    " u5 u) G9 S9 T$ ?1 }        })
    ; T: ?: M0 n: C5 m& b2 @& l    return video_list
    9 V1 ]6 U1 M8 d
    / m. K* K; z- @, ^
    0 \9 ]0 U/ q' T: c. i0 w& M5 {
    3.将我们拿到的信息集合(video_list)写入到Excel表格中:2 g6 a! ]) h4 o
      xlwt的基本使用方法:/ v# b2 A0 [& O  z+ Q- f
    import xlwt
      Q! g% [7 I5 l8 ~; R# 创建一个workbook (并设置编码)
    : J/ k  t9 E2 G1 y2 |& p% U$ h4 `$ iworkbook = xlwt.Workbook(encoding = 'utf-8')
    * ?' {3 C) W) p. D2 h# 创建一个worksheet3 n6 L+ B, q9 x
    worksheet = workbook.add_sheet('My Worksheet')
    , S# v  L' a5 X" S7 N8 T; |6 X% o7 E4 k& t- r' u1 n
    # 写入excel+ I2 K9 J. ]( I9 f! e6 ^, ]5 Z/ _  |
    # 参数对应 行, 列, 值,(格式)
    2 x: T# m6 ~- k' Y' p+ p" r( Gworksheet.write(1,0, label = 'this is test')( [$ F" {% b9 w: x5 a% w7 ~  A, \
    # 保存6 {1 m+ y) |# }. l/ O' K# `* u4 v
    #参数为你保存该Excel文件的路径
    ; ~( n  H- |( q& `5 Z& K/ e& I" Kworkbook.save('Excel_test.xls')
    4 a3 r$ }/ S2 z( E' @% Y4 j/ k0 L, \% b- z1 V! o
    " U, S5 B: K+ Y4 g# p0 B& D" _
      如果我们想要点击视频名或者up的名字可以跳转,那么我们就要使用Excel表格的HYPERLINK方法:' _, Z5 P) S* _/ r5 n- N- V5 l
    HYPERLINK(“http://www.baidu.com” ; “百度”)' T* h. I! \* U6 G# d+ Z
    百度为显示在单元格的信息,而前面的链接为跳转链接。  A& i! e: L4 m+ d6 a. ]6 z/ d$ y
    xlwt.Formula()方法需要传入一个字符串s,s=‘HYPERLINK(“http://www.baidu.com” ; “百度”)’。; {0 u* U; Y. q: I8 F/ |
    代码如下:
    3 d* D  z0 A' T3 _, L# H/ Q# 将爬取到的数据写入Excel表格8 ?! @. b  {! ?6 |
    def write_Excel(video_list):
    % |5 W+ x9 C2 f% i    print("将b站热门视频信息导入到Excel表格:")4 ]4 ~, R; t: b
        workbook = xlwt.Workbook()  # 定义workbook. S; o2 H* E+ r0 j7 Q4 }
        sheet = workbook.add_sheet('b站热门视频')  # 添加sheet% ]9 n, c& K. T% T1 D$ R
        xstyle = xlwt.XFStyle()  # 实例化表格样式对象& I* x. c! y; m: b, Y8 f
        xstyle.alignment.horz = 0x02  # 字体居中; p+ X) N; [/ Z" X& i+ k* d, Y
        xstyle.alignment.vert = 0x01  # 字体居中
    " j: Q8 s) L' Q1 _! w1 ]/ k    head = ['视频名', 'up主','排名', '热度','播放量','评论数']  # 表头
    . Y! @6 y/ c- {9 l& Z. w    for h in range(len(head)):
    ( J+ b+ |" L0 x* G, Z! D5 @% t5 B        sheet.write(0, h, head[h],xstyle)  # 把表头写到Excel里面去
    9 n; D& b0 o. w    i = 1: m8 Z5 ]0 t6 U0 `) R. z
        for item in video_list:
    , f0 q8 f2 p+ o$ l3 f8 @, r        # 向单元格(视频名)添加(该视频的)超链接. s- |! l/ ^; ~0 n* |
            title_data = 'HYPERLINK("'+item["videolink"]+'";"'+item["title"]+'")'  # 设置超链接
    " x4 l* }. ]" ?+ r8 G        sheet.col(0).width = int(256 * len(title_data) * 3/5)   # 设置列宽) ~' r" j; Y( K" F7 @' u4 Y
            sheet.write(i, 0, xlwt.Formula(title_data), xstyle)1 K9 i* J/ P) R3 t/ Q
            name_data = 'HYPERLINK("' + item["uplink"] + '";"' + item["upname"] + '")'  # 设置超链接
    ) t8 ~8 F2 X* H        sheet.col(1).width = int(256 * len(title_data) * 3 / 10)
    ! F3 D2 R* u- M+ r        sheet.write(i, 1, xlwt.Formula(name_data), xstyle)7 U2 A9 P! |4 K
            sheet.write(i, 2, item['rank'], xstyle)
    ' W, y2 \' J3 n! j        sheet.write(i, 3, item['hot'], xstyle)" ]8 f% ^. c# h  v% b- M% D
            sheet.write(i, 4, item['play'], xstyle)
    4 r: R5 C0 T; ~        sheet.write(i, 5, item['comment'], xstyle)$ Y2 K7 E2 A3 O1 ?9 e6 O' y
            i += 1& E7 \% {2 l3 ~; W% l+ [& |: Y
        # 如果文件存在,则将其删除
    & p2 m( u" F$ |    if os.path.exists('D:/Test/b站热门视频信息.xls'):
    / P. t7 C/ g/ P1 q( E3 p        os.remove('D:/Test/b站热门视频信息.xls')+ I# X) X, g0 t# f" ~; ?
        workbook.save('D:/Test/b站热门视频信息.xls')
    : Z! m' R9 |; l/ h# O& f5 F- P5 v1 I    print('写入excel成功')) w9 z+ |' n  E5 g' A
        print("文件位置:D:/Test/b站热门视频信息.xls")5 J$ D4 ]( V0 o9 b8 M

    6 H3 L, n9 o! G. K! }  A! G: i- @3 f9 k. f! N
    4.在入口main中调用上面两个函数
    ( R* ^% Q& S! A1 ~: i完整代码如下:
    ( m4 |! f% D# \: ]import requests
    1 L$ v8 ]  ?5 e* Tfrom lxml import html. J# u4 V8 i; }8 d
    import xlwt3 Z2 [. G  z; ^6 ]3 W) V# L; G& k8 y
    import os
    8 s+ G5 @5 }* `! o, I' y0 F- J" {) l$ v% Y, W) u2 @
    # 爬取b站热门视频信息0 h7 w: j1 I7 O" i
    def spider(video_list):  Y9 q5 s9 w9 d, w" {4 L( u
        url = 'https://www.bilibili.com/ranking?spm_id_from=333.851.b_7072696d61727950616765546162.3'% e4 {6 G  K" ]3 K' g( J( [1 c
        html_data = requests.get(url).text  g$ Z/ G* _+ @+ n( c
        selector = html.fromstring(html_data)
    . x: X7 N, t3 M  H: w    infolist = selector.xpath('//li[@class="rank-item"]')
    4 b( g, [( K; R9 Z4 O7 o! b7 `    for item in infolist:: ]' u0 w: i4 G
            rank = "".join(item.xpath('./div[@class="num"]/text()'))
      d2 @+ |; `9 k$ Z& E, q; O        videolink = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/@href')). e# ~& F; e9 a; e0 `0 p- u
            title = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/text()'))9 E' K2 e2 E' {9 g$ u8 p
            playinfo = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/span/text()')).split("万")3 u- ?4 ^# |: M
            play = playinfo[0] + "万"
    ! z7 Z; M+ ?3 }; x( |, R8 N& C( u        comment = playinfo[1]1 ~/ e( X2 h1 Y  }+ m# w
            if comment.isdigit() == False:* `2 T6 Y6 X, P+ t  g" }
                comment += "万"# _( K. Y) M. W& T$ y3 D
            upname = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/span/text()'))0 C  Z$ i9 b5 h
            uplink = "http:" + "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/@href'))9 ?' W: u9 v9 l% ?" N) [/ \
            hot = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="pts"]/div/text()'))+ r% z. c7 F2 w7 Y* [. m$ v
            video_list.append({
    8 l  ~: |5 l6 h4 p  d            'rank': rank,
    4 M1 Q* q# e7 Z* ]6 Q. Q' d  `; H            'videolink': videolink,
    , u( j; F' F* E1 ?6 y            'title': title,
    7 e: q6 {9 Y/ {            'play': play,9 e; d1 @  \# B! w$ [) X4 b
                'comment': comment,
    - w! F7 S/ a; \: c; q( \1 O6 R5 h            'upname': upname,
    2 r+ ?' l! j0 T* L9 ^; t            'uplink': uplink,  Z& [$ r% P# M+ P$ B1 z
                 'hot': hot4 ^6 F9 w- w1 \$ E! J$ A
            })
    / w+ {; g7 U8 _$ |' @    return video_list
      i  ]& w& p. q5 G, {  C# `5 k% {' i
    # 将爬取到的数据写入Excel表格
    7 K, g+ o, ]% G; y) G$ Ndef write_Excel(video_list):/ {8 g- v3 r# m: F& r
        print("将b站热门视频信息导入到Excel表格:")
    3 e* H0 w# H: `' y/ ^    workbook = xlwt.Workbook()  # 定义workbook
    $ v% a# c' l+ b& ?8 y4 t    sheet = workbook.add_sheet('b站热门视频')  # 添加sheet
    ) I& R8 e4 ]' p0 B+ ]5 O7 t    xstyle = xlwt.XFStyle()  # 实例化表格样式对象& L+ e+ R& X* ]4 r* V
        xstyle.alignment.horz = 0x02  # 字体居中/ t% z' O5 p1 g& b1 C
        xstyle.alignment.vert = 0x01  # 字体居中4 U! f1 @0 X; y& k% p' B+ v
        head = ['视频名', 'up主','排名', '热度','播放量','评论数']  # 表头
    6 S3 S7 f/ S. [( S, _    for h in range(len(head)):3 S6 k9 u( ]; r+ R3 A
            sheet.write(0, h, head[h],xstyle)  # 把表头写到Excel里面去
    $ i$ o1 t( }1 T% Q# _    i = 1
    ; v4 Y: J+ S8 v; n* B- J. t  Q    for item in video_list:. a$ {* U$ j% n& ]9 |; Y
            # 向单元格(视频名)添加(该视频的)超链接
    ' `" e$ D. Q9 _4 {, W        title_data = 'HYPERLINK("'+item["videolink"]+'";"'+item["title"]+'")'  # 设置超链接' H9 B  j% \6 g* b5 r
            sheet.col(0).width = int(256 * len(title_data) * 3/5)   # 设置列宽2 a  @2 s* o- F0 o& f
            sheet.write(i, 0, xlwt.Formula(title_data), xstyle)
    $ |- J4 X8 o) y: w' x3 [3 G        name_data = 'HYPERLINK("' + item["uplink"] + '";"' + item["upname"] + '")'  # 设置超链接
    * p0 \6 v3 D& h5 O! }        sheet.col(1).width = int(256 * len(title_data) * 3 / 10)
    . B4 p" X2 ?; i7 F. j" ?' o# J+ i$ E        sheet.write(i, 1, xlwt.Formula(name_data), xstyle), b; e# k9 j6 b/ H+ E( y
            sheet.write(i, 2, item['rank'], xstyle)
    ( k, R. A; P6 \" b) Y* C        sheet.write(i, 3, item['hot'], xstyle)
    + k  I. j. q8 A- a6 R" y1 F) v' Y8 x        sheet.write(i, 4, item['play'], xstyle)
    6 |1 j* r. A* I/ Y% F1 W* F        sheet.write(i, 5, item['comment'], xstyle)  M) u) @6 c( J+ N  {
            i += 18 z9 i8 X9 [& Y6 l" D. F& }/ |( I2 \
        # 如果文件存在,则将其删除! F) H6 }- J! `2 z" Q
        if os.path.exists('D:/Test/b站热门视频信息.xls'):
    , i, E' x6 ?% o' D. B- b. l        os.remove('D:/Test/b站热门视频信息.xls')( x; r' b7 @# K- v
        workbook.save('D:/Test/b站热门视频信息.xls')( L: y7 V) W) W- j6 |6 F! b
        print('写入excel成功')7 s2 X. }( t8 R8 E8 J% |4 @7 q
        print("文件位置:D:/Test/b站热门视频信息.xls")
    & d; ]( r( Z. R3 Y& ?% U& t5 e" o# J+ Q" v2 Y
    if __name__ == '__main__':* `6 F: S% G, \2 ~1 _
        video_list = []
    - ?' P# r& q% K1 O( B8 H    write_Excel(spider(video_list))
    1 n( k- _8 V/ }! g# r6 |2 j2 S$ l; r" n; w
    : v4 j7 k# U9 v* U9 H
    ! |. o3 Z/ L3 s
    0 V  F  e+ z2 T2 z1 T
    " T: K7 z3 M/ `
    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 18:35 , Processed in 0.439444 second(s), 53 queries .

    回顶部