QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3826|回复: 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表格/ e+ Y" v* {' {0 U2 ?# J6 |
    效果图:
    2 Q- n% |9 \. ]2 Z- ]8 r 1.png
    1 a. ]9 V$ X" o& a0 F; _7 i1.工先利其事必先利器,首先我们得下载相应的库:
    / A/ D! e0 Y- U: ~5 spip install requests
    $ O8 D( D4 [% u: }- z" ipip install lxml
    ' k* H, d( z( Jpip install xlwt  C5 M0 @7 j+ |3 m% @3 e

    ( t; R5 G) d2 d9 H. W" b( l' a
    ' Z8 \9 A' b* r/ ^) nrequests 向网页发送请求
    2 S. E$ x& z. ?3 f5 Blxml 处理xml文件(xpath)
    ; z& g( F* l, }9 m9 U8 W7 I8 Fxlwt 对Excel做写入操作8 U/ s1 X. D0 T  ]
    2.爬取b站热门视频的信息:0 Y; _) U3 _6 V% S
      打开b站热门视频页面:' p. [9 X& Z  t2 U! b
    2.png
    " D# z$ J  w0 T: K  按f12进入开发者选项,然后点击选中你要获取的页面信息,即可找到该信息在该HTML文件中的什么位置(这对我们用xpath获取元素属性和元素值很重要),例如:
    ! R- w3 m; {. c/ O$ } 3.png . s6 L' d8 T1 {
    代码如下:
    " i. a" C' ]* X( F% w# s# 爬取b站热门视频信息
    & d" C. U: D, |$ F! c5 o5 J9 Udef spider(video_list):8 a( A2 ~7 Z* x+ V6 A/ {
        url = 'https://www.bilibili.com/ranking?spm_id_from=333.851.b_7072696d61727950616765546162.3'; J& A+ o; C0 n9 t+ K3 O
        html_data = requests.get(url).text
    / b$ x: q9 L- h5 G    selector = html.fromstring(html_data)
    % G" k- \+ P: _/ p1 W" Q' o    infolist = selector.xpath('//li[@class="rank-item"]')
    $ y% {0 S+ e' ]1 w. V0 J" v2 P0 X    for item in infolist:( M. l5 H& n1 y% [7 L+ O" S
            rank = "".join(item.xpath('./div[@class="num"]/text()'))2 x4 o- T' \0 B) ?
            videolink = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/@href')): K! s6 d+ @; Z% P$ ?
            title = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/text()'))1 B( ]8 ^- [2 ?1 ~% q1 X
            playinfo = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/span/text()')).split("万")$ S( V9 m) k# u; A2 z# B
            play = playinfo[0] + "万"
    1 p- I+ F# e! a, ?% d  Z' D        comment = playinfo[1]
    & P! g& l# G# G; e$ C3 F, Q        if comment.isdigit() == False:
    * q5 d* J  q3 u            comment += "万"" n& m- j: g! g  f7 a9 z
            upname = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/span/text()'))1 f( p+ S4 I( J
            uplink = "http:" + "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/@href'))7 C' o) R2 c6 H7 _6 T0 q/ W# ?
            hot = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="pts"]/div/text()'))
    ! O; o* T  B: x% g) @1 H        video_list.append({
    : Z) L+ L4 X2 J7 x# i! Q% r* r            'rank': rank,
    1 r$ r9 p5 n# T  j            'videolink': videolink,
    8 b/ q) ^, _2 ?  N8 p; X            'title': title,
      t! {' Z: I% f6 G            'play': play,
    % V' [' ^# `( J3 M4 w+ B            'comment': comment,; \( `9 P3 S4 K% a
                'upname': upname,: n; h: t! z$ ?; B. z! O; q
                'uplink': uplink,
    / A- p* B( k$ r: O             'hot': hot
    4 K/ r+ v1 G; ]        })5 z) c  V- M1 H4 k" W' M
        return video_list
    + F, O$ x1 n- P4 T; I4 v' x& O4 |. s0 X4 I/ |& W

    - s0 i8 Y5 F4 {) Z& x9 }3.将我们拿到的信息集合(video_list)写入到Excel表格中:
    " ]9 g6 B# }! y8 b  xlwt的基本使用方法:
    # N, r0 d1 _! {2 ]8 y1 u# k% S% zimport xlwt
    3 E. }! H  R2 o3 J9 G6 o% d# 创建一个workbook (并设置编码)
    5 F3 i6 G& x* U6 sworkbook = xlwt.Workbook(encoding = 'utf-8')+ @  C8 d" k+ d% ~
    # 创建一个worksheet1 \7 _/ c- `; Q) C& v
    worksheet = workbook.add_sheet('My Worksheet')
    + a( |) g5 J' H7 w$ L) T3 u
    : k7 R9 M& q1 U9 k, g/ N7 c# 写入excel
      @- U6 c) `( M" z1 r$ ~" G7 l8 K5 x# 参数对应 行, 列, 值,(格式)
    # W  W3 s. R# X" o4 s4 @6 E# V# _" Cworksheet.write(1,0, label = 'this is test')
    ( F0 r: B/ w+ E' w$ S' X7 h- v8 v# 保存8 p7 ^+ B, @6 X! ^1 v5 O; j! b
    #参数为你保存该Excel文件的路径+ u1 G2 x6 G5 v; y3 ]
    workbook.save('Excel_test.xls')
    - P, J: X* ?- M- W5 n: h# }  [- K) }
    - ^! i$ G6 J5 ~6 B; a$ T/ s
      如果我们想要点击视频名或者up的名字可以跳转,那么我们就要使用Excel表格的HYPERLINK方法:
    , T: r3 W, d, K1 F+ U$ A+ t: K) mHYPERLINK(“http://www.baidu.com” ; “百度”)/ I- ~: x8 p- s& B4 {
    百度为显示在单元格的信息,而前面的链接为跳转链接。' f5 _  U. ~& I' k2 m
    xlwt.Formula()方法需要传入一个字符串s,s=‘HYPERLINK(“http://www.baidu.com” ; “百度”)’。3 G1 ]; F) Q) M' d& `) X) z
    代码如下:
    ) f; V: W7 ]9 A3 A4 ?* G! u# 将爬取到的数据写入Excel表格
    - ~. m* g1 p3 r  n  jdef write_Excel(video_list):
    $ z' \# y4 u& |/ k" j: L4 F) u    print("将b站热门视频信息导入到Excel表格:")
    ' W6 `1 |2 f6 n( n+ m) T7 ]/ E    workbook = xlwt.Workbook()  # 定义workbook( s. @6 ?) ?+ R0 L; r8 Q# b
        sheet = workbook.add_sheet('b站热门视频')  # 添加sheet
    1 z! e: r& X" Z% x7 y2 h2 l2 A. S    xstyle = xlwt.XFStyle()  # 实例化表格样式对象* m" M2 K  B1 O0 g
        xstyle.alignment.horz = 0x02  # 字体居中
      q! y4 D/ U% O+ F    xstyle.alignment.vert = 0x01  # 字体居中6 O  D3 D0 z5 w' s6 y
        head = ['视频名', 'up主','排名', '热度','播放量','评论数']  # 表头
    ' r9 P% L; B4 Z    for h in range(len(head)):
    3 c7 i/ o$ t( v/ Y8 a# r+ P        sheet.write(0, h, head[h],xstyle)  # 把表头写到Excel里面去
    ' }/ y' V! S: D4 @% F' I9 G    i = 1
    7 G1 L4 t9 D& k    for item in video_list:1 D. R; r0 Y0 J1 v
            # 向单元格(视频名)添加(该视频的)超链接7 u% G) `1 S5 J. z: w
            title_data = 'HYPERLINK("'+item["videolink"]+'";"'+item["title"]+'")'  # 设置超链接& b5 [: v7 p* P) u, ?
            sheet.col(0).width = int(256 * len(title_data) * 3/5)   # 设置列宽
    / w7 \5 y+ s$ w+ n        sheet.write(i, 0, xlwt.Formula(title_data), xstyle)
    * C# H: x* q7 D1 j4 J5 [        name_data = 'HYPERLINK("' + item["uplink"] + '";"' + item["upname"] + '")'  # 设置超链接
    2 {# |! k, Q, d& z( ^' L& Y        sheet.col(1).width = int(256 * len(title_data) * 3 / 10)/ q* [4 p, {* ^2 N/ j" g6 U" U
            sheet.write(i, 1, xlwt.Formula(name_data), xstyle)
    $ d! \1 z4 i3 m        sheet.write(i, 2, item['rank'], xstyle)
    " ~: r9 y' r; S, Y& a4 S" F        sheet.write(i, 3, item['hot'], xstyle)1 ?3 L8 x) g! h4 `7 t
            sheet.write(i, 4, item['play'], xstyle)
    / @$ g8 h: _) d$ S( h2 E        sheet.write(i, 5, item['comment'], xstyle)/ ^$ S& l) t% X7 g! _1 h
            i += 1& @5 A/ R! S( v* E8 ?4 O
        # 如果文件存在,则将其删除. d! g8 D8 h/ |! ?
        if os.path.exists('D:/Test/b站热门视频信息.xls'):
      g) ?0 |5 @$ A8 {        os.remove('D:/Test/b站热门视频信息.xls')
    % D5 e# x1 F+ N: a; [9 M    workbook.save('D:/Test/b站热门视频信息.xls'). f1 f* U& Z$ m# j& d- }
        print('写入excel成功')0 X* b0 K" A# @& b
        print("文件位置:D:/Test/b站热门视频信息.xls")- S- P; K( }. q5 \8 `

    $ }' c6 t/ ]/ ]/ }  e- J! O7 L# a9 t
    4.在入口main中调用上面两个函数4 ]: z8 Z. d$ Z; m
    完整代码如下:
    5 M% a; ^  w: R  q( @7 M/ Cimport requests
    - [! I) g6 Y& T3 P) i* {2 Xfrom lxml import html1 q5 Y+ \: B$ ?" I
    import xlwt
    0 I' Q& F" L$ d" U, u! t3 N4 Nimport os# S  M1 S$ w$ t% p1 ~
    - v& @7 ~+ L8 N% N! k
    # 爬取b站热门视频信息# o, A# l5 s$ [1 u. k. Q* n9 Z
    def spider(video_list):" E; K" O: K+ u7 i1 L" j
        url = 'https://www.bilibili.com/ranking?spm_id_from=333.851.b_7072696d61727950616765546162.3'! X1 K3 @$ A1 i0 `+ j
        html_data = requests.get(url).text
    6 u7 j2 R* @9 O5 ^    selector = html.fromstring(html_data)
    5 Q6 u5 N1 z$ r+ H& c0 M$ U0 H: P    infolist = selector.xpath('//li[@class="rank-item"]')
    ; T5 l7 Q8 l& v% \4 ]# k    for item in infolist:6 U- Z2 g6 H( ?. t, Z
            rank = "".join(item.xpath('./div[@class="num"]/text()')), C9 _1 P* t/ |# m+ J
            videolink = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/@href'))
    - |6 S; W5 R- U; b1 t7 i        title = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/text()'))9 B8 v. P0 d/ Q( I
            playinfo = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/span/text()')).split("万")
    # o) y6 G2 _$ b* \8 R2 U; q        play = playinfo[0] + "万"1 c: z2 M2 b$ h; C5 g) m) u
            comment = playinfo[1]5 m) h8 Y; s6 T2 q
            if comment.isdigit() == False:
    # Q& }9 A6 e$ j; I* x0 Z            comment += "万"  h" G$ i/ x8 o3 D+ m
            upname = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/span/text()'))3 Q& R3 Q1 a5 u1 z
            uplink = "http:" + "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/@href'))
    $ T% A  ]  L  Y* K# \, X/ u6 y, j! ]3 g        hot = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="pts"]/div/text()'))
    ( m# {% D+ T, Z# x+ C6 x( \% K        video_list.append({
    . k  |# V0 p' c            'rank': rank,. T' n8 w; M; {! U' I
                'videolink': videolink,
    4 M- \- c. q. b9 y, y; N* y            'title': title,: G3 h. {7 g4 [/ F( [1 p
                'play': play,
    / G# g9 V) r) b" l$ t            'comment': comment,
    " a8 ?, B2 [+ c2 f% q# i4 ?            'upname': upname,
    / _8 P0 S# P, U' i* G* R# [            'uplink': uplink,
    * R$ `. }0 ]! M, a  s  _9 y             'hot': hot
    ' ~9 \  |4 d2 }6 q- _0 I        })
    0 M. P" u7 E5 q5 b8 a- v    return video_list
    6 _$ Z7 L# n; L0 u: r
    / X: t- ^6 E' p  d- c# 将爬取到的数据写入Excel表格5 z! ?1 g1 g7 t. C
    def write_Excel(video_list):9 |2 g4 L2 E# a: i/ F) P
        print("将b站热门视频信息导入到Excel表格:")  U# R# S! w5 V
        workbook = xlwt.Workbook()  # 定义workbook
    & y8 D+ n  b* X4 {5 z. A% n# P    sheet = workbook.add_sheet('b站热门视频')  # 添加sheet: v" `; y3 L1 t
        xstyle = xlwt.XFStyle()  # 实例化表格样式对象* C4 J" f& e4 d( _$ p; @/ @! ~
        xstyle.alignment.horz = 0x02  # 字体居中
    1 S, Q0 {% i  L% ~9 a1 i/ N* h1 V6 C    xstyle.alignment.vert = 0x01  # 字体居中
    - ^6 k1 l( w5 ?; n5 @& f- d    head = ['视频名', 'up主','排名', '热度','播放量','评论数']  # 表头
    4 a# X7 E( M$ c  Y    for h in range(len(head)):& f$ t: u5 f. h' b& L/ @  _
            sheet.write(0, h, head[h],xstyle)  # 把表头写到Excel里面去
    0 b, z/ K. R0 D0 K    i = 1
    3 Y0 u& X8 M8 k' K; Q: w2 S    for item in video_list:; X+ A0 _0 b( G& Z" M% F. b
            # 向单元格(视频名)添加(该视频的)超链接8 m; [' G- H9 D  [1 |; k, O+ n* d
            title_data = 'HYPERLINK("'+item["videolink"]+'";"'+item["title"]+'")'  # 设置超链接* f* P( v" z8 O. b# F  `
            sheet.col(0).width = int(256 * len(title_data) * 3/5)   # 设置列宽" L+ D9 x7 A, `2 [# Z" M
            sheet.write(i, 0, xlwt.Formula(title_data), xstyle)7 s; u  ~, I1 h. f, W
            name_data = 'HYPERLINK("' + item["uplink"] + '";"' + item["upname"] + '")'  # 设置超链接
    % |- r) m, g- V, X* ~. G4 b        sheet.col(1).width = int(256 * len(title_data) * 3 / 10)
    & R% N7 l  P6 A. E1 ~: ]        sheet.write(i, 1, xlwt.Formula(name_data), xstyle)
    . |8 \8 o7 b+ D        sheet.write(i, 2, item['rank'], xstyle)( E+ S! R. y4 j
            sheet.write(i, 3, item['hot'], xstyle)
    + m0 L- b: |  B5 |, q  L        sheet.write(i, 4, item['play'], xstyle)
    ' @  l/ I/ u. N% k        sheet.write(i, 5, item['comment'], xstyle)# ^  G. _' e/ m8 G5 e5 |
            i += 1/ [- `. h0 J' |/ d( `
        # 如果文件存在,则将其删除$ _% A! q' o. n; G" w, [
        if os.path.exists('D:/Test/b站热门视频信息.xls'):+ l8 O2 [/ o2 t
            os.remove('D:/Test/b站热门视频信息.xls')* t! v4 L' b% W
        workbook.save('D:/Test/b站热门视频信息.xls')
    / J* n' A% M8 K& T9 G    print('写入excel成功')
    % {1 P6 B% ]0 Z  N& l& R% Y    print("文件位置:D:/Test/b站热门视频信息.xls")1 K  M) r/ I6 D! [* E, ^& q
    # k/ X9 y- N* l. C4 o# W- Y
    if __name__ == '__main__':5 f' [! V" q8 I! R* W: T
        video_list = []
    0 R7 n  S& b( Y0 T    write_Excel(spider(video_list))
    2 o& M& E; R2 F* D
    # a, j1 E) j0 M- t+ j& M: f  V) D* X
    . y' C& J% U' ~% R3 w0 B% M! F" r5 O3 g
    ; G$ d7 P2 _0 ]% c8 f# F) ]

    : z1 j" ^- o3 f2 f8 P9 W
    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-8-20 23:53 , Processed in 0.420621 second(s), 53 queries .

    回顶部