QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 4430|回复: 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表格; ~5 B: [; _% Y: y! C1 r
    效果图:
    & \; A5 y1 _, X6 y/ B9 C, G  ]( V 1.png
    ' d+ F- V! T' q& J" K% H8 S3 c1.工先利其事必先利器,首先我们得下载相应的库:# ~6 N( e& P. z: ~
    pip install requests8 ?9 M$ w' j* m% X  h
    pip install lxml
    2 p  W% E- O7 Epip install xlwt; m4 }) S; {+ _. m1 C
    3 X( x# @" H% a- W( }2 R+ A

    0 q  o6 Z7 e' f. n! S, U3 Grequests 向网页发送请求0 V6 X6 J, e- ?- c
    lxml 处理xml文件(xpath): [  g, Z$ U* W6 P
    xlwt 对Excel做写入操作
    ( h3 x5 r# _( V7 V9 H" J4 o2.爬取b站热门视频的信息:
    % m' ]% N) R2 o3 a0 F! @( ]  打开b站热门视频页面:6 a, u7 m2 o  |' V/ `
    2.png ' _+ u5 m9 J- G1 z8 Q
      按f12进入开发者选项,然后点击选中你要获取的页面信息,即可找到该信息在该HTML文件中的什么位置(这对我们用xpath获取元素属性和元素值很重要),例如:1 @! M# b) D- U0 U  V( s
    3.png 5 i: x. J: {0 r7 b' J  a4 T
    代码如下:' Y$ S2 `/ Q# W  Q! \
    # 爬取b站热门视频信息
    % R" G! i& c( s- }1 ddef spider(video_list):  ~2 h2 e2 x, A9 }1 W8 s: N
        url = 'https://www.bilibili.com/ranking?spm_id_from=333.851.b_7072696d61727950616765546162.3'
    7 K6 B  r# o  ~2 }5 g& D; r  {    html_data = requests.get(url).text
    ( T; M5 j$ {5 @# g/ M( y- v+ V    selector = html.fromstring(html_data)3 W+ a7 N6 r7 E- N, K7 e# U1 Z
        infolist = selector.xpath('//li[@class="rank-item"]')1 X; E7 f, P; u' \& x: E
        for item in infolist:
    - F7 c3 W1 |; ~0 W8 O9 h        rank = "".join(item.xpath('./div[@class="num"]/text()'))$ K5 Z/ d: Q& h* N2 b) l  ]
            videolink = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/@href'))
    # t! [1 O' x' s2 S3 L7 X+ W        title = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/text()'))- W- S, U. k4 P. V
            playinfo = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/span/text()')).split("万")7 h4 @; G  p# a9 x' D0 m
            play = playinfo[0] + "万"/ |4 j: t% G% ^' |
            comment = playinfo[1]
    ) b: x: v6 f& P        if comment.isdigit() == False:+ {* `  g7 a2 O8 ^0 G, L
                comment += "万"
    " N- {& S% J' ^" G0 \( s: k        upname = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/span/text()'))$ @- h( \, ^! X' J
            uplink = "http:" + "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/@href'))' u# Q5 b0 Z0 s& ]: m. M) r
            hot = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="pts"]/div/text()'))
    5 |: p: g3 W0 ^- ?0 B  O        video_list.append({
    + h# Z3 g9 P6 ]0 y- I% J            'rank': rank,& |* A2 z- F. V7 E' v  _
                'videolink': videolink,
    3 o( G3 I1 n+ ^/ E+ `            'title': title,$ ?9 W" s- @! ^- G8 {
                'play': play,3 A; G. _' L  P8 ?
                'comment': comment,
    : K! W+ f7 G: ?9 h  o* F, @& W& g            'upname': upname,  S$ s+ f8 M7 a5 w! e4 g' J5 e. s
                'uplink': uplink,8 ~1 p: W9 X, Y" h. I
                 'hot': hot
    ' n7 X8 F, [8 _. n        })# @- h' F4 ]5 B# a0 B
        return video_list
    + O2 `$ ]% L6 d. {
    % r9 }0 Y- I% K' U
    . `* E8 |3 h% T, q2 V$ K' I
    3.将我们拿到的信息集合(video_list)写入到Excel表格中:  B, h, i! T' J/ {' W, }: f* I3 [
      xlwt的基本使用方法:
    ) r' i8 C- F5 |* G# eimport xlwt
    5 R  t2 d+ m" X( ?# Y+ ]3 q8 g# 创建一个workbook (并设置编码)
    * H( D$ K$ x5 Y' ?- G4 B6 p5 _workbook = xlwt.Workbook(encoding = 'utf-8')9 O* N6 B6 q  E" T' p  j6 W
    # 创建一个worksheet
      Z4 d: a7 p, U8 ~worksheet = workbook.add_sheet('My Worksheet')
    ' b  r# L7 [6 u% e2 |4 H- t
    . `2 b" L6 j4 u) [, S# K& e. ]# 写入excel! N' m4 V& U) M7 H1 G# Z+ u
    # 参数对应 行, 列, 值,(格式)
    ) ?. j9 x" h- z' j' R6 iworksheet.write(1,0, label = 'this is test')
    - O/ Z* \3 W% p2 U1 k. |5 r; X# 保存) D6 G9 v, @' d( n: a
    #参数为你保存该Excel文件的路径- [2 N7 t% E. y  i4 w0 t  ?2 n) A2 T
    workbook.save('Excel_test.xls')1 P8 X  m9 B# y
    7 K* X4 K& z% h: T6 x% ]
    3 z7 @; e! L; B
      如果我们想要点击视频名或者up的名字可以跳转,那么我们就要使用Excel表格的HYPERLINK方法:
    # u; x" ~5 P2 ~- j+ V/ cHYPERLINK(“http://www.baidu.com” ; “百度”)- F& Q# S& L) ~1 m) E, l
    百度为显示在单元格的信息,而前面的链接为跳转链接。
    - s4 h) A2 B7 e% C1 Y' W9 C4 U4 D) [xlwt.Formula()方法需要传入一个字符串s,s=‘HYPERLINK(“http://www.baidu.com” ; “百度”)’。
    * ?4 E' S" b" s+ ^代码如下:' y* h+ g" `8 `; b& d. d
    # 将爬取到的数据写入Excel表格$ p! _6 y6 t6 s; V  t& K  H, \
    def write_Excel(video_list):
    . n# }& p4 |; k+ u$ M' M    print("将b站热门视频信息导入到Excel表格:")0 r+ K6 e2 ]4 _4 m
        workbook = xlwt.Workbook()  # 定义workbook( s" w2 l# U2 B$ [! u
        sheet = workbook.add_sheet('b站热门视频')  # 添加sheet
    ; r+ p8 E& r. b* S5 j" B& U    xstyle = xlwt.XFStyle()  # 实例化表格样式对象
    1 ]) l! Q  }8 ^% u2 x3 O    xstyle.alignment.horz = 0x02  # 字体居中& e" m- _! b7 d9 x
        xstyle.alignment.vert = 0x01  # 字体居中
    ! d$ J8 n9 G# R, Y; Y% q    head = ['视频名', 'up主','排名', '热度','播放量','评论数']  # 表头; D* c( _$ F& V9 O$ v% y' h
        for h in range(len(head)):. ~+ }7 c( F2 x; i! Y
            sheet.write(0, h, head[h],xstyle)  # 把表头写到Excel里面去
    # v  e' e9 F* L7 _    i = 1# j! H. f8 k/ ]1 y0 V
        for item in video_list:# p# R6 u- [7 c, g/ g* t. j
            # 向单元格(视频名)添加(该视频的)超链接$ e0 I" K8 y/ r! n+ s! ]
            title_data = 'HYPERLINK("'+item["videolink"]+'";"'+item["title"]+'")'  # 设置超链接( i) N0 |7 [  R
            sheet.col(0).width = int(256 * len(title_data) * 3/5)   # 设置列宽
    ; K6 W* n' l8 l$ T( K        sheet.write(i, 0, xlwt.Formula(title_data), xstyle)! L% A7 b- p3 X- N% [; ^
            name_data = 'HYPERLINK("' + item["uplink"] + '";"' + item["upname"] + '")'  # 设置超链接
    6 V) P: S; o2 H3 X0 c        sheet.col(1).width = int(256 * len(title_data) * 3 / 10)! ^/ m% ?( {9 w: I
            sheet.write(i, 1, xlwt.Formula(name_data), xstyle)
    ; G8 ?# N* q$ y& H  t4 y0 ?. u( q  m        sheet.write(i, 2, item['rank'], xstyle)
      O3 C- U: @2 n# \        sheet.write(i, 3, item['hot'], xstyle)
    1 N/ H' o+ T  F! C- \7 R3 g' w: m+ `        sheet.write(i, 4, item['play'], xstyle)
    ( Y6 ?, p8 o6 ^3 D3 s" V9 J3 q        sheet.write(i, 5, item['comment'], xstyle)
    % [# ]) p' s5 h$ g% m3 h        i += 1
    - A. c8 l5 G$ o5 u3 `, ~- k8 a% ~1 d    # 如果文件存在,则将其删除- Y7 }" x0 }6 u+ D
        if os.path.exists('D:/Test/b站热门视频信息.xls'):
    6 T( }8 I2 L# I7 f        os.remove('D:/Test/b站热门视频信息.xls')2 _& d2 w, J1 i: ^4 k
        workbook.save('D:/Test/b站热门视频信息.xls')
    6 w( _5 V  e& j* G+ U% n$ u0 z    print('写入excel成功')
    7 I$ q/ `( Z! d4 F- g    print("文件位置:D:/Test/b站热门视频信息.xls")
    ) Z6 E+ |9 H( o' o
    / `2 f  m" a) e; u
    8 {0 C' Z; N* U3 G4.在入口main中调用上面两个函数
    " p) {1 q) c5 t! Y- d3 O5 u完整代码如下:3 |* u4 `! _) W" @! [
    import requests, K: g! f( e1 b
    from lxml import html- I: \8 l& z( n& b
    import xlwt
    ' F( E* }. v) u9 n+ ~2 N' wimport os, H' s7 G' a. Z
    * ^& n0 }5 a+ i5 B& Z
    # 爬取b站热门视频信息
    9 j6 n* A" {3 A9 X: I8 l! Xdef spider(video_list):( U! k! r: y2 e" X
        url = 'https://www.bilibili.com/ranking?spm_id_from=333.851.b_7072696d61727950616765546162.3'
    5 b) d0 e! S2 v    html_data = requests.get(url).text% @# O" l4 U2 R+ v
        selector = html.fromstring(html_data)9 R6 I5 C9 j+ V# [* B  `
        infolist = selector.xpath('//li[@class="rank-item"]')
    ( s" l4 y+ T2 Z( {5 m, _    for item in infolist:
    ( {. h' m; Q# J8 c        rank = "".join(item.xpath('./div[@class="num"]/text()'))4 F5 z4 y) L1 @4 F# C
            videolink = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/@href'))9 Q  i. ?: j1 v- t
            title = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/text()'))
    % e* |( \1 v6 x! T5 w) i! U        playinfo = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/span/text()')).split("万")1 t& X- j5 [/ D) e% V0 Y
            play = playinfo[0] + "万"
    / n6 {+ U+ h! Q" m- M# D- P        comment = playinfo[1]
    5 `/ ?' R9 z7 W/ c; {6 ~/ j        if comment.isdigit() == False:
    9 r: W8 q0 J4 m! C/ N1 e            comment += "万"  S: }. T2 U! M  I0 V4 x
            upname = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/span/text()'))
    ( q& Z3 C5 ]9 H0 k7 |        uplink = "http:" + "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/@href'))
    1 _) M; ^: y& d% f        hot = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="pts"]/div/text()'))4 D- N! j! H) `9 G* o% B
            video_list.append({$ y& z) D4 u2 z, t1 _$ y
                'rank': rank,
    7 l9 F: k2 R) z+ S4 k; |            'videolink': videolink,- z7 R4 f/ s9 V( F
                'title': title,
    - X( o  B! K) `9 A! A2 H            'play': play,
    7 P  h2 t: y1 H$ ]8 u            'comment': comment,
    # ~  v. _5 V' H1 {* p            'upname': upname,/ q$ ^/ L# m  R
                'uplink': uplink,
    6 o- ^- D1 Q! g. z             'hot': hot) x% k+ }/ {3 k4 h, n
            })$ o3 C3 C. ^6 Z9 G( D3 h2 W
        return video_list' p5 a/ |" {- a2 v7 l) M* i
      `  I8 G' `4 J
    # 将爬取到的数据写入Excel表格
    % ^/ i! ^( s- C; b7 R, ]: @9 @5 ~def write_Excel(video_list):
    ) H7 G1 f1 _. @/ V5 {    print("将b站热门视频信息导入到Excel表格:")  v4 U! T5 E# P' ?8 |9 X
        workbook = xlwt.Workbook()  # 定义workbook% D! M% B3 U- j1 h- D6 ~
        sheet = workbook.add_sheet('b站热门视频')  # 添加sheet
    " X: I" F: e6 J- k. D2 S    xstyle = xlwt.XFStyle()  # 实例化表格样式对象* g. q) N# Y- _: m; m( Y- J4 \
        xstyle.alignment.horz = 0x02  # 字体居中8 j% a) A2 C+ @, W+ b+ m
        xstyle.alignment.vert = 0x01  # 字体居中, J) g0 |4 Y, B# M! }  ~
        head = ['视频名', 'up主','排名', '热度','播放量','评论数']  # 表头* @! x: b1 e  w
        for h in range(len(head)):
    7 a/ k/ J/ W1 M8 g        sheet.write(0, h, head[h],xstyle)  # 把表头写到Excel里面去( l+ T3 Y5 k/ h# r+ ^, q
        i = 1
    ' f& t& ]( n  y/ t8 U9 y/ `    for item in video_list:
    . [* ^% x' _+ x        # 向单元格(视频名)添加(该视频的)超链接
    ( @  g. m9 n9 i$ L6 f% f- ]- h9 |        title_data = 'HYPERLINK("'+item["videolink"]+'";"'+item["title"]+'")'  # 设置超链接5 d% B: C/ W2 A, w# ~7 d
            sheet.col(0).width = int(256 * len(title_data) * 3/5)   # 设置列宽
    , V5 o0 z2 G$ c/ `        sheet.write(i, 0, xlwt.Formula(title_data), xstyle)
    . n1 [) B" G" V6 G& X0 V; j. t0 Y. j        name_data = 'HYPERLINK("' + item["uplink"] + '";"' + item["upname"] + '")'  # 设置超链接+ o$ Z/ \9 r. }
            sheet.col(1).width = int(256 * len(title_data) * 3 / 10)1 \( {8 k' w& d. ^/ K
            sheet.write(i, 1, xlwt.Formula(name_data), xstyle)+ s1 X& P9 _# V7 h3 _7 b' E* h
            sheet.write(i, 2, item['rank'], xstyle). q$ g7 a/ h5 z
            sheet.write(i, 3, item['hot'], xstyle)
    9 `" J4 L' l! d        sheet.write(i, 4, item['play'], xstyle); r. \" V9 E( O, {8 b8 r6 Y7 ^- a
            sheet.write(i, 5, item['comment'], xstyle)! ^) Y1 G/ N0 B. x3 _
            i += 1
    6 T' v, A/ W! q( P& W    # 如果文件存在,则将其删除
    ( Q  z$ o: w5 M7 k: m- c9 `" o# Q    if os.path.exists('D:/Test/b站热门视频信息.xls'):3 g/ n+ K2 u, j
            os.remove('D:/Test/b站热门视频信息.xls')
    ; c) x% g$ ?0 e) G9 M    workbook.save('D:/Test/b站热门视频信息.xls')  o9 P! D* C6 ~. K3 D9 ^$ H' C' o
        print('写入excel成功')9 @- p- e$ x5 U+ t3 g
        print("文件位置:D:/Test/b站热门视频信息.xls")2 q, ?/ X' k: E% `4 i* l% g+ M
    % Y# D6 h. p; m# n) X6 f& m
    if __name__ == '__main__':3 d; z+ X) ^7 \9 U4 L
        video_list = []
    1 I9 b0 O& ]! W$ ^( @$ C- \    write_Excel(spider(video_list))
    , W" F; W5 L! F" t% |* F/ N8 k9 R+ {9 h  S" Y4 T" t

    + D# \, _" ]  W8 I4 A4 Y: h/ ^# l
    ' ?4 F) @- T- Y8 w( k$ Q" a0 o! H
    % v1 A) Q/ `$ j. `- ]! o
    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 07:59 , Processed in 0.436601 second(s), 53 queries .

    回顶部