QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 4451|回复: 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表格. X7 k8 U( M+ n' Q0 Z0 I, u
    效果图:/ m& C5 w( _  M$ }, A) z
    1.png 5 ], ^. r7 ^' N
    1.工先利其事必先利器,首先我们得下载相应的库:/ k& E* Y& {% c& ]4 |
    pip install requests
    - j) [* u+ }+ Z7 G6 Hpip install lxml
    : t/ y& g% C6 bpip install xlwt: h+ Z1 U0 J  E: V

    0 w  g+ @: K6 I# T, g' f7 P5 t" m' u9 Z- K. {8 ?% z
    requests 向网页发送请求
    : I' Z' L$ n" t! O' ~6 F9 nlxml 处理xml文件(xpath)
    7 B9 }2 S) B2 U5 K$ [/ ]xlwt 对Excel做写入操作
    * N( s! l$ U; g9 [! W& `. ^/ \2.爬取b站热门视频的信息:
    ; F4 r( ~$ ?6 H5 v  打开b站热门视频页面:& g" F" _4 E! j: Z+ E
    2.png & I% A% c6 P$ j- N( \2 @$ X% X6 ?
      按f12进入开发者选项,然后点击选中你要获取的页面信息,即可找到该信息在该HTML文件中的什么位置(这对我们用xpath获取元素属性和元素值很重要),例如:
    * h+ m: c  H5 f0 Z2 f 3.png , G# r; ^. W9 r5 r- G- P
    代码如下:  N' P9 R" A5 [1 N$ {
    # 爬取b站热门视频信息9 s5 Y. ]! y+ b& R
    def spider(video_list):
    * B) T9 `* P4 U! i$ l3 K- R' O& u    url = 'https://www.bilibili.com/ranking?spm_id_from=333.851.b_7072696d61727950616765546162.3'1 j, S- r1 \' ~# m: ]$ C' ]; Y
        html_data = requests.get(url).text
    & w' P( d$ ]! h4 K& i# m    selector = html.fromstring(html_data)* G  w: g: l$ h5 H" `% l
        infolist = selector.xpath('//li[@class="rank-item"]')8 S, [/ D/ d' ?0 z
        for item in infolist:" l: s. h6 I: b8 i
            rank = "".join(item.xpath('./div[@class="num"]/text()'))3 m0 P- X; r/ d7 J! I4 S
            videolink = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/@href'))
    7 g- ^! |  K' F1 m        title = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/text()'))
    . n, S1 H6 d: K) y- D; z1 u# j1 o% g( i        playinfo = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/span/text()')).split("万")" {( h: Q% i  P1 i! d
            play = playinfo[0] + "万"
    8 H% x! s, N8 J        comment = playinfo[1]1 P! i, e# R' I; ?& D8 \% [- {
            if comment.isdigit() == False:
    ; k8 Q" y  t/ b* I1 Q! |            comment += "万"4 [/ h* h' T6 W' ^6 V' X
            upname = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/span/text()'))
    2 P. O! E; J% K8 [5 ]) n; w        uplink = "http:" + "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/@href'))% a  V8 b% ?; J1 w4 d$ U
            hot = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="pts"]/div/text()'))4 D3 ?" V3 R$ v) O7 |: X
            video_list.append({
    + V. Z5 V+ r' v1 `6 N  b            'rank': rank,
    . c5 T. r3 c3 r: g# g/ P            'videolink': videolink,
    8 u+ U$ e+ T: b1 `9 K            'title': title,) v7 P9 u9 b  |% M3 t9 l
                'play': play,
    , U) H6 e* D6 d0 n            'comment': comment,( c6 V; r/ p) B4 V5 |7 E9 u) {
                'upname': upname,: }4 l3 t! `0 `% T0 @4 Y
                'uplink': uplink,
    * T  M1 K. i; l* J7 S9 d7 l             'hot': hot
    5 r0 A5 l0 R( G" z. C        })
    9 k0 l- _% r, v& Q2 P    return video_list
    6 K' R9 ~6 X& D( o' m! }- m* c
    % n7 T7 g9 L- H- f4 d
    8 U) K" j# w) W% h7 p/ t
    3.将我们拿到的信息集合(video_list)写入到Excel表格中:2 k! W& w- ^& V5 D( k0 l; t
      xlwt的基本使用方法:
    ( X+ @) o( u7 Kimport xlwt
    , M, @* }) z- b# 创建一个workbook (并设置编码); C" [8 D* J9 I& |( C% N& H
    workbook = xlwt.Workbook(encoding = 'utf-8')- M9 e4 E; s6 n
    # 创建一个worksheet
    6 c# s# C" |4 w$ ~* y8 A& }& Mworksheet = workbook.add_sheet('My Worksheet')
      M% O- N& S9 u8 B+ U
    * J/ S( Q$ Q3 k! X# 写入excel; i) i1 g3 U) z: j  f6 Z
    # 参数对应 行, 列, 值,(格式)
    : q% \/ {  `- d/ R+ ?+ {worksheet.write(1,0, label = 'this is test')2 }" }. K$ B# }* H7 X# ?
    # 保存
    , \7 f# ?0 Q, D; C6 H9 t  H#参数为你保存该Excel文件的路径
    # N2 ]+ s- `5 h. Y1 qworkbook.save('Excel_test.xls')+ Y' p# }, q4 V& L* p4 V( A* w  w! {

    0 I% v; [* H3 T6 u- ?% L; a' m/ {% N; l/ P& m& P$ p5 l! z
      如果我们想要点击视频名或者up的名字可以跳转,那么我们就要使用Excel表格的HYPERLINK方法:4 ~) ^3 |( P/ M) r
    HYPERLINK(“http://www.baidu.com” ; “百度”)
    0 b3 G/ E; H: R2 \# j百度为显示在单元格的信息,而前面的链接为跳转链接。1 O9 C5 Z. {: Q. k) r0 f
    xlwt.Formula()方法需要传入一个字符串s,s=‘HYPERLINK(“http://www.baidu.com” ; “百度”)’。2 G$ \- N' [9 t7 s9 h: [6 p
    代码如下:9 Q2 P0 [( {, Z) q/ h
    # 将爬取到的数据写入Excel表格) m0 Q* J- h/ M: b
    def write_Excel(video_list):
    5 n/ i: G- r6 {    print("将b站热门视频信息导入到Excel表格:"); S' k( N7 j  J
        workbook = xlwt.Workbook()  # 定义workbook9 f2 {! i$ R! G, |% k! \
        sheet = workbook.add_sheet('b站热门视频')  # 添加sheet
    * p$ _- e9 j$ m1 C2 _    xstyle = xlwt.XFStyle()  # 实例化表格样式对象
    5 E4 {/ v. ~' [6 B+ k: q    xstyle.alignment.horz = 0x02  # 字体居中# y5 x: G( @7 x. r3 C- q
        xstyle.alignment.vert = 0x01  # 字体居中
      U3 c9 j0 M8 X. g! z3 ?    head = ['视频名', 'up主','排名', '热度','播放量','评论数']  # 表头
    9 H  f- f# M- _! W$ s    for h in range(len(head)):2 |9 H( _9 a& X6 i; F  b
            sheet.write(0, h, head[h],xstyle)  # 把表头写到Excel里面去
    0 {+ u7 P8 b4 M7 Z+ J( Q2 t    i = 1
    ) B9 R- A( e. b3 q6 V) s+ b    for item in video_list:, q. u3 ~* n* W& U
            # 向单元格(视频名)添加(该视频的)超链接, Y' Y3 }& Y" H1 b4 @4 ~8 d
            title_data = 'HYPERLINK("'+item["videolink"]+'";"'+item["title"]+'")'  # 设置超链接
    3 A, J) Z9 A4 x2 C& f- W        sheet.col(0).width = int(256 * len(title_data) * 3/5)   # 设置列宽
    ) r- m1 s) V' M7 k( p        sheet.write(i, 0, xlwt.Formula(title_data), xstyle)
    6 u: D# l# a! s2 I) g        name_data = 'HYPERLINK("' + item["uplink"] + '";"' + item["upname"] + '")'  # 设置超链接
    , \, T! D+ s8 @+ W; i" `        sheet.col(1).width = int(256 * len(title_data) * 3 / 10)
    / s. S7 |8 ^1 U        sheet.write(i, 1, xlwt.Formula(name_data), xstyle)
    9 g% Q) ?6 d  {# ^        sheet.write(i, 2, item['rank'], xstyle)) D! f5 s. _( U% B5 E+ d
            sheet.write(i, 3, item['hot'], xstyle)
    ; t" ?. K+ F+ `; i) k, G9 h2 e        sheet.write(i, 4, item['play'], xstyle)
    / \0 N  p- Y  I$ M2 o4 c        sheet.write(i, 5, item['comment'], xstyle)
    5 E. m7 l% \) [* B* y+ r        i += 1; F/ S- D' E6 q" w0 S
        # 如果文件存在,则将其删除
    5 P' }6 w" Z$ x/ J    if os.path.exists('D:/Test/b站热门视频信息.xls'):, t& N6 ^* k. w# v
            os.remove('D:/Test/b站热门视频信息.xls')
    . y/ u1 S: k" j0 u9 s; ?; W    workbook.save('D:/Test/b站热门视频信息.xls')+ E7 s+ i, ~6 L: d, k. q
        print('写入excel成功')
    " @9 _( t+ N& b3 c. J    print("文件位置:D:/Test/b站热门视频信息.xls"). _! g) M, O9 j
    * O! ~; ~6 h) i7 a- ^

    2 M) F& B. {3 Q6 A& b# O$ F4.在入口main中调用上面两个函数" _  A- m  @8 ?
    完整代码如下:, [: c) @5 L: i6 ]! h1 N; g
    import requests
    ' M8 `( h6 W% f( p! Z" J: afrom lxml import html% K! v9 a0 y3 C. F4 f1 }9 g
    import xlwt
    / [  c: K' s! ?9 _; Nimport os4 z. o9 [1 G( h" j' P3 j; W3 S

    4 `/ E0 M/ @# v+ j3 K! e# 爬取b站热门视频信息
    " Z$ Z5 p  P9 J* w" Tdef spider(video_list):
    9 A) f% o6 K% Q& W) b. u    url = 'https://www.bilibili.com/ranking?spm_id_from=333.851.b_7072696d61727950616765546162.3'
    3 U& {) e  p, M" u5 H    html_data = requests.get(url).text
    : {8 ~% u/ [( u2 E    selector = html.fromstring(html_data)1 N8 ?: u5 A4 F
        infolist = selector.xpath('//li[@class="rank-item"]')
    ( z0 r4 j# a+ L5 j# R' t    for item in infolist:
    5 O3 ]4 L$ o6 o        rank = "".join(item.xpath('./div[@class="num"]/text()'))
    : N. i2 _  u! _        videolink = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/@href'))$ W* g: u; b! r5 n# p; y
            title = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/text()'))! n& F( N; @0 T: E' q! [+ h
            playinfo = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/span/text()')).split("万")
    * _$ O7 d/ r# }  v% M- J" T$ B) E6 Y" J        play = playinfo[0] + "万"/ x9 w/ X  p; a/ m: v; d$ \# a4 u
            comment = playinfo[1]
    8 i$ @( q& B, k: x' F' o        if comment.isdigit() == False:
    2 x3 x7 k2 c4 Y! }9 R            comment += "万"1 B2 q. |9 X" h' E$ m5 c$ [
            upname = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/span/text()'))7 y8 v* t, ~# l4 S% V
            uplink = "http:" + "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/@href'))
      L* R+ S' n5 E7 z; S6 h( U2 q/ z        hot = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="pts"]/div/text()'))
    + ^: x" l+ q( A        video_list.append({( G" N! F; `) e1 K7 X& p
                'rank': rank,, U5 B1 q1 M- I* y3 m) A
                'videolink': videolink,8 H" u- h" {  @% R  x
                'title': title,
    , Q1 y' C; A9 K- W# ]6 I            'play': play," T- {2 T; a9 o* ~
                'comment': comment,
    . w( {" A. p8 z0 u' C8 |. a( Z+ p            'upname': upname,
    ( d2 ~( T4 V: m. A% e            'uplink': uplink,. O  {2 P. J9 z# t" e
                 'hot': hot
    : p  ~2 o7 x/ K        }): t0 `3 H& l! A0 g+ ]
        return video_list
    # d4 N$ q; B$ B3 x6 N, q
    6 A2 D  G! y5 p' g# 将爬取到的数据写入Excel表格
    : K" |, o4 _! O/ T% r6 S+ ]: qdef write_Excel(video_list):3 |6 i$ t! B1 U% {- G0 p0 U
        print("将b站热门视频信息导入到Excel表格:")
    : ~5 L' W2 j4 D    workbook = xlwt.Workbook()  # 定义workbook& n7 n' h5 A' a" T$ E9 ]
        sheet = workbook.add_sheet('b站热门视频')  # 添加sheet
    6 ^2 y+ N& E& z    xstyle = xlwt.XFStyle()  # 实例化表格样式对象
    9 z, p; k/ Z" a    xstyle.alignment.horz = 0x02  # 字体居中
    6 @+ H! j$ ^. N+ c6 n" L    xstyle.alignment.vert = 0x01  # 字体居中
    4 f2 @( Q5 z7 V, w1 _; o0 b0 V- o; E( E    head = ['视频名', 'up主','排名', '热度','播放量','评论数']  # 表头
    7 Z* W, g8 B  x# H  g$ {" W% A    for h in range(len(head)):
    - O( w9 A& r, s8 {& l; v        sheet.write(0, h, head[h],xstyle)  # 把表头写到Excel里面去. t- T2 s6 z/ c' T
        i = 1
    ; C/ Q: }4 L7 Y    for item in video_list:
    2 b- K! L  g9 P% D" o        # 向单元格(视频名)添加(该视频的)超链接2 D2 E  F1 Y2 W- }& R
            title_data = 'HYPERLINK("'+item["videolink"]+'";"'+item["title"]+'")'  # 设置超链接/ y+ h$ {2 f7 F
            sheet.col(0).width = int(256 * len(title_data) * 3/5)   # 设置列宽
    - \1 N7 }+ D  }        sheet.write(i, 0, xlwt.Formula(title_data), xstyle)2 ~1 P8 t( {# V9 b7 b9 R7 n4 w( G9 o
            name_data = 'HYPERLINK("' + item["uplink"] + '";"' + item["upname"] + '")'  # 设置超链接9 G( M6 e2 V" X$ [3 X7 `0 |
            sheet.col(1).width = int(256 * len(title_data) * 3 / 10)1 F& F' _% s5 ?0 x; `
            sheet.write(i, 1, xlwt.Formula(name_data), xstyle)
    # X6 O* V) ^9 [% Y" {9 P        sheet.write(i, 2, item['rank'], xstyle)& k" V8 [3 @5 P5 u8 L( h
            sheet.write(i, 3, item['hot'], xstyle)
    # p. G( i  G0 o$ O8 G, H& }' ], b9 G/ Y        sheet.write(i, 4, item['play'], xstyle)6 _$ H3 R7 c% v
            sheet.write(i, 5, item['comment'], xstyle), b5 q2 S/ G4 D8 I# @# O9 ?
            i += 1
    * @$ M# z" _: S5 W6 o* Z    # 如果文件存在,则将其删除: K; B2 s; ?6 J7 k9 U5 v
        if os.path.exists('D:/Test/b站热门视频信息.xls'):
    / p* j- g$ _8 g5 W4 t        os.remove('D:/Test/b站热门视频信息.xls')9 b- [6 }7 A& o: P6 ]$ l0 m
        workbook.save('D:/Test/b站热门视频信息.xls'): @2 e: D: \( L5 I! u" L
        print('写入excel成功')
    * d& x; u7 t8 ~& y; ~    print("文件位置:D:/Test/b站热门视频信息.xls")
      |. H6 k: ?* z0 [& n3 ?5 G' }1 E" K8 h+ X) F
    if __name__ == '__main__':, ~  V2 x2 i- A: X. r3 G: Y
        video_list = []
    2 ~  s/ q3 ]+ \. s    write_Excel(spider(video_list))
    ) j: x9 k" K" p
    . n: r+ t  C/ r7 q5 F  _$ p3 H' E  j3 v1 C! E6 @/ }( _% S2 m4 }  X8 N4 ]
    # h, ~- f5 _3 ~1 Y5 ?7 z' k1 o
    : \& J  }) U  I% ?
      s+ s4 g5 O1 p1 R6 M7 m0 X
    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-7-18 11:22 , Processed in 0.485520 second(s), 54 queries .

    回顶部