QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 4469|回复: 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表格/ m8 \- E" b% u5 u" D
    效果图:/ T: p5 i4 \! @' e& k3 `- Y
    1.png
    ! ^5 t, O, W+ O0 T- @; j" R1.工先利其事必先利器,首先我们得下载相应的库:0 A" c0 E" h2 x" H& j  B2 ?
    pip install requests
    7 |  [9 M+ \7 Z: G# J' B' gpip install lxml
    # }/ b% u! K4 g* N% p7 D1 npip install xlwt8 N4 g2 n1 o$ R

    ( W1 y% g, A1 o2 |! c! q% W% w6 P
    requests 向网页发送请求
    : M" b1 G' Z0 T+ V. Hlxml 处理xml文件(xpath)
    % h; V1 e3 @& u2 u- Q4 Hxlwt 对Excel做写入操作  {9 a9 w2 Y( S6 \- D% o% Z
    2.爬取b站热门视频的信息:1 y8 N3 l& f8 U' {
      打开b站热门视频页面:
    9 |. ]) a! y. ?- b$ e% R 2.png : s4 C, {: v! S+ K$ P
      按f12进入开发者选项,然后点击选中你要获取的页面信息,即可找到该信息在该HTML文件中的什么位置(这对我们用xpath获取元素属性和元素值很重要),例如:. M5 B/ R" H) }' r" D- s
    3.png
    ! y9 f  j% x& k代码如下:1 Z; {( N8 z1 E- T" `; `; G
    # 爬取b站热门视频信息
    + ?0 T" {1 I5 I2 M6 }  S4 U' Zdef spider(video_list):
    1 j$ V4 I. H2 q! i+ m    url = 'https://www.bilibili.com/ranking?spm_id_from=333.851.b_7072696d61727950616765546162.3'' n8 }; e- _8 G; l8 }1 r& D
        html_data = requests.get(url).text
    0 }: n" E% }1 B) z" h% s    selector = html.fromstring(html_data), `* _! W; o) k/ O, b2 D$ A3 |( P
        infolist = selector.xpath('//li[@class="rank-item"]')
    2 ?8 z) s; a9 o: N$ Y# c( R    for item in infolist:
    * K. H6 }* I  U        rank = "".join(item.xpath('./div[@class="num"]/text()'))" @7 \, L- A2 Z- k6 J# n6 K
            videolink = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/@href'))
    / Y: g1 T  A2 `8 }* u# q- |        title = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/text()'))
    $ W, ~8 E9 k; x5 v        playinfo = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/span/text()')).split("万")
    ! ~0 ^: P3 `9 b6 l/ ~9 t8 Z: O        play = playinfo[0] + "万"
    * p- r5 N8 ]2 J; R. L6 y$ _( Y        comment = playinfo[1]$ r: ~. J3 z+ y5 g
            if comment.isdigit() == False:
    & C, E+ f4 Y! `$ E% _            comment += "万"
    ' V, Z- L# K# r        upname = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/span/text()'))
    9 j' R2 E7 d- K* K8 ^        uplink = "http:" + "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/@href'))5 z5 I9 N+ P  Q* g# e9 f
            hot = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="pts"]/div/text()'))
    6 h& B- c3 n5 s! F7 v        video_list.append({6 V. h1 A9 h; x
                'rank': rank,
    0 M8 k/ u, R$ K- M# b; X            'videolink': videolink,  e; b" J2 l9 x4 S
                'title': title,% A" Y6 o2 M4 N' W4 f2 ?3 x9 q
                'play': play,
    ; w: q) S( p1 @& [1 [            'comment': comment,
    + d! ]' \  l% i8 G/ C7 n            'upname': upname,& Y1 x/ A2 J5 K6 y. g5 K9 |2 P, s
                'uplink': uplink,
    ' ^- z  y/ B% t1 V: W! n             'hot': hot
    # J; q6 r+ Q# J% l& t        })
    1 Y& j+ N/ n* Q1 H- Y9 e    return video_list
    ! j1 o: J0 H6 H9 b: w- t
    1 m  _0 Z% h! E; {2 G4 G' r

    5 p5 N6 `  z) N* M2 n0 [2 d3.将我们拿到的信息集合(video_list)写入到Excel表格中:
    $ Z' v3 e% U3 W  xlwt的基本使用方法:
    6 m$ h3 B9 [  N: M4 A1 I' ]2 vimport xlwt3 m3 }& [  K' k
    # 创建一个workbook (并设置编码)- P3 a& J8 n7 k- y* k. V6 W
    workbook = xlwt.Workbook(encoding = 'utf-8')( w1 y& Q7 N5 P9 s* G/ C
    # 创建一个worksheet) G( c# G4 {' }) q  W5 H+ a( U0 k
    worksheet = workbook.add_sheet('My Worksheet')
    % m6 n9 C( ]1 e! ^8 e2 M, a, ]
    % a( n0 s' f" f6 a5 }8 n# P# 写入excel
    - D: _* T- I% T( }7 {# 参数对应 行, 列, 值,(格式)* p  G2 Z3 u$ Y3 H. E! W
    worksheet.write(1,0, label = 'this is test')( U4 f, a+ X" S2 m
    # 保存
    ; t2 ~$ ^1 _+ G. w$ X) c% l+ d4 b#参数为你保存该Excel文件的路径
    7 q$ W6 ?6 _# O$ O9 P: E$ E, p$ \workbook.save('Excel_test.xls')  Z# ?+ \) [5 E+ s
    0 d- D- P  q% b+ z

    6 F% d  q& m$ @" ?% K1 r' |  如果我们想要点击视频名或者up的名字可以跳转,那么我们就要使用Excel表格的HYPERLINK方法:
    5 p. h, k/ h1 V' y! cHYPERLINK(“http://www.baidu.com” ; “百度”)
    " T- h# Y* b. [百度为显示在单元格的信息,而前面的链接为跳转链接。/ M# Q* Y) P; B; Q! \
    xlwt.Formula()方法需要传入一个字符串s,s=‘HYPERLINK(“http://www.baidu.com” ; “百度”)’。
    * D1 f4 {6 r/ B# _5 P代码如下:$ }! f2 |2 k- S
    # 将爬取到的数据写入Excel表格. a3 Y% [. a1 W: n1 b
    def write_Excel(video_list):
    ) C- P& m6 L9 b( Z  x6 s0 T    print("将b站热门视频信息导入到Excel表格:"). ~) Y0 p# o" B& c7 E% }( |: Y
        workbook = xlwt.Workbook()  # 定义workbook
      J$ T2 j2 E% k! e$ ?6 u) U% `    sheet = workbook.add_sheet('b站热门视频')  # 添加sheet+ D# ~1 n; i! O
        xstyle = xlwt.XFStyle()  # 实例化表格样式对象: V2 s2 q# |0 D0 I- b
        xstyle.alignment.horz = 0x02  # 字体居中: o# `& H9 y$ W! Y% @( F+ p. `
        xstyle.alignment.vert = 0x01  # 字体居中7 T) U" a3 I; C* z0 m7 j9 {( ]
        head = ['视频名', 'up主','排名', '热度','播放量','评论数']  # 表头
    : B2 k) ~0 e$ X8 M% p5 b( f    for h in range(len(head)):
    ( R" a9 j- V2 w' M4 d; J; C$ g        sheet.write(0, h, head[h],xstyle)  # 把表头写到Excel里面去% l4 [% o& ?( s$ o8 w5 y
        i = 1& [1 m  u1 d/ k/ ]
        for item in video_list:$ l2 P* S. a4 q. }" G/ |& R
            # 向单元格(视频名)添加(该视频的)超链接; [. i- }+ Z1 ^" E8 _5 h
            title_data = 'HYPERLINK("'+item["videolink"]+'";"'+item["title"]+'")'  # 设置超链接
    & H: X, S& R. X        sheet.col(0).width = int(256 * len(title_data) * 3/5)   # 设置列宽
    9 g8 c3 e+ K' Z  V9 z) N1 ?        sheet.write(i, 0, xlwt.Formula(title_data), xstyle)
    + U* i* U9 w) z1 J- G0 v        name_data = 'HYPERLINK("' + item["uplink"] + '";"' + item["upname"] + '")'  # 设置超链接
    $ p- J  c" N' [2 D$ O* H        sheet.col(1).width = int(256 * len(title_data) * 3 / 10)6 t; ]& O/ y6 Z0 r% c
            sheet.write(i, 1, xlwt.Formula(name_data), xstyle)" b5 q$ ]' S7 M6 T# U
            sheet.write(i, 2, item['rank'], xstyle)4 H/ a4 z: o+ D4 G$ ]
            sheet.write(i, 3, item['hot'], xstyle)
    % B% n7 m3 K' x  x4 H        sheet.write(i, 4, item['play'], xstyle)7 c* \; ]3 w+ U4 `( M3 ?0 A
            sheet.write(i, 5, item['comment'], xstyle)
    0 g+ ]1 r' l) J* S7 X        i += 15 Q! L3 p6 [  Z. P( Z6 e
        # 如果文件存在,则将其删除
    7 d# Z7 F2 L! H3 ~  T    if os.path.exists('D:/Test/b站热门视频信息.xls'):7 B9 ~6 @/ U8 I; K
            os.remove('D:/Test/b站热门视频信息.xls')4 g  R' Z, a& _- I+ k0 j
        workbook.save('D:/Test/b站热门视频信息.xls')
    $ m4 h' c/ b7 L# l    print('写入excel成功')0 c  R# d; g2 B& A
        print("文件位置:D:/Test/b站热门视频信息.xls")
    + X' u& O9 i2 Q4 v; r5 u: g  O( u, F% S, k+ N9 Y) q' c% O) x
    8 g1 h" G/ W. l
    4.在入口main中调用上面两个函数
    8 p5 g1 I7 k! p) A+ [/ l: I完整代码如下:
    , l$ R6 q, }4 n+ a4 o9 ~import requests
    / ]8 U3 r( p, _  F7 B. {& s  G( bfrom lxml import html
    8 ?9 N) u& T$ D1 L* {( g% I& A$ ^import xlwt
    ; X6 R: D( \9 B$ s( Timport os3 _9 ^* y9 W8 A& r. Y; J& p. W
    / @& ?: Q: ]3 K- e* t1 E
    # 爬取b站热门视频信息" v* B9 g) z6 b0 A7 f5 r$ f
    def spider(video_list):0 e' ]7 c- Q# o3 x
        url = 'https://www.bilibili.com/ranking?spm_id_from=333.851.b_7072696d61727950616765546162.3'
    ; h8 _, a4 i3 M& n# P    html_data = requests.get(url).text
    ) H; `2 @. v+ e8 }3 {( U    selector = html.fromstring(html_data)
    3 g& y, w. ~7 O7 G/ U8 `" {/ w    infolist = selector.xpath('//li[@class="rank-item"]')/ Y/ x# L" v) M0 P: ~; [7 A
        for item in infolist:
    " Z) [# ^# p! A8 H        rank = "".join(item.xpath('./div[@class="num"]/text()'))
    % }5 ^/ b8 N! X        videolink = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/@href'))
    9 H9 A6 m. {2 g+ c- C) Y8 ?        title = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/text()'))
    - u5 Z7 r! A  Z' X        playinfo = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/span/text()')).split("万")
    ( ~7 u; D  j3 X# F( C" |8 Q        play = playinfo[0] + "万"& R0 m; A# q& q3 a
            comment = playinfo[1]5 h. S0 R3 z. L  Y3 {6 ^
            if comment.isdigit() == False:0 r- |/ o! p' {3 i" c: W  z
                comment += "万"
    - x( R7 s. r" l6 Z" y        upname = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/span/text()'))6 a7 L# i  c$ K7 h
            uplink = "http:" + "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/@href'))" R. H0 y* f( B( I" u4 M
            hot = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="pts"]/div/text()')); O! ]! F, U. l1 x3 W, t9 D
            video_list.append({$ Z7 \' Z2 d; i. ]
                'rank': rank,3 O$ e5 A% C  G9 x3 q# B; c
                'videolink': videolink,9 _3 ?9 L2 {& z
                'title': title,& v2 ?# W/ Z4 S1 S/ D9 T+ ]
                'play': play,
    - G3 i  F7 \! k: y2 D            'comment': comment,& u% @9 O+ E% `+ J5 q7 B
                'upname': upname,: n9 ]) t/ K( B! V7 M
                'uplink': uplink,5 z) i- U6 N3 q" h7 U8 t; S
                 'hot': hot
    0 ^: w) j  x0 A- s9 Q        })
    " ~! p0 L4 e2 J    return video_list
    9 V2 {8 |- }2 k4 t3 @  p
    $ p" k* W( m5 u% L8 f* h# 将爬取到的数据写入Excel表格, g2 l  L( K. u. n4 |* Y. m$ n% L
    def write_Excel(video_list):/ y7 Q9 _' S4 M: z/ I2 `/ T% z
        print("将b站热门视频信息导入到Excel表格:")
    . e' V2 b3 n  I+ T4 K- ^    workbook = xlwt.Workbook()  # 定义workbook
    5 y2 E) d# v) K4 y# H7 \    sheet = workbook.add_sheet('b站热门视频')  # 添加sheet; c+ o/ [, R8 M; G8 y1 ^7 {
        xstyle = xlwt.XFStyle()  # 实例化表格样式对象& G7 `2 m# m- P
        xstyle.alignment.horz = 0x02  # 字体居中
    ) J/ q" l' d- G% b8 K6 A6 s    xstyle.alignment.vert = 0x01  # 字体居中# u# |: Z( [5 _/ [( T$ a
        head = ['视频名', 'up主','排名', '热度','播放量','评论数']  # 表头
    ( a3 r- z9 D% m% O/ x! A    for h in range(len(head)):& ^# U' g/ M2 W% ]& D+ V
            sheet.write(0, h, head[h],xstyle)  # 把表头写到Excel里面去) E: g: l( t, I7 W
        i = 1
    " @3 x, m, b6 E: j    for item in video_list:
    ) w. ^, @; T% V6 Y        # 向单元格(视频名)添加(该视频的)超链接
    ) u' T9 n8 S% y+ b- u) `9 ~1 u        title_data = 'HYPERLINK("'+item["videolink"]+'";"'+item["title"]+'")'  # 设置超链接/ P( i. p! c/ T9 J% _4 O
            sheet.col(0).width = int(256 * len(title_data) * 3/5)   # 设置列宽/ ?7 T9 Y+ L) Y. `
            sheet.write(i, 0, xlwt.Formula(title_data), xstyle)
    2 A- W" ]3 \1 }+ Q. F        name_data = 'HYPERLINK("' + item["uplink"] + '";"' + item["upname"] + '")'  # 设置超链接2 P$ _7 E1 I) a3 X& Y
            sheet.col(1).width = int(256 * len(title_data) * 3 / 10)! j7 c! R3 M/ m0 N, V
            sheet.write(i, 1, xlwt.Formula(name_data), xstyle)- x% F. \! V7 ^6 ^, A- |6 I, ?
            sheet.write(i, 2, item['rank'], xstyle)
    - v' H2 n% }4 o, c/ [! [5 A        sheet.write(i, 3, item['hot'], xstyle)
    # T; P1 |4 F% m) W        sheet.write(i, 4, item['play'], xstyle)
    " d* g/ ~0 O+ N' S! x; T$ _        sheet.write(i, 5, item['comment'], xstyle)
    . _6 e9 o* K( ~5 O6 o( K: T* T+ L        i += 1) Q7 z5 }6 ~. a6 i/ L% [- h
        # 如果文件存在,则将其删除
    ( l3 T( i7 W- Z" N% E' r# U  @    if os.path.exists('D:/Test/b站热门视频信息.xls'):
    5 x/ W4 D, |& Z2 j0 O; W- Z7 t        os.remove('D:/Test/b站热门视频信息.xls')4 j8 J4 B, ^$ j
        workbook.save('D:/Test/b站热门视频信息.xls')3 c) t) \1 Y# C# p0 I
        print('写入excel成功')! a  \4 R9 K( }$ i/ A( `% X+ J
        print("文件位置:D:/Test/b站热门视频信息.xls")7 }) U( Y- C# Y
    " K* F0 ?, v% I! V- O& n( x
    if __name__ == '__main__':
    , V: k/ L" B1 E- M% ]0 M    video_list = []
      ?8 U! T# W; F- S. J- g, G6 N    write_Excel(spider(video_list))
    1 H0 V1 n# c' i( S4 D' w
    / c6 y3 ]& {- E0 u" J4 w' Q! x/ j$ ?7 ^3 {+ L

    ' N2 ^, R- n2 H4 t) t: N* q
    3 m# L9 a5 m7 h/ T( ^; f) E' ^: R- ~, J8 g
    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-9-2 02:01 , Processed in 0.455436 second(s), 54 queries .

    回顶部