QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 4431|回复: 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表格3 k& j2 ~1 H2 h' R; I! \1 V
    效果图:
    % p" q7 ?) u4 t7 y+ k0 g' C 1.png
    ; T/ [& i* B0 N9 O1 E' {1.工先利其事必先利器,首先我们得下载相应的库:% r5 Q  N7 Y, a- G+ h+ {
    pip install requests" ~& Z2 X/ p& K
    pip install lxml
    , Z, Z; M7 h; M- ]3 `9 apip install xlwt+ J6 Y3 V0 `. R1 s" k6 g3 D% }

    4 b) o( k, ?" N7 C+ ?$ E3 V  o
    & n; Z% F5 @) Q2 O6 i. K7 R( orequests 向网页发送请求
    , O: Y* T4 g4 H3 A* m! L8 q+ Clxml 处理xml文件(xpath)) `9 ?9 k/ B0 }3 W! D% y
    xlwt 对Excel做写入操作
    ) a3 Z7 k5 l" ]. c* ?2.爬取b站热门视频的信息:7 g$ p7 T7 N' P! G7 L
      打开b站热门视频页面:
    0 d) F2 ?% k0 M. T. } 2.png
    . D$ _3 j) P3 W  按f12进入开发者选项,然后点击选中你要获取的页面信息,即可找到该信息在该HTML文件中的什么位置(这对我们用xpath获取元素属性和元素值很重要),例如:
    & N5 K: M' g0 F8 n" D# j 3.png 2 Q3 I+ v, b5 @( D" c
    代码如下:% ^* _2 B( \6 u
    # 爬取b站热门视频信息
    ( R. s2 J2 d; V; D5 m2 J$ l6 Idef spider(video_list):6 e: J  K! v; ^8 M! N' b9 A
        url = 'https://www.bilibili.com/ranking?spm_id_from=333.851.b_7072696d61727950616765546162.3'7 C( n7 O. H) |- y8 F  Z' m
        html_data = requests.get(url).text
    5 c. D( h* @$ d. a- J    selector = html.fromstring(html_data)
    6 Z  g. q: H0 S1 x: [# o2 n" O    infolist = selector.xpath('//li[@class="rank-item"]')' n3 U# }* A  a
        for item in infolist:% Y9 Z& F6 C" U" m8 G5 I0 I* m$ p
            rank = "".join(item.xpath('./div[@class="num"]/text()')), f. X2 @3 N( w% Y* a$ G0 C
            videolink = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/@href'))
    ! P" w) d) v* W, {; p: R3 c        title = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/text()'))
    2 F3 J" L0 z: \6 Y: E" F        playinfo = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/span/text()')).split("万")
    1 R0 M! E# a' ^2 ^0 I        play = playinfo[0] + "万"
    ! H) ]( S1 h, \4 j0 D6 F        comment = playinfo[1]* K1 ?1 D! Y' m1 _% H5 \1 [' D
            if comment.isdigit() == False:' d* j( J5 j( L# u* R: u
                comment += "万") f% \! \8 T1 u9 Y& v( p# y6 d
            upname = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/span/text()'))
    0 {! _& u+ k5 a2 F% b        uplink = "http:" + "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/@href'))
    6 ?/ L8 w9 Y2 z: D        hot = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="pts"]/div/text()'))! T2 I& |- X6 b
            video_list.append({; n+ ^2 r! H1 u  G. A
                'rank': rank,
    8 G2 {- U/ k$ d            'videolink': videolink,# ?1 V) J+ A1 p! w: h8 m# F. L
                'title': title,
    1 e; C6 n% c3 J1 M- q( I$ g/ i            'play': play,; u# |1 P/ l5 |; J
                'comment': comment,' G% v& ?7 w" e9 X# k: D
                'upname': upname,
    ; V; F" |2 P2 L$ t: `2 A* v6 K; U1 T) [            'uplink': uplink,
    2 H) S/ \- |* [8 F8 E             'hot': hot4 B& T+ G7 T3 t" k2 }
            })9 P) t1 d( L3 f+ }0 Q& w
        return video_list( D8 e4 a. D: C7 B5 M  `

    0 D4 T  c$ ^# R

    # J" Z; n) e6 \& P' A3.将我们拿到的信息集合(video_list)写入到Excel表格中:
    $ t. }  o+ v. r. Q0 m  xlwt的基本使用方法:% z& @, O0 K& T5 R. }. Z
    import xlwt
    " c$ d+ L$ H7 F2 ^1 G0 ]/ r' f. i# 创建一个workbook (并设置编码)
    ' [* z: n8 R+ v& Y5 e* Z8 Tworkbook = xlwt.Workbook(encoding = 'utf-8')
    ) ^. b9 x& y, T" x  u4 h. v# 创建一个worksheet
    * M' y& Y/ z" p$ i( i. Xworksheet = workbook.add_sheet('My Worksheet')
    ' |/ |& |& @  I" K3 E
    7 ]1 i. L& o- `& t* K: Y# 写入excel! u8 h$ y+ k  ^, f, w, d& ^
    # 参数对应 行, 列, 值,(格式)/ K$ K, S1 \  m/ p
    worksheet.write(1,0, label = 'this is test')
    5 B& ^9 D3 ^7 l3 `0 R5 K# 保存0 L- H$ \/ |) V$ F5 Y& {
    #参数为你保存该Excel文件的路径
    " h( C! z2 b8 a# S+ v4 jworkbook.save('Excel_test.xls')
    ( h' i/ x6 H8 s5 z
    - j; _& ]% E' G+ o8 b  V; G. h8 @' R
      如果我们想要点击视频名或者up的名字可以跳转,那么我们就要使用Excel表格的HYPERLINK方法:) L2 p  D- l, [  O# ?& ~
    HYPERLINK(“http://www.baidu.com” ; “百度”)
    1 ^* y7 A9 A6 Q百度为显示在单元格的信息,而前面的链接为跳转链接。7 K7 {# I2 o& f8 `5 ~3 g
    xlwt.Formula()方法需要传入一个字符串s,s=‘HYPERLINK(“http://www.baidu.com” ; “百度”)’。
    0 ^/ x4 {& E8 n$ h2 T代码如下:) r6 |9 p4 `  C
    # 将爬取到的数据写入Excel表格: W- [+ U/ K0 v3 n5 T# \( R* ^
    def write_Excel(video_list):  b  ]4 U/ r: e& Z
        print("将b站热门视频信息导入到Excel表格:")2 c  w4 Q+ O% h* v* R  |% ?+ m
        workbook = xlwt.Workbook()  # 定义workbook
    % N' t* Y1 T. H    sheet = workbook.add_sheet('b站热门视频')  # 添加sheet
    & ^8 y9 A$ J6 e$ G  m% z    xstyle = xlwt.XFStyle()  # 实例化表格样式对象2 d/ j1 r( \$ O5 ^/ R
        xstyle.alignment.horz = 0x02  # 字体居中' f! E/ b1 K4 Q( ]8 n2 M
        xstyle.alignment.vert = 0x01  # 字体居中) Y1 C4 }" @0 `' m, |& G/ J% f$ W
        head = ['视频名', 'up主','排名', '热度','播放量','评论数']  # 表头# M( `* |+ r4 c  E: H7 }# X7 }
        for h in range(len(head)):/ @! o( [8 i' W3 p  Q2 Z
            sheet.write(0, h, head[h],xstyle)  # 把表头写到Excel里面去  H8 ^2 T+ ]/ ]; x
        i = 1$ ^8 y! E; Q% B0 {$ M; o
        for item in video_list:, x6 n! I5 I* z6 U; K8 ^
            # 向单元格(视频名)添加(该视频的)超链接4 |  ]$ e# N) H! e- @* }0 h5 Y
            title_data = 'HYPERLINK("'+item["videolink"]+'";"'+item["title"]+'")'  # 设置超链接. N$ o$ w( Q+ t$ D
            sheet.col(0).width = int(256 * len(title_data) * 3/5)   # 设置列宽$ |" ?, q8 q9 y$ |- T+ X/ Z
            sheet.write(i, 0, xlwt.Formula(title_data), xstyle)
    9 ?. Q& i- S- A# @        name_data = 'HYPERLINK("' + item["uplink"] + '";"' + item["upname"] + '")'  # 设置超链接
    % Y% X4 B$ h8 x( ]3 {        sheet.col(1).width = int(256 * len(title_data) * 3 / 10)
      a/ @8 o; s7 T$ f8 W# m        sheet.write(i, 1, xlwt.Formula(name_data), xstyle)
    $ l  Z3 F, k+ U        sheet.write(i, 2, item['rank'], xstyle)) @$ [1 u# k8 c2 U# s
            sheet.write(i, 3, item['hot'], xstyle)
    - f7 U2 r5 Z/ @; _# n        sheet.write(i, 4, item['play'], xstyle): |! O( ?- O+ B
            sheet.write(i, 5, item['comment'], xstyle)8 i: x" O. }& }
            i += 1& ^, S; D, F; E$ I) x
        # 如果文件存在,则将其删除
    . q, Z0 c+ [' ]# B    if os.path.exists('D:/Test/b站热门视频信息.xls'):
    * [4 L# Q. G& U' J# ]! w        os.remove('D:/Test/b站热门视频信息.xls')4 |0 M- D  a# ^* r+ C  K
        workbook.save('D:/Test/b站热门视频信息.xls')& _# l+ d- O0 h/ Z+ f8 ?
        print('写入excel成功'), H0 o8 F5 ]! r  m6 ]/ f" ~# k
        print("文件位置:D:/Test/b站热门视频信息.xls")
    + u: r! M/ \" c
    / V( t( Y1 c/ ^9 Y0 V$ ]( G5 N
    - b3 G& o" C& X0 k4.在入口main中调用上面两个函数) m9 J. V- l; o) K9 v  x* A
    完整代码如下:
    5 W4 H) q( p5 f& Kimport requests; S4 P+ H% A4 b% g' `
    from lxml import html: n' B% O0 a2 }7 }- N
    import xlwt0 w! u, Y- d$ J- V8 |) M$ E
    import os$ o+ @( m; Z' R. E5 e

    % o' i) |1 ~8 H9 N6 I# 爬取b站热门视频信息( t  V7 a+ U# {
    def spider(video_list):
    ! J! {& a/ c8 N) \4 v    url = 'https://www.bilibili.com/ranking?spm_id_from=333.851.b_7072696d61727950616765546162.3'7 \% a6 h! y( X/ x1 {) |8 q/ q- O- g
        html_data = requests.get(url).text- C' j: T8 @; Q$ p$ ~
        selector = html.fromstring(html_data)6 B1 k  ^3 s& ^$ R% z' I9 W  G
        infolist = selector.xpath('//li[@class="rank-item"]')
      m) @+ g6 U& |) M1 q3 o" X    for item in infolist:4 o7 Q6 E5 o/ @9 {9 P
            rank = "".join(item.xpath('./div[@class="num"]/text()'))
    - Q; k2 ]7 H# S  `2 V/ C( P        videolink = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/@href'))
    , d( h) f) G% x3 Q1 ~( a7 d2 ^        title = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/text()'))
    1 |) Q' K/ U8 ]        playinfo = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/span/text()')).split("万")# X+ p7 g4 H3 t( X% f7 v
            play = playinfo[0] + "万"
    6 v! n6 ^$ q. x8 G  ^5 H        comment = playinfo[1]
    6 E8 p( w" r, P. h: l4 C        if comment.isdigit() == False:+ b8 Q! D5 t4 Y+ Q1 \
                comment += "万"5 E5 c; o1 r& G, J' p" P* J: M
            upname = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/span/text()'))) l# u# B( T# o3 V1 o- E
            uplink = "http:" + "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/@href'))$ Z+ \( v: r! A! y6 L
            hot = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="pts"]/div/text()'))1 p& I) T0 \# Q. K
            video_list.append({
    & J0 C7 a: X% P- M. |2 o            'rank': rank,6 C# C) d6 F+ @5 g: z
                'videolink': videolink,5 `  {8 l/ a6 l1 v: J
                'title': title,- N: I6 X% t5 S7 H. C3 W7 \
                'play': play,5 J( G. ]8 @, o9 y
                'comment': comment,/ b5 q) r* O! D0 W
                'upname': upname,
      j% s, k3 Q: }, n, g  [; e& ^            'uplink': uplink,
    # S1 J2 _. B. i) K7 l             'hot': hot
    ' r6 j7 `' w; W        })
    ! R' Y, x( K& L% c7 _/ c5 j9 S    return video_list+ G2 R1 R/ d3 L" R. e9 k
    6 q4 b% e. i' p7 L9 A% {: K
    # 将爬取到的数据写入Excel表格  `- _' z/ F0 W
    def write_Excel(video_list):
    ! Y  ~- X% x0 w' {! K7 G    print("将b站热门视频信息导入到Excel表格:"). v! l. y5 x4 h3 J
        workbook = xlwt.Workbook()  # 定义workbook
    $ I2 K# g2 L* P# G9 W: ]    sheet = workbook.add_sheet('b站热门视频')  # 添加sheet
    ! t5 R4 Q0 F9 m1 W! h1 N$ @0 P    xstyle = xlwt.XFStyle()  # 实例化表格样式对象
    6 Q1 ~8 i( g: O7 C3 }5 C    xstyle.alignment.horz = 0x02  # 字体居中" I( ?6 t$ j# s: j+ @
        xstyle.alignment.vert = 0x01  # 字体居中9 N- _  [/ A  J% Z2 v
        head = ['视频名', 'up主','排名', '热度','播放量','评论数']  # 表头
    7 ]+ p6 {6 H' j    for h in range(len(head)):, S* ~! X+ |0 G
            sheet.write(0, h, head[h],xstyle)  # 把表头写到Excel里面去' M! F" C* t8 Q7 `; e3 I
        i = 1
    1 e/ q$ }4 `7 o4 p6 u2 W$ u    for item in video_list:) Q; T& c/ b, W& }) a* @% g
            # 向单元格(视频名)添加(该视频的)超链接
    % |; D9 ?$ {  M5 K0 [! x        title_data = 'HYPERLINK("'+item["videolink"]+'";"'+item["title"]+'")'  # 设置超链接; z; ~8 D0 }4 D& q/ b& u- y6 r0 J% y
            sheet.col(0).width = int(256 * len(title_data) * 3/5)   # 设置列宽3 B0 m& a; s1 M: Y3 w
            sheet.write(i, 0, xlwt.Formula(title_data), xstyle): s  a3 d5 k5 |5 X; O  z, O
            name_data = 'HYPERLINK("' + item["uplink"] + '";"' + item["upname"] + '")'  # 设置超链接: A4 D% A* i5 D6 G$ r
            sheet.col(1).width = int(256 * len(title_data) * 3 / 10)
    " a) ]- }& m" |/ |! ~( d3 {        sheet.write(i, 1, xlwt.Formula(name_data), xstyle)
    . f( C) p8 |8 n- h0 m5 {5 g/ R        sheet.write(i, 2, item['rank'], xstyle)
    ; m( P( Q6 C$ `2 W$ i        sheet.write(i, 3, item['hot'], xstyle)
    # C/ f' o! G0 s' ]: X( _        sheet.write(i, 4, item['play'], xstyle)
    ' L' Z! ?+ i6 M- v        sheet.write(i, 5, item['comment'], xstyle)
    0 O4 T& L+ e/ Z* n5 L        i += 19 y* \) k. Q) S- M" H" O
        # 如果文件存在,则将其删除" n8 Y: c% D2 H  K3 v
        if os.path.exists('D:/Test/b站热门视频信息.xls'):
    . B# ^1 z( i# N) F$ t        os.remove('D:/Test/b站热门视频信息.xls'); X/ a# q* f* A& R  C
        workbook.save('D:/Test/b站热门视频信息.xls')+ J1 Q6 `8 A- W
        print('写入excel成功')
    , v7 d8 x4 \: ?; r    print("文件位置:D:/Test/b站热门视频信息.xls")6 `: J( o* h% N% J

    0 j3 ~0 D: c: N% {+ `( |' Oif __name__ == '__main__':7 O/ }$ R& a$ f& F
        video_list = []
    ! R9 v3 C. S+ ^( u& D    write_Excel(spider(video_list))
    ( S3 V/ Q# f: n) a( i. [* U+ c6 I  v

    + Y. S, J4 l6 _' C7 p
    * \) [/ _4 o% U0 E: @  D$ e' Z6 D9 r! m9 x

    4 D! F7 m; L  C9 T( 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 12:07 , Processed in 0.456907 second(s), 55 queries .

    回顶部