QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 4471|回复: 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 I1 P5 Z9 N+ F! r效果图:2 c$ C' D4 [: J5 h
    1.png
    ) `% ~& P; O: ~( k+ I8 z1.工先利其事必先利器,首先我们得下载相应的库:
    : d( X' r# e) b3 ~" ]2 T% Jpip install requests, z  w9 A7 c# [+ R2 [  H1 ?" s
    pip install lxml
    0 o# e  ?) O2 ?- }pip install xlwt$ R; }3 N4 e- J5 I% v- `8 `

    4 S! \3 B6 F0 ^6 {0 ~% W5 ]4 A) B
    requests 向网页发送请求
    * B: m, P7 G6 g0 r9 y, Llxml 处理xml文件(xpath)
    3 J4 u# {: O! ]+ r. ]( txlwt 对Excel做写入操作
    : O+ q3 h1 w8 T9 H$ i2.爬取b站热门视频的信息:6 p; V3 W1 k" _/ O' G
      打开b站热门视频页面:
    6 n; w% @1 p, R8 C9 t" @. b$ ] 2.png 6 q. |5 W! L& _8 Z8 B
      按f12进入开发者选项,然后点击选中你要获取的页面信息,即可找到该信息在该HTML文件中的什么位置(这对我们用xpath获取元素属性和元素值很重要),例如:9 y# H  o6 L/ ^5 s
    3.png
    7 X- M# k# v5 c3 |7 K) X代码如下:* W! E. {; s. i. v2 _
    # 爬取b站热门视频信息( @) z  T7 H5 \3 s
    def spider(video_list):/ |+ {2 A+ b. ^5 J! J4 b" G
        url = 'https://www.bilibili.com/ranking?spm_id_from=333.851.b_7072696d61727950616765546162.3'
    ; X* D) N  \/ Z    html_data = requests.get(url).text) d7 ?7 I8 y1 w0 ^/ H0 r
        selector = html.fromstring(html_data)# s* ?& \4 r$ e7 U
        infolist = selector.xpath('//li[@class="rank-item"]')3 U" W/ z% F+ X
        for item in infolist:2 Z% I( |1 K% X2 S
            rank = "".join(item.xpath('./div[@class="num"]/text()'))/ J# U( Q& X/ l
            videolink = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/@href')): T1 j( m" \0 L: m9 J2 |3 _1 u
            title = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/text()'))
    3 T% c6 ?3 ]3 {2 `4 \" h+ F        playinfo = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/span/text()')).split("万")
    & a% m" {( H+ N! v7 u8 E5 w/ j5 F        play = playinfo[0] + "万". |8 Z0 y& x$ C/ E! j
            comment = playinfo[1]" e" q1 K/ c4 u7 O2 o
            if comment.isdigit() == False:7 a" O" u! |8 c. f
                comment += "万"! x1 G2 k: {& t6 Y
            upname = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/span/text()'))
    7 a' v! `2 ^) Y5 i: f$ W; m7 R        uplink = "http:" + "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/@href'))
    8 J$ Z4 }; m5 b6 J4 P        hot = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="pts"]/div/text()'))
    + y& r& c3 P( b6 _4 P5 h* W        video_list.append({
    ' ^. q- P2 d/ E! k7 ?% y& q            'rank': rank,
    / {0 e% s* H0 n0 u3 A            'videolink': videolink,
    * b+ b5 b" s# Q: L7 h2 q            'title': title,
    6 ^- f  f; ^" S! G            'play': play,8 I& T$ H" ~1 O, Q$ B7 \+ l* `
                'comment': comment,
    - T/ r+ B! _: B7 n/ U            'upname': upname,
    / Q( D" l  [- ]7 e0 H/ ~            'uplink': uplink,
    2 D' G& O- }1 h- S/ g4 z             'hot': hot/ N6 C+ C6 ]/ `+ w! Y) ?2 f% M
            })
    + f8 F5 z. ]% }5 t6 ^, Z    return video_list# l% K; y6 ?. z

    7 _/ p. P: \1 Z/ a

    # @: ~+ [* M  S. M6 z3.将我们拿到的信息集合(video_list)写入到Excel表格中:8 r2 C% Z5 {( D1 [' C3 K
      xlwt的基本使用方法:
    6 G/ r( T  V& x3 \+ A( [import xlwt. f5 ]6 P% Q  r; V
    # 创建一个workbook (并设置编码)
    , J: n+ k) r8 E, S  `) Oworkbook = xlwt.Workbook(encoding = 'utf-8')
    3 T6 E% a" V; K+ t4 ^& {/ R# 创建一个worksheet
    9 j( o, u% Q! ?" tworksheet = workbook.add_sheet('My Worksheet')( U7 n: `; ~( F# @( `: W6 g4 K
    - M( h! p0 e$ L9 F6 ~& J
    # 写入excel
    / a3 f! R3 l( Q5 H# 参数对应 行, 列, 值,(格式)
    ; u/ N8 m" s5 o0 f8 N! Z" iworksheet.write(1,0, label = 'this is test')
    4 Q. w, u* P5 m7 k8 ?# 保存* t. E9 S7 z3 d
    #参数为你保存该Excel文件的路径% x4 M. @: [- L* _# C) H0 H
    workbook.save('Excel_test.xls')
    - [( C5 P* ~( Z8 J2 L
    9 d4 B& ^1 v+ }7 i
    ; B4 |8 ?8 ^. ?% H: [& l: _3 r  如果我们想要点击视频名或者up的名字可以跳转,那么我们就要使用Excel表格的HYPERLINK方法:$ z9 D, m: m4 h+ s! T* M9 c% Q
    HYPERLINK(“http://www.baidu.com” ; “百度”)$ I, q5 Q9 j2 w' E0 Q5 G
    百度为显示在单元格的信息,而前面的链接为跳转链接。# I0 T8 J* _% Q
    xlwt.Formula()方法需要传入一个字符串s,s=‘HYPERLINK(“http://www.baidu.com” ; “百度”)’。
    % F  s" g, W) w代码如下:
    6 c; s# _! ^0 u# 将爬取到的数据写入Excel表格
    ; S6 R0 `3 B9 Adef write_Excel(video_list):
    8 x) V" U" o" U$ W7 {/ T3 i    print("将b站热门视频信息导入到Excel表格:")
    : _7 m* `- N4 d) w7 |& J    workbook = xlwt.Workbook()  # 定义workbook
    , i: t5 E' m" K  k, i    sheet = workbook.add_sheet('b站热门视频')  # 添加sheet
    - t1 t5 G9 ]9 l    xstyle = xlwt.XFStyle()  # 实例化表格样式对象
    " L; y& h/ Y. v; i    xstyle.alignment.horz = 0x02  # 字体居中% k8 p& e# j/ ?; |2 k5 {: @
        xstyle.alignment.vert = 0x01  # 字体居中1 {! r& C/ }3 S* Q% d/ q4 w
        head = ['视频名', 'up主','排名', '热度','播放量','评论数']  # 表头
    8 Y( i9 F' \$ a    for h in range(len(head)):
    % U- @. e! W; A3 c% v- U        sheet.write(0, h, head[h],xstyle)  # 把表头写到Excel里面去4 X6 I' B3 O2 d7 v
        i = 1
    % e8 a1 Z. ^1 ?    for item in video_list:9 G( ~- D  L5 Z" J9 e1 c- E
            # 向单元格(视频名)添加(该视频的)超链接
    # n+ l: Z% G. T        title_data = 'HYPERLINK("'+item["videolink"]+'";"'+item["title"]+'")'  # 设置超链接8 o2 l1 U3 }' r6 f2 G+ D! W
            sheet.col(0).width = int(256 * len(title_data) * 3/5)   # 设置列宽
    3 K+ |  x; x! o' L! |8 ~9 J) h        sheet.write(i, 0, xlwt.Formula(title_data), xstyle)
    # `+ `, z: `* ]' J1 ~        name_data = 'HYPERLINK("' + item["uplink"] + '";"' + item["upname"] + '")'  # 设置超链接/ U" G# \9 v) ~1 }4 X9 H
            sheet.col(1).width = int(256 * len(title_data) * 3 / 10)8 b* l( c" @% H# N& J) |  i
            sheet.write(i, 1, xlwt.Formula(name_data), xstyle): X  W6 R/ n( q% x. [' K" |- e
            sheet.write(i, 2, item['rank'], xstyle)* `1 B4 R) |, e; D; \3 ]- s( p
            sheet.write(i, 3, item['hot'], xstyle)
    ; o8 J# @. k- z* z; |) Q. H2 t4 D        sheet.write(i, 4, item['play'], xstyle)
    ( m/ `  Y& j* }- ^5 ]  }        sheet.write(i, 5, item['comment'], xstyle)
    % E, S# ^/ V1 I        i += 1) _4 E2 D$ P' J
        # 如果文件存在,则将其删除
    ' B" n5 n6 Q2 }" D    if os.path.exists('D:/Test/b站热门视频信息.xls'):
    & f- \" v. V/ T. q( H' P        os.remove('D:/Test/b站热门视频信息.xls')1 r1 n* X4 Q5 j% n" z( m
        workbook.save('D:/Test/b站热门视频信息.xls')
    $ |9 [# R; ?! C# h# I& q$ b    print('写入excel成功')
    . y; e6 m/ [% `) a- Y    print("文件位置:D:/Test/b站热门视频信息.xls")
    % Q- t& u  t7 d8 V
    ! |  ]0 c" V7 I/ f' t6 {& |& w: b! `* ?$ V  s% G
    4.在入口main中调用上面两个函数
    : M" e% w2 ^$ }3 ^" Z6 h6 @完整代码如下:6 \$ r# C4 e& ]1 O
    import requests
    , A7 C, J# ^8 [/ y0 L2 afrom lxml import html1 _9 L% ]7 J2 o, B4 a
    import xlwt& c; d% q# J" a. f) `( }
    import os* A6 Y! g, l/ z) l; h& e5 H
    8 u/ `- g) w2 h0 V
    # 爬取b站热门视频信息
    # Q9 L7 C& M. S+ ]' g1 K/ a6 W& xdef spider(video_list):$ P  s8 ?1 [2 F6 _/ g0 x6 c
        url = 'https://www.bilibili.com/ranking?spm_id_from=333.851.b_7072696d61727950616765546162.3'
    + W' n: m1 O- ^% L' x( g    html_data = requests.get(url).text
    : R9 t: t: N& M1 W2 I2 v    selector = html.fromstring(html_data)2 `+ Z3 D' F1 q* d- B6 e
        infolist = selector.xpath('//li[@class="rank-item"]')3 Q2 A! [- ^) F% K8 d0 X" {- d& }; r
        for item in infolist:% Z1 x9 J3 G" E4 l) c) I6 r, x& M
            rank = "".join(item.xpath('./div[@class="num"]/text()'))0 m% m& R- G0 ?
            videolink = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/@href'))3 u. ?3 D8 I0 c( R
            title = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/text()'))
    * G$ r% Y6 L* |9 E# f, O$ H        playinfo = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/span/text()')).split("万")
    $ v5 b2 b) v8 c  f) ]        play = playinfo[0] + "万"
    ! F3 |9 r0 q1 \7 D. k! o# V3 r  e0 _        comment = playinfo[1]0 H7 h6 x5 o" g( ~5 H3 N
            if comment.isdigit() == False:
    5 A, E6 K6 V8 N            comment += "万". j3 ^, A; J  \6 ?5 v
            upname = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/span/text()'))% t; e0 G: w7 n' K# N( `
            uplink = "http:" + "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/@href'))7 ^# j8 D( w" ^
            hot = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="pts"]/div/text()'))
    2 e% b& y' y6 l0 O, j- J8 o        video_list.append({
    1 I- N1 O& @& q. p# J            'rank': rank,& a( n2 ~* k; p: {( a' e
                'videolink': videolink,+ S. G! P6 r8 |2 j) s
                'title': title,
      Q8 y0 J# P- A0 i( c            'play': play,2 a) F6 z: ]" W3 x
                'comment': comment,
    " R$ l# \3 t% t9 S( L/ H! W' @            'upname': upname,
    * U  a$ r0 b5 m            'uplink': uplink,
    5 V2 |3 T7 g7 e) k             'hot': hot
    - P: x+ J2 d) ~2 c1 V        })
    % L( [" T( \4 l' v+ I  L/ h3 s- P    return video_list
    2 m5 K2 N; E; W% e
    7 l4 B; t" F$ m+ ^* \# 将爬取到的数据写入Excel表格
    ' o. c$ I9 S& vdef write_Excel(video_list):
    $ X- ]8 o) J$ S  X, X0 T5 Y$ L    print("将b站热门视频信息导入到Excel表格:")
    # I- r/ i9 e: c4 s    workbook = xlwt.Workbook()  # 定义workbook
    ) S! m0 R. a% y. ?    sheet = workbook.add_sheet('b站热门视频')  # 添加sheet' ~& g' p9 A- k' W! W4 H/ O" U) Q5 n
        xstyle = xlwt.XFStyle()  # 实例化表格样式对象
    , l; j3 E3 f5 t' Y    xstyle.alignment.horz = 0x02  # 字体居中
    , \' Z1 Q/ s: ^+ u; e. k    xstyle.alignment.vert = 0x01  # 字体居中# F" E8 ?& _# K. Y+ V% R2 w. E
        head = ['视频名', 'up主','排名', '热度','播放量','评论数']  # 表头
    / [- q  Z& g  l+ O# g7 G    for h in range(len(head)):
    , ^! |0 B/ N- ?/ G" X        sheet.write(0, h, head[h],xstyle)  # 把表头写到Excel里面去' ^1 U  F1 @% T' P6 f/ v: j
        i = 1& F2 x& w* X9 ?7 L
        for item in video_list:+ `9 }5 i  R+ D# W) o1 X/ U
            # 向单元格(视频名)添加(该视频的)超链接3 L) P* I" G( T3 e3 n2 S
            title_data = 'HYPERLINK("'+item["videolink"]+'";"'+item["title"]+'")'  # 设置超链接
    - L) z& D+ o- T; N* ?( s- A( ^        sheet.col(0).width = int(256 * len(title_data) * 3/5)   # 设置列宽
      L& W; ~& @( z3 X        sheet.write(i, 0, xlwt.Formula(title_data), xstyle)' Q' W7 N  N2 p% [0 E
            name_data = 'HYPERLINK("' + item["uplink"] + '";"' + item["upname"] + '")'  # 设置超链接
    3 i: x7 h! O9 t9 b# x* I% ]        sheet.col(1).width = int(256 * len(title_data) * 3 / 10)
    / i5 p) L( O* m0 l4 g5 ?4 O        sheet.write(i, 1, xlwt.Formula(name_data), xstyle), M9 I8 |; r( O" v. V
            sheet.write(i, 2, item['rank'], xstyle)
    : O: c  Z4 w% u        sheet.write(i, 3, item['hot'], xstyle)
    . x+ }8 {) Y( }# P- o! Q        sheet.write(i, 4, item['play'], xstyle)
    % g  h2 i/ C: E( a& N: z- g3 p        sheet.write(i, 5, item['comment'], xstyle)/ e0 Y, V$ {8 u( I! ?3 C, c5 \" ?7 u
            i += 1/ Y# v) T. g9 z0 m( f! z/ ?
        # 如果文件存在,则将其删除
    $ m+ u' y* ~8 |" j2 X* R9 x    if os.path.exists('D:/Test/b站热门视频信息.xls'):
    6 t6 u$ R, {" V        os.remove('D:/Test/b站热门视频信息.xls')4 U( C+ O" t( C2 X9 a6 k0 H0 |
        workbook.save('D:/Test/b站热门视频信息.xls')
    $ f7 o1 d# `; ]) j, g8 G; ]    print('写入excel成功')$ c* j9 d, q9 s1 J& G
        print("文件位置:D:/Test/b站热门视频信息.xls")
    % H' w7 S) A& i' W9 I( R1 M0 G4 \$ ?) P$ q7 O
    if __name__ == '__main__':
    . `- _' S- B4 e& N    video_list = []
    ( p8 g) l$ l1 L: S6 [' Q    write_Excel(spider(video_list))  V2 D/ c. d8 G0 }. Q! l

    8 f. U! @* h) s
    6 V1 c. b& [. L; y5 c+ E9 ^1 p1 J( R& Z& r& W$ m/ D3 h

    4 w8 D4 u/ l, Z& m  G. A% A3 L5 U, j/ Q  O* d$ |/ ?) A
    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-2 08:28 , Processed in 0.571403 second(s), 53 queries .

    回顶部