QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 4429|回复: 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表格( F6 B/ `5 v; M8 q+ t
    效果图:1 V& ^8 @( {9 B2 t5 `3 ~
    1.png 7 Z4 |0 s0 ~: z3 I+ a& Y& `. R' P$ w
    1.工先利其事必先利器,首先我们得下载相应的库:
    $ |  b! F& `! W6 b5 upip install requests6 b+ a1 p% G: M, s; \0 ?) @
    pip install lxml; H9 A; @; J  P( O
    pip install xlwt  u) Y) {: d! C9 Y. c

    8 O8 x, X: ^7 {  U$ F0 O1 Y( d/ ~1 V3 M9 C) y+ a
    requests 向网页发送请求
    ! @2 b7 u5 y9 e8 X  Blxml 处理xml文件(xpath)( T6 }$ u* v' _* N- W
    xlwt 对Excel做写入操作
    7 T5 V* R# D  j, J9 M. @! |% _: @2.爬取b站热门视频的信息:
    8 ^$ D; J6 R: E4 |& ]) X  打开b站热门视频页面:; H2 `2 X3 A+ v+ F
    2.png
    ! v: d( C: }" R6 E4 g  按f12进入开发者选项,然后点击选中你要获取的页面信息,即可找到该信息在该HTML文件中的什么位置(这对我们用xpath获取元素属性和元素值很重要),例如:
    - w( q2 t- h" U4 w% i' L 3.png
    : z! |6 R* T+ l! b3 O- [) }$ G: l. t代码如下:
    ! Z6 \; i$ h/ n) Q1 H3 C# 爬取b站热门视频信息
    % i2 F0 f& Q5 e" Ldef spider(video_list):
    7 J; _( ^  u# E# p$ ~; W5 @! O: i# {  L    url = 'https://www.bilibili.com/ranking?spm_id_from=333.851.b_7072696d61727950616765546162.3'# V' c$ f$ J- V7 L! p5 ?5 e
        html_data = requests.get(url).text0 q3 b1 ~, E, ^6 X2 t7 }
        selector = html.fromstring(html_data)8 f/ e; J9 H5 U  H/ x
        infolist = selector.xpath('//li[@class="rank-item"]')
    5 L8 P6 B0 j  J" T, `    for item in infolist:
    & ]3 f$ k# G- g) W& z- I( R7 Y, E' [- b" D        rank = "".join(item.xpath('./div[@class="num"]/text()'))4 v- ]( l* k/ S, C$ h& r. W
            videolink = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/@href'))
    ( J7 I- s' E$ o  \" r5 [7 M. a        title = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/text()'))
    ; l2 M. s2 g5 u. k2 `. I        playinfo = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/span/text()')).split("万")$ V# V8 y! f& t! D
            play = playinfo[0] + "万"
    4 s  S8 ]/ t! h& G        comment = playinfo[1]
    : A$ @1 v9 i+ C1 v        if comment.isdigit() == False:# \9 P+ A2 E7 O' ~- {% [; u
                comment += "万"8 N. f4 B& i# n% @+ M
            upname = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/span/text()'))8 F( O* m- m' d5 e3 j; G$ n
            uplink = "http:" + "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/@href'))
    9 t( M" g/ [! P9 F        hot = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="pts"]/div/text()'))
    3 s; y" M* K( _$ a/ S; F0 k$ P        video_list.append({. [6 X% L+ R5 m, H
                'rank': rank,$ R" F4 ?- q( i+ h
                'videolink': videolink,
    . }$ c* j: R5 p/ Y- s  a* A7 M            'title': title,
    , A6 B8 w" p+ @: X, B, h8 _) t            'play': play,$ o% h, w8 l3 L, x6 l
                'comment': comment,$ ~+ N+ a4 \- y, D
                'upname': upname,
    5 Z% [, {  k- S# M6 _" t            'uplink': uplink,* ]. R# p: L2 X0 w( s
                 'hot': hot$ [0 i0 @$ z8 R6 ]: ^3 G# _1 O
            })  f# H) u. u% {1 R; K
        return video_list
    : Q/ g1 y1 j5 m, \' Q- H2 _0 h: a% _
    7 E. D0 a4 x1 y" u3 z
    3.将我们拿到的信息集合(video_list)写入到Excel表格中:5 @3 J" Z5 G2 o" S/ m) P! t! F
      xlwt的基本使用方法:* a% r0 U/ W& ~' [
    import xlwt
    : |) ~* |. ^% R  ?$ I# 创建一个workbook (并设置编码)% l7 f5 v) g" K/ J& E- ~0 H
    workbook = xlwt.Workbook(encoding = 'utf-8')
    * l' j# ?2 T) k& e7 x3 q# 创建一个worksheet
    2 u7 w" Q2 e3 hworksheet = workbook.add_sheet('My Worksheet')
    - I! q0 E( K8 H9 B8 M$ n* O9 G- l( ]
    # 写入excel' g% B  o/ _% J0 u; P
    # 参数对应 行, 列, 值,(格式)7 }* {0 w9 Z/ j. w7 l) A1 z
    worksheet.write(1,0, label = 'this is test')' }/ ^& X: L0 T; ^' @( ?% ~% d, H
    # 保存6 G" c+ M! M" U& R$ B
    #参数为你保存该Excel文件的路径
    3 T9 v! z1 n& [  |: D1 \9 i# V1 vworkbook.save('Excel_test.xls')- g2 L- z; G6 Q2 c

    3 e. @0 X+ L1 ?( W+ q6 W; G) f' v; c( m$ N( {( G1 [
      如果我们想要点击视频名或者up的名字可以跳转,那么我们就要使用Excel表格的HYPERLINK方法:
    3 P! w5 A" P) E" Y5 zHYPERLINK(“http://www.baidu.com” ; “百度”)
    # X+ [" ?. B) y, \' I百度为显示在单元格的信息,而前面的链接为跳转链接。
    ' c; A) ]6 r6 A5 nxlwt.Formula()方法需要传入一个字符串s,s=‘HYPERLINK(“http://www.baidu.com” ; “百度”)’。
    : W4 H' z% x8 o* {9 I3 n代码如下:
    6 m0 W' b) Q- X# 将爬取到的数据写入Excel表格
      G! X) j9 v% F" o, ^2 }3 D* Zdef write_Excel(video_list):/ `: B" W$ |. t( u% l; @( j/ X
        print("将b站热门视频信息导入到Excel表格:")5 N! M* w4 O0 K( k
        workbook = xlwt.Workbook()  # 定义workbook& w; @# |4 {, R% h$ L2 V5 w
        sheet = workbook.add_sheet('b站热门视频')  # 添加sheet4 s; f1 H2 W' Z! P
        xstyle = xlwt.XFStyle()  # 实例化表格样式对象
    / T: q3 [3 {1 g9 A    xstyle.alignment.horz = 0x02  # 字体居中
    ( `7 x" Q3 n9 i1 x) {+ a    xstyle.alignment.vert = 0x01  # 字体居中) g$ u8 u2 h, s# _
        head = ['视频名', 'up主','排名', '热度','播放量','评论数']  # 表头
    1 _7 R. d+ f0 I! y, L    for h in range(len(head)):
    9 E9 ?" i2 X' Q& X/ e4 [$ B        sheet.write(0, h, head[h],xstyle)  # 把表头写到Excel里面去0 ~2 F5 n, P/ _3 G2 ?& g! o' c( g
        i = 1- ~6 s0 f; v# n8 Q4 ?% |' q
        for item in video_list:
    ) u; r3 c. I1 x; {        # 向单元格(视频名)添加(该视频的)超链接
    " }. E( h( E; W- h        title_data = 'HYPERLINK("'+item["videolink"]+'";"'+item["title"]+'")'  # 设置超链接
    ' u/ Z5 f: Z" \4 m, n        sheet.col(0).width = int(256 * len(title_data) * 3/5)   # 设置列宽6 B2 s8 V- {2 ]
            sheet.write(i, 0, xlwt.Formula(title_data), xstyle)$ _+ I- j' `: ]
            name_data = 'HYPERLINK("' + item["uplink"] + '";"' + item["upname"] + '")'  # 设置超链接
    8 y+ U! k" q/ G$ O# Z6 t, Q8 O        sheet.col(1).width = int(256 * len(title_data) * 3 / 10)) T, x/ `$ q% Z0 \( A# E6 a: d  C
            sheet.write(i, 1, xlwt.Formula(name_data), xstyle)
    0 C! H: ]7 {# M4 M* F0 D3 p        sheet.write(i, 2, item['rank'], xstyle)1 z; q: I" t! l0 l+ _6 U
            sheet.write(i, 3, item['hot'], xstyle)
    , T- G2 y) D; z7 F        sheet.write(i, 4, item['play'], xstyle)% ^) [( H0 ^0 J# Y, ?1 b$ H
            sheet.write(i, 5, item['comment'], xstyle)
    3 M/ [% ~/ a; F3 }* h        i += 1+ e5 T2 P3 W6 a" E- i
        # 如果文件存在,则将其删除
    3 F9 z  o5 i" D" L    if os.path.exists('D:/Test/b站热门视频信息.xls'):  M0 G0 d/ `+ w: c: g! h* d4 L
            os.remove('D:/Test/b站热门视频信息.xls')
    # Y' J2 f/ x6 t+ V9 n2 V- u    workbook.save('D:/Test/b站热门视频信息.xls')
    ) J5 Y% g0 M/ p2 B    print('写入excel成功')
    ; w# Y! z/ V/ z3 J' v5 W( _    print("文件位置:D:/Test/b站热门视频信息.xls")2 R2 X8 D3 v* z, P- i0 R
    + R" Q# U+ h5 T9 ]3 x
    * j% @0 H( x+ L3 H# C1 G
    4.在入口main中调用上面两个函数; z! X+ H$ \! X* n  b& L
    完整代码如下:+ }7 \2 [. S5 J
    import requests3 ]6 R% x( }9 H) J( w9 u0 M; k2 c
    from lxml import html
    1 t6 F- b9 z4 i6 t, rimport xlwt. Z: F* f8 ]' U. }5 B, S( t1 v2 T
    import os6 ]+ a/ K7 o/ E, A
    ! q* n3 D: }. W9 z( B# \' o- ^& n
    # 爬取b站热门视频信息; h# ?. _% v: G3 D8 ^- B! h
    def spider(video_list):- O, X! v& A& j- _- i* T6 ^4 i
        url = 'https://www.bilibili.com/ranking?spm_id_from=333.851.b_7072696d61727950616765546162.3'# C" }3 R- a( k! l% j! J
        html_data = requests.get(url).text) ?* h" z: ]0 }7 U1 I9 T' T% [  r
        selector = html.fromstring(html_data)& G) F. l3 w; C7 H
        infolist = selector.xpath('//li[@class="rank-item"]')
    2 g% v8 x$ S. _. b3 j7 _    for item in infolist:5 w& ]" u* t  R2 Z% D8 k) y
            rank = "".join(item.xpath('./div[@class="num"]/text()'))0 {9 B" |! k1 V# }0 U6 C
            videolink = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/@href')). e8 o# [8 k# M9 ?1 _/ Q
            title = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/text()'))1 }+ y. _1 o; C2 t
            playinfo = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/span/text()')).split("万")7 [( L* k6 \. x! _6 U  c- Q$ m0 F
            play = playinfo[0] + "万"
    ! e; j- I5 l6 J  A4 h        comment = playinfo[1]
    ' @" w! j) H, d9 L" y! z        if comment.isdigit() == False:1 g9 D- e9 c; ?  n# f! ^" g
                comment += "万"
    8 d: e7 u) r9 u* P/ F1 F* U0 N        upname = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/span/text()')). u/ ?, Z( H2 k) G" S7 w
            uplink = "http:" + "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/@href'))+ l* j0 b* ^  C5 [' G% q& P' k
            hot = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="pts"]/div/text()'))! j7 @1 X: u. v$ [5 i3 B3 g
            video_list.append({
    , {1 D4 Z1 k' b; |: L            'rank': rank,9 }2 B: @# x: D+ F
                'videolink': videolink,# g  H8 o- }* _! R9 s( n' }
                'title': title,
    ) m. G9 T, M1 S8 q            'play': play,
    ' r% D7 Q3 l3 T9 ]6 G0 a; \9 P            'comment': comment,
    * u; g# g( y% a1 }            'upname': upname,/ p+ \+ Y4 Z- y. s# X
                'uplink': uplink,9 S, k4 f% U- D' [2 X/ S
                 'hot': hot) a& [( K( F& I
            })' Q) U! d9 q) R
        return video_list" X& U8 m" j, B! `: j
    ( a! d. Q3 h& k0 |5 j
    # 将爬取到的数据写入Excel表格
    , I: ^* O. ]# O$ l/ q( gdef write_Excel(video_list):
    4 F4 a" Q, H, C+ A: D    print("将b站热门视频信息导入到Excel表格:")/ v( M, [2 ?2 @5 h
        workbook = xlwt.Workbook()  # 定义workbook, q0 [$ c9 r/ A3 X! _# \
        sheet = workbook.add_sheet('b站热门视频')  # 添加sheet
    , ]. a  c& T5 o# e! r    xstyle = xlwt.XFStyle()  # 实例化表格样式对象
    ! ~, g0 ~$ }: n* I6 g    xstyle.alignment.horz = 0x02  # 字体居中
    : j( d2 K0 d! s7 b+ O    xstyle.alignment.vert = 0x01  # 字体居中- K" l% P- \- h- _/ x
        head = ['视频名', 'up主','排名', '热度','播放量','评论数']  # 表头9 x. P6 M! \0 q3 W4 G+ q" o8 ^" J
        for h in range(len(head)):  }7 z. W% I5 M2 v2 Q* U% h) B
            sheet.write(0, h, head[h],xstyle)  # 把表头写到Excel里面去
    - r$ y+ [$ |& T; Z) |( [* A    i = 1: o. u% H4 M: ~  N5 M- `- x
        for item in video_list:
    & {, H; V! U! Q& r7 ~        # 向单元格(视频名)添加(该视频的)超链接3 |2 k4 N- ~; A+ d6 Y' Q
            title_data = 'HYPERLINK("'+item["videolink"]+'";"'+item["title"]+'")'  # 设置超链接; f5 i2 v- W2 c! f8 ~  D
            sheet.col(0).width = int(256 * len(title_data) * 3/5)   # 设置列宽
    . ~1 S8 e9 O8 r9 ^6 ^5 r5 R        sheet.write(i, 0, xlwt.Formula(title_data), xstyle)
    " g5 W; D: W+ k# F7 f        name_data = 'HYPERLINK("' + item["uplink"] + '";"' + item["upname"] + '")'  # 设置超链接
    / \" a* T5 i% C7 ^1 G' H" I        sheet.col(1).width = int(256 * len(title_data) * 3 / 10)8 }+ l  A; V+ @6 a; @; r
            sheet.write(i, 1, xlwt.Formula(name_data), xstyle)
    ! e, _  y4 z* h! Q* b8 M  v& b% @, i        sheet.write(i, 2, item['rank'], xstyle)) F6 j; F- `6 U' z
            sheet.write(i, 3, item['hot'], xstyle)9 a4 r" V& `( {" o" `
            sheet.write(i, 4, item['play'], xstyle)/ M7 ?: {# M4 \& ^# B  m$ ]
            sheet.write(i, 5, item['comment'], xstyle)$ G' b( Y( a- a8 m" K
            i += 1
    + L% `! d3 i# x% z7 L    # 如果文件存在,则将其删除
    1 T- S8 v' ^% B& J( e7 I    if os.path.exists('D:/Test/b站热门视频信息.xls'):8 t- Q/ h4 Z* q  G+ v& S4 a
            os.remove('D:/Test/b站热门视频信息.xls')
    3 M) e+ {* F$ k5 ?    workbook.save('D:/Test/b站热门视频信息.xls')
    1 y' }4 B- h7 H) d9 ^    print('写入excel成功')
    : u/ W/ s5 U$ q! w    print("文件位置:D:/Test/b站热门视频信息.xls")! d, {3 h$ o: r0 k9 R
    : S  n/ r! z5 g# _: x
    if __name__ == '__main__':
    2 E. p2 F% `" H. Z5 M# c    video_list = []$ d; l( A& ]( }/ M# R+ o0 L
        write_Excel(spider(video_list))
    - d* S; l1 @: d) }0 Q9 t
    " K- w8 q! C+ j5 O
    & G; r: T8 g' ]; {1 S2 i+ u- r0 h# S7 l8 U; E9 j. P  f, b
    5 h9 n$ k+ Q$ u! h
    / G: e; A4 f0 B1 v) `/ V
    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-6-3 01:10 , Processed in 0.432186 second(s), 54 queries .

    回顶部