QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 4419|回复: 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表格0 R& y3 e! F" c: N6 m* c- m1 G
    效果图:
    0 t4 j: G: _/ M+ s 1.png % s7 P8 C3 J( N: {
    1.工先利其事必先利器,首先我们得下载相应的库:
    : J1 l( f$ b5 T! \% i3 Spip install requests
    % f" a* N+ ^% Q& u/ g4 |pip install lxml
    ; @: `  @9 N1 V% x- Ppip install xlwt
    ! ]4 r  O$ ~0 c  X! l  R$ V0 o' _& M! J1 z6 g$ U

    , ~" X% x# Z* t5 \( W$ w4 \# Z9 Hrequests 向网页发送请求5 O1 V) B9 a) d' L' a% p
    lxml 处理xml文件(xpath)
    6 B/ i7 o' b' P& V( E, cxlwt 对Excel做写入操作1 y3 C3 n/ F0 {7 d+ F
    2.爬取b站热门视频的信息:; }) m; \* G% Q, l; X/ t7 b
      打开b站热门视频页面:
    ! t9 Q7 K4 M5 w& A" p3 d 2.png " p! Y8 q$ P% E' l1 }8 L3 U
      按f12进入开发者选项,然后点击选中你要获取的页面信息,即可找到该信息在该HTML文件中的什么位置(这对我们用xpath获取元素属性和元素值很重要),例如:
    ; Y3 @! S. U1 |. d 3.png 7 Z( \0 n' [( a" X7 U
    代码如下:
    9 M! K! ?! Y; e: H% F; u) A0 S& a# 爬取b站热门视频信息
    0 _, v$ y$ U7 A& w: X; p$ Hdef spider(video_list):
    ) Y* I( \  j( f, m/ U! Q    url = 'https://www.bilibili.com/ranking?spm_id_from=333.851.b_7072696d61727950616765546162.3'' L5 G! \, Z+ L- p, }
        html_data = requests.get(url).text* ~# x: E) K6 o# p# O/ A
        selector = html.fromstring(html_data)4 F& ^# F( v; o* m" N
        infolist = selector.xpath('//li[@class="rank-item"]')
    ' _# r  ~) ^+ F- k- N. y. d) ?    for item in infolist:5 \/ `7 `% [( D1 m- S; n
            rank = "".join(item.xpath('./div[@class="num"]/text()'))
    4 M5 C9 n2 r: w( H        videolink = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/@href'))
    5 E# h$ c0 M! N2 {        title = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/text()')); p' `, _* Y! j8 O1 O. K
            playinfo = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/span/text()')).split("万")
    % E! D' g% w1 O: U( T7 r        play = playinfo[0] + "万"2 G0 h9 V5 a, `% u, E, g
            comment = playinfo[1]
    ; [% p5 v6 S8 |0 |        if comment.isdigit() == False:
    1 _# `: G, b5 c+ o& f) i& h. n8 ^! M            comment += "万"' \8 F& a! m# ?) e4 l& C7 C3 e( I
            upname = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/span/text()')); d5 |3 z1 _1 f+ r3 E0 w
            uplink = "http:" + "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/@href'))
    * f3 k4 N/ L* U1 }) H        hot = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="pts"]/div/text()'))7 E% q6 z! R2 \4 `7 B, M& k3 Q; _
            video_list.append({
    % m8 X# C( \4 y6 y9 r' v7 `1 i            'rank': rank,
    7 _1 @) }  ~1 H  h            'videolink': videolink,
    6 {7 [' ^& R) S) d+ v% p            'title': title,
    * O) G3 y6 d5 D+ n- ~            'play': play,7 k, F" t) u. n, D( Y
                'comment': comment,
    0 N7 M1 Y* W" \4 U            'upname': upname,
    ; x) X3 E" k7 ^: k            'uplink': uplink," d( Y/ J! q* X1 F
                 'hot': hot
    - X+ d7 f0 }4 S" t7 _' H; _        })
    0 n3 ~' E* p" P  E    return video_list$ V  R" p: q7 c! ^3 r
    : c; ?& L* P. T( o0 {7 o
    3 G1 _& M' [. N& j
    3.将我们拿到的信息集合(video_list)写入到Excel表格中:
    3 P; X* f. z( F1 z% P. F  xlwt的基本使用方法:( `" z/ K- A/ t7 U' o6 W; f
    import xlwt( M' ?6 E0 j! l" w: _( ]
    # 创建一个workbook (并设置编码)
      p. @1 ]7 q+ w0 \! g, N# s, sworkbook = xlwt.Workbook(encoding = 'utf-8')& T. x* Q8 w' n$ w# L
    # 创建一个worksheet
    ) l4 m+ L) ^/ s$ _* aworksheet = workbook.add_sheet('My Worksheet'). A, c9 b2 ?0 r; J; O, Y, d" }) u: ?
    2 l5 B5 m2 t9 i3 Z5 K# k7 w% `
    # 写入excel
      P( D( l# C& ~8 Z3 n9 c# 参数对应 行, 列, 值,(格式)" ~" m- x9 F9 a& R
    worksheet.write(1,0, label = 'this is test')
    : l% b* x8 v8 A" h/ F# 保存5 h2 U7 n% H: P
    #参数为你保存该Excel文件的路径
    # }4 h- t9 K3 B% N/ G3 Hworkbook.save('Excel_test.xls')
    : C- ^5 b4 Q1 u/ O. Y# V  j- b+ N
    0 A5 M$ _% B5 ~! L! a9 V& P1 f  S. d' f1 z* U
      如果我们想要点击视频名或者up的名字可以跳转,那么我们就要使用Excel表格的HYPERLINK方法:; G; P' |5 T1 k: Y' V0 p8 q
    HYPERLINK(“http://www.baidu.com” ; “百度”)/ T$ t1 u2 X" _
    百度为显示在单元格的信息,而前面的链接为跳转链接。
    ! F+ n% k7 L; s% `  q; x9 j8 g8 vxlwt.Formula()方法需要传入一个字符串s,s=‘HYPERLINK(“http://www.baidu.com” ; “百度”)’。; r# y. y/ r# f; k2 J( b$ _( A/ |
    代码如下:" p5 z: L1 P. W6 U$ L& c* h
    # 将爬取到的数据写入Excel表格4 N) k: f% e6 S7 i7 R  Z
    def write_Excel(video_list):6 u6 Z, A; a$ }) b7 ]
        print("将b站热门视频信息导入到Excel表格:")" w+ G$ I6 p6 \! B8 p
        workbook = xlwt.Workbook()  # 定义workbook
      ]1 u9 a" e6 z- \9 D    sheet = workbook.add_sheet('b站热门视频')  # 添加sheet4 x+ \4 ~8 S( s+ W4 @
        xstyle = xlwt.XFStyle()  # 实例化表格样式对象
    ; q+ I5 |/ C  W5 K    xstyle.alignment.horz = 0x02  # 字体居中
    9 {# h; F, N. l: _    xstyle.alignment.vert = 0x01  # 字体居中
    2 O5 A/ ]& y5 E    head = ['视频名', 'up主','排名', '热度','播放量','评论数']  # 表头
      H& j( z7 Z+ X& t6 J    for h in range(len(head)):# J+ a% T, j5 \4 c, F
            sheet.write(0, h, head[h],xstyle)  # 把表头写到Excel里面去
    8 S9 H# Z- S- a6 [: k# _* W    i = 1! c% G8 b8 O" Y" L+ n/ C
        for item in video_list:
    ! g9 v; q! }+ Q6 d        # 向单元格(视频名)添加(该视频的)超链接
    9 g0 q0 m0 v" k, u. A! f  y        title_data = 'HYPERLINK("'+item["videolink"]+'";"'+item["title"]+'")'  # 设置超链接
    ( U) r( A1 M7 q: F& q! Q0 i) M$ x        sheet.col(0).width = int(256 * len(title_data) * 3/5)   # 设置列宽
    6 j- T% {+ u+ @4 X% D) Q        sheet.write(i, 0, xlwt.Formula(title_data), xstyle)
    4 X; _5 x$ s0 M9 H' u% R! ?! _0 Q. g/ n        name_data = 'HYPERLINK("' + item["uplink"] + '";"' + item["upname"] + '")'  # 设置超链接
    0 ?" @. t1 J. z+ c4 I, F. F7 J        sheet.col(1).width = int(256 * len(title_data) * 3 / 10)
    - f$ V4 K  H9 ^& D3 j        sheet.write(i, 1, xlwt.Formula(name_data), xstyle)
    % h: n# I0 r4 I! F, B# F* o        sheet.write(i, 2, item['rank'], xstyle)* M) Q( h1 O# e7 J4 }' I
            sheet.write(i, 3, item['hot'], xstyle)
    # ~1 `2 M; L: N# l$ g+ u! W+ i  N        sheet.write(i, 4, item['play'], xstyle), z; _( h4 R; |
            sheet.write(i, 5, item['comment'], xstyle)& i( L4 F% l" K; B
            i += 1
    8 k$ G+ I) c- s9 [    # 如果文件存在,则将其删除6 ~$ {6 D# e1 L2 U) K1 T+ h9 b
        if os.path.exists('D:/Test/b站热门视频信息.xls'):2 Z$ h2 p  W. r
            os.remove('D:/Test/b站热门视频信息.xls')# {& R7 x6 u9 g, ?
        workbook.save('D:/Test/b站热门视频信息.xls')" A$ l' ~* f1 h$ O
        print('写入excel成功')$ ^( Y7 K5 d/ ?6 ~
        print("文件位置:D:/Test/b站热门视频信息.xls")
    ! V& y" D( W$ Z3 m! V  y1 K
    # R: ]' h' p. D: M2 I" q/ \. {  d! J
    4.在入口main中调用上面两个函数
    ! A; p, n0 N; G% d# \* h7 L完整代码如下:8 J/ I9 d) q7 n! l' U
    import requests
    6 v, L$ I3 r; Sfrom lxml import html
    1 M. V2 B9 a  S. A# timport xlwt: c+ w3 x* w. K  W1 s
    import os
    6 h% Z9 V- ]) k: U) {) j4 C, q) r7 e
    # 爬取b站热门视频信息  x/ E5 a/ i4 o- K
    def spider(video_list):8 `' c, e; v: Q& Z6 j$ J6 F5 V, J
        url = 'https://www.bilibili.com/ranking?spm_id_from=333.851.b_7072696d61727950616765546162.3'3 M4 x8 \, V0 i+ A& j
        html_data = requests.get(url).text
    % y& {+ d5 W- A4 f' D) Y6 a. s    selector = html.fromstring(html_data)$ @$ U: A' i; _' m+ l4 D. g- t
        infolist = selector.xpath('//li[@class="rank-item"]')
    : n9 m. @9 I" P; d4 T5 d% |    for item in infolist:/ r, b- X5 T* U0 y4 ?3 Y% w
            rank = "".join(item.xpath('./div[@class="num"]/text()'))& {3 r, B# ?8 Y& E
            videolink = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/@href'))
    , l6 E- X* P' s+ F' _/ L+ z        title = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/text()'))) [$ T% A2 `/ d$ s5 }. g* `
            playinfo = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/span/text()')).split("万")
    4 Q. J! O; S5 A! \        play = playinfo[0] + "万"& Q# _. C7 N( \$ o* i
            comment = playinfo[1]. L( {" b: e# E! H) y  h
            if comment.isdigit() == False:
    ! E1 n& i+ Y" @( L3 q            comment += "万"
    & N: M8 g* K  a' }4 L        upname = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/span/text()'))" E8 }5 s6 D$ X; x" y& n4 G
            uplink = "http:" + "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/@href'))
    ( _! Y5 R" R; E6 c5 @        hot = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="pts"]/div/text()'))
    9 [* L3 O% ]& B+ n7 J- ?" r4 u        video_list.append({
    7 |/ a. a: n$ ]$ S4 ^: L- ~            'rank': rank,2 v  ?6 T; r  |9 ~# Y; K2 m
                'videolink': videolink,
    , e' n6 k4 b, H" E7 l' W            'title': title,
    ! _3 @3 r! n9 T6 N+ B( {            'play': play,
    5 n  L7 m- V) I) o  E4 E/ W2 J            'comment': comment,
    ( |. z/ C+ i7 }            'upname': upname,
    1 g; \6 ]- i  u! k9 H            'uplink': uplink,' K( F1 c7 a9 S- d
                 'hot': hot- a' I# Y. p: U* E
            })
    3 V# f9 c# F0 W    return video_list# G( h9 z$ t) e  S9 L

    & `9 i2 G) V# O5 ]( i# 将爬取到的数据写入Excel表格4 f! B* e& d& ]* I* D; w* x
    def write_Excel(video_list):8 r3 ^1 @" H) x6 A1 v) y
        print("将b站热门视频信息导入到Excel表格:")
    2 d/ z" R& N0 Y+ |    workbook = xlwt.Workbook()  # 定义workbook  A4 Y( B* I7 ^8 B+ J
        sheet = workbook.add_sheet('b站热门视频')  # 添加sheet' K+ V/ U3 O# `! f$ D! s
        xstyle = xlwt.XFStyle()  # 实例化表格样式对象
    , X! g$ T' ~. m1 |  c    xstyle.alignment.horz = 0x02  # 字体居中
    % ^5 `4 j; n- L5 ]    xstyle.alignment.vert = 0x01  # 字体居中
    ) v3 L) H5 O7 c0 u8 H2 s+ _* f$ }    head = ['视频名', 'up主','排名', '热度','播放量','评论数']  # 表头
    1 Y( p: r5 x3 J- n; W$ b    for h in range(len(head)):" _4 f7 n& a; U+ e# A. I
            sheet.write(0, h, head[h],xstyle)  # 把表头写到Excel里面去
    2 N- |: m' ^2 r9 E' F% t% R/ r- g' K- U8 w    i = 19 Q: d' l" s8 ^
        for item in video_list:
    7 P) g* q3 L& H        # 向单元格(视频名)添加(该视频的)超链接: _! e9 X7 C' M" R% z; \4 {
            title_data = 'HYPERLINK("'+item["videolink"]+'";"'+item["title"]+'")'  # 设置超链接
    $ W% y" ^* A# C$ V; V2 o        sheet.col(0).width = int(256 * len(title_data) * 3/5)   # 设置列宽
    2 z9 ?& \$ c7 ]* t1 U* R        sheet.write(i, 0, xlwt.Formula(title_data), xstyle)
    - u& r! O$ T5 Z; p" l        name_data = 'HYPERLINK("' + item["uplink"] + '";"' + item["upname"] + '")'  # 设置超链接4 ^( K* S( o/ m& m1 [  M
            sheet.col(1).width = int(256 * len(title_data) * 3 / 10)
    # H& |; A' i* x" ^7 @, t, u        sheet.write(i, 1, xlwt.Formula(name_data), xstyle)
    4 j" ?$ l* c2 D. E+ }: \        sheet.write(i, 2, item['rank'], xstyle)0 m9 \* |4 t8 r; w0 {
            sheet.write(i, 3, item['hot'], xstyle)
    ! p) e' l3 \& R! X7 y, u        sheet.write(i, 4, item['play'], xstyle)' A" u3 I" M8 B, f' l& ~
            sheet.write(i, 5, item['comment'], xstyle)
    ' |0 Y" `( Y6 I3 j% ]        i += 17 S4 ]; [1 }& v7 Z; I; Z
        # 如果文件存在,则将其删除
    / k0 n" s# B" d7 L- c9 z7 q  K    if os.path.exists('D:/Test/b站热门视频信息.xls'):
    7 l2 A6 n/ L& q' S        os.remove('D:/Test/b站热门视频信息.xls')' O& d2 D  V$ ]1 Z3 q+ Z, s
        workbook.save('D:/Test/b站热门视频信息.xls')3 Y& n5 s5 U$ [2 T6 |, y
        print('写入excel成功')
    " H$ d: z* u6 S) H    print("文件位置:D:/Test/b站热门视频信息.xls")
    + L) h" ]4 a% l/ ^! |1 i+ \2 ?% L' @
    if __name__ == '__main__':+ e* Q8 m' L6 d' _+ w' B% P6 H
        video_list = []! J& r$ ~) a- f
        write_Excel(spider(video_list)); ]) K, j/ {5 u: u3 i
    8 @( R7 @& L$ g

    ) q0 @' w; ]3 K% J* E/ v) }% q% }( w

    3 R) C$ d- f1 L( k/ q7 s4 S: f8 q. N  k; P  p1 B
    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-21 06:12 , Processed in 0.366081 second(s), 54 queries .

    回顶部