QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 4413|回复: 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表格
      D) [. @! z7 s1 B2 G效果图:, l6 f7 F' V4 T8 D
    1.png 9 V! }8 g9 x' o0 X8 g! t
    1.工先利其事必先利器,首先我们得下载相应的库:
    ; x0 _: |% F7 h  T1 a+ d8 xpip install requests
    9 ?2 K3 b8 X$ @0 l2 I* Mpip install lxml8 X/ O8 F/ d6 [$ y3 L) E
    pip install xlwt
    : J! o- K) m5 H) w) k# x+ a
    8 F" M% P1 r2 k$ B. N3 T( \' H! p' ^; \3 R! p2 J$ D
    requests 向网页发送请求! g! X; O0 Z2 h
    lxml 处理xml文件(xpath)
    6 @2 B% D# _# bxlwt 对Excel做写入操作2 L. I5 ^1 C2 l# D7 I9 m' U4 V
    2.爬取b站热门视频的信息:2 h( m1 Z0 B7 i2 c* J
      打开b站热门视频页面:
    % M# q' C9 j9 q/ s 2.png
    ! M  j* K8 o6 k$ Q, ^  按f12进入开发者选项,然后点击选中你要获取的页面信息,即可找到该信息在该HTML文件中的什么位置(这对我们用xpath获取元素属性和元素值很重要),例如:
    ( W" b7 P% v- T 3.png 7 Z* H3 u8 f4 a; c; I
    代码如下:
    7 r6 I+ {1 }5 R* E2 p# 爬取b站热门视频信息
    0 f" l& @# ]2 X- d8 D% _% jdef spider(video_list):
    4 A8 y+ |) u) I    url = 'https://www.bilibili.com/ranking?spm_id_from=333.851.b_7072696d61727950616765546162.3'
    $ j& I3 T: @3 [- {5 l' x    html_data = requests.get(url).text1 {  p1 u& @* U2 n. [6 y
        selector = html.fromstring(html_data)  I9 q! d) z( l$ P
        infolist = selector.xpath('//li[@class="rank-item"]')9 O8 g. o  X4 [0 e) `2 R6 S
        for item in infolist:7 c/ c2 \2 K! L. V) i6 n" O  o
            rank = "".join(item.xpath('./div[@class="num"]/text()')). f" e7 \# z4 G/ w
            videolink = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/@href'))" c' ~( B/ y1 P. \/ J6 Z. J
            title = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/text()'))
    ' o1 T! S  @6 f! E/ l        playinfo = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/span/text()')).split("万")
    , {  _0 h! e2 `) W        play = playinfo[0] + "万"
    , a; f& h* h2 j8 V  t        comment = playinfo[1]8 k/ y9 j( c' V/ g# h4 l( R! g6 x
            if comment.isdigit() == False:
    . b8 f7 R& E# Y# c8 K- N6 b            comment += "万"
    # c- X% j5 x4 [& ?. p        upname = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/span/text()'))* q2 }( K9 W4 W  M9 o- ^3 Y
            uplink = "http:" + "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/@href'))8 O* ~. ?; |# o* u
            hot = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="pts"]/div/text()'))! v( X* q1 c8 \1 [! k
            video_list.append({& _& k4 Q7 L; L! M1 L3 `" N
                'rank': rank,
    # `; v2 X% t6 V: k2 p; L            'videolink': videolink,) L) F9 ]% p; }
                'title': title,0 `& h! _# g5 X5 Q+ S
                'play': play,( t0 O4 j. u% {; w9 G0 L
                'comment': comment,
    0 k7 n: e. u: M            'upname': upname,( K& `% C, Z2 P$ J8 e: f
                'uplink': uplink,3 M) E4 E! X$ E
                 'hot': hot
    + F, a  c' |: W; l; }        })
    . u+ r$ L/ X/ A  }* o4 x6 L2 J    return video_list1 v( C/ l3 X7 c
    0 ], U# A4 @6 A' U  }

    4 i9 Z5 v2 |2 e% k9 l3.将我们拿到的信息集合(video_list)写入到Excel表格中:# {  G& g, ~) B/ r; S9 J
      xlwt的基本使用方法:( p) i! a0 g- q( J3 }0 H& ~
    import xlwt0 {9 x) d3 P$ m# i! y
    # 创建一个workbook (并设置编码)7 C2 B0 H* i" |' l$ c, g* X* J" r
    workbook = xlwt.Workbook(encoding = 'utf-8')
    $ w+ ?1 [2 y# {& s7 O1 B# 创建一个worksheet
    % y+ y2 X/ Z- w( k  x# Yworksheet = workbook.add_sheet('My Worksheet')
    4 C, X2 N3 O4 T/ Y
    1 d, b) Y$ D# k3 J! I! P# 写入excel, r8 ?# Q/ `% d2 b$ Y! H
    # 参数对应 行, 列, 值,(格式)+ H* s0 x/ w7 I7 f5 {" W1 q# d8 M
    worksheet.write(1,0, label = 'this is test')% ?8 Q$ r/ R1 Q: N! N
    # 保存
    . L8 V9 F) v. [" F+ f. S( ~#参数为你保存该Excel文件的路径
    + U& |. k) _" @workbook.save('Excel_test.xls')3 e+ U& E5 ]( _+ t8 x* f0 a
    1 _7 z8 w. \( N" |/ N4 v

    8 C: c2 S- Q" E  如果我们想要点击视频名或者up的名字可以跳转,那么我们就要使用Excel表格的HYPERLINK方法:* w5 Q4 G% y8 Y$ W5 |( P
    HYPERLINK(“http://www.baidu.com” ; “百度”)
    ( n8 @3 m- l& ?& v百度为显示在单元格的信息,而前面的链接为跳转链接。
    # O9 o7 k& x$ l5 c# l+ N" S( pxlwt.Formula()方法需要传入一个字符串s,s=‘HYPERLINK(“http://www.baidu.com” ; “百度”)’。
    , R& o8 }8 I4 x- e" m( `7 S" w, e代码如下:
    , c/ p4 H( r+ U& N. H# 将爬取到的数据写入Excel表格
      }. {, r2 l( j5 d# Odef write_Excel(video_list):7 C# A1 e  i7 q) B) b' }
        print("将b站热门视频信息导入到Excel表格:")
    8 P7 n' C6 p/ i( H8 K    workbook = xlwt.Workbook()  # 定义workbook
    & b+ N& h2 w: x% \3 t' Z    sheet = workbook.add_sheet('b站热门视频')  # 添加sheet2 c. z& z4 w; L/ I! W$ B/ ]5 K0 k
        xstyle = xlwt.XFStyle()  # 实例化表格样式对象& Z  p* @+ m6 a$ v
        xstyle.alignment.horz = 0x02  # 字体居中
    & D7 g, \) R' ?3 j; ?    xstyle.alignment.vert = 0x01  # 字体居中
      Y$ U1 \7 f  `, a8 f  [9 d    head = ['视频名', 'up主','排名', '热度','播放量','评论数']  # 表头
      i' ~5 V& B7 V) j. c" X" Y    for h in range(len(head)):
    3 G6 I/ A; i& h        sheet.write(0, h, head[h],xstyle)  # 把表头写到Excel里面去
    3 u! p( y  _) V, P5 ~    i = 16 N1 _" I0 j# t& H% E. L" F5 b
        for item in video_list:: e1 A6 h4 |# @& ?% n  Y
            # 向单元格(视频名)添加(该视频的)超链接4 v/ \: x9 R) @
            title_data = 'HYPERLINK("'+item["videolink"]+'";"'+item["title"]+'")'  # 设置超链接
    * u# R' E' C( [& A! |& O        sheet.col(0).width = int(256 * len(title_data) * 3/5)   # 设置列宽4 h/ }) \2 X* |$ O& d
            sheet.write(i, 0, xlwt.Formula(title_data), xstyle)
    2 w( J; B& l1 g6 O! D. `        name_data = 'HYPERLINK("' + item["uplink"] + '";"' + item["upname"] + '")'  # 设置超链接: m' y0 z) d) |+ ?
            sheet.col(1).width = int(256 * len(title_data) * 3 / 10)
    " V! ?2 M: l$ D( |% `- W        sheet.write(i, 1, xlwt.Formula(name_data), xstyle)
    1 f; p9 N! D% ]        sheet.write(i, 2, item['rank'], xstyle)) @* T. @, s% W: @7 R
            sheet.write(i, 3, item['hot'], xstyle)4 U$ H4 f+ d3 d( p3 Z8 _) H
            sheet.write(i, 4, item['play'], xstyle)% z9 n$ e4 H/ v  V  c+ P. Y! b
            sheet.write(i, 5, item['comment'], xstyle)4 v4 b  d$ f4 q2 R$ `  f% A
            i += 1+ I7 Y8 X$ f: H  p) ^
        # 如果文件存在,则将其删除/ i) d9 j  ]' t1 z5 L
        if os.path.exists('D:/Test/b站热门视频信息.xls'):2 F% S% }+ p5 w2 P& Y1 p; [
            os.remove('D:/Test/b站热门视频信息.xls')
    8 C0 N7 ~! S' b7 T    workbook.save('D:/Test/b站热门视频信息.xls')
    4 X* x' Y- o8 y, J% I. E# k    print('写入excel成功')
    + n( x; v, s- |, e/ f) Z; a    print("文件位置:D:/Test/b站热门视频信息.xls")0 l" r6 w7 |/ Z& \: v
    " g: d% d7 _! b. j# c
    1 ~4 E7 u- l; G9 ?2 H; E
    4.在入口main中调用上面两个函数
    / b# n$ Z  r) U9 V) x完整代码如下:
    : z& H% A+ e5 S5 c/ jimport requests
    1 `: k& y# {$ J7 U8 b, h! N) F1 Dfrom lxml import html
    ' M0 r" U- l8 c- Gimport xlwt
    8 T- D) ^4 M  a2 J! ?import os" X/ y( ?* f- ~# a

    4 f' y. W0 I( I2 G) b$ f0 h( \: I# 爬取b站热门视频信息* ^0 n; Z8 H( P7 Q2 F- n, Z
    def spider(video_list):. w9 |2 a4 \  A- @0 B/ g
        url = 'https://www.bilibili.com/ranking?spm_id_from=333.851.b_7072696d61727950616765546162.3'
    ; F% R3 i# g% s2 \    html_data = requests.get(url).text- o4 h: Z' ]( `, M3 K, R% U
        selector = html.fromstring(html_data)
      j; c4 `! ~4 P    infolist = selector.xpath('//li[@class="rank-item"]')
    . s0 E4 e$ ^+ b) r& r8 V    for item in infolist:5 K& y1 |' d; Z; R, \& ~1 g% r
            rank = "".join(item.xpath('./div[@class="num"]/text()'))
    : D1 H4 L2 U5 ~: z& }/ g        videolink = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/@href'))5 h# z3 q, B2 D5 D+ v
            title = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/text()'))
    1 Z# J: ]+ K3 L* X% L* }9 Y        playinfo = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/span/text()')).split("万")
    * T" ~! ^% Z' ]. r        play = playinfo[0] + "万"
    6 C1 f- u' \4 C/ f! k! l, Z        comment = playinfo[1]
    & z- F- q# X0 N" ?' B1 p% d' ?        if comment.isdigit() == False:/ o; G- N, D* q
                comment += "万"2 o3 B! F- t# A& W6 J8 s9 D
            upname = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/span/text()'))
    % \  D* ~) V; t! O5 c3 F        uplink = "http:" + "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/@href'))
    : D. v' {) B+ Y' I8 B1 W5 p$ V" L4 }% I        hot = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="pts"]/div/text()'))2 Z8 K0 y" y. @. ^6 b$ X4 V! Y" ?. p& X
            video_list.append({
    ) L4 d# P% h; R; r0 X            'rank': rank,  W) X6 F, t) t; G; ?
                'videolink': videolink,
    ; x& f# I) k, @* w2 ~: m            'title': title,
    0 g5 s- @- c2 _9 d8 E: e' ~# a            'play': play,
    $ I: d- r5 u0 M1 R# y            'comment': comment,: i) |5 S, N- \* u/ y2 m
                'upname': upname,
    # R; i" A4 L) x" d1 \            'uplink': uplink,
    # V& A2 z$ o" @/ n$ f3 g- V             'hot': hot
    ' b  x+ w7 {" _" f. t4 y        })
    , e2 c  s1 V* n& J3 v    return video_list5 }% t3 b  o! {2 v$ D: k/ T
    / y0 y( d1 j& w8 T1 `( Y2 j
    # 将爬取到的数据写入Excel表格, V, I0 j6 l. z. t% A# R8 Y
    def write_Excel(video_list):
    ! M; u& `' N5 Q+ n8 w6 ?& x    print("将b站热门视频信息导入到Excel表格:")
    2 F0 g+ H0 Q1 d, s& _. Q. [    workbook = xlwt.Workbook()  # 定义workbook
    % P6 q: Q7 z8 y% h" i( E    sheet = workbook.add_sheet('b站热门视频')  # 添加sheet- G2 e7 A0 a9 d
        xstyle = xlwt.XFStyle()  # 实例化表格样式对象6 q) F1 ], H9 `$ @, i- L3 ]( x
        xstyle.alignment.horz = 0x02  # 字体居中0 \+ {( n# b* I5 A
        xstyle.alignment.vert = 0x01  # 字体居中
    , ]$ Z& K2 Q. w! v' _6 ^    head = ['视频名', 'up主','排名', '热度','播放量','评论数']  # 表头8 q  N6 `/ x1 u
        for h in range(len(head)):& h; A1 a' U& I7 a
            sheet.write(0, h, head[h],xstyle)  # 把表头写到Excel里面去9 B- w' w: C$ H! E% ~) o
        i = 1- y9 A4 O" K# U
        for item in video_list:, S# E) t# ?4 u! Q) m; X
            # 向单元格(视频名)添加(该视频的)超链接( c. ]5 I4 N# g* W6 O" P9 S. {' S! r* R
            title_data = 'HYPERLINK("'+item["videolink"]+'";"'+item["title"]+'")'  # 设置超链接" Q1 T# T5 h+ q% w
            sheet.col(0).width = int(256 * len(title_data) * 3/5)   # 设置列宽- U+ s1 ]+ \+ y: Z) x+ f
            sheet.write(i, 0, xlwt.Formula(title_data), xstyle)/ @4 o2 d; L) l( o2 P
            name_data = 'HYPERLINK("' + item["uplink"] + '";"' + item["upname"] + '")'  # 设置超链接
    # g6 Y* L% F3 z4 ^" X8 G: _        sheet.col(1).width = int(256 * len(title_data) * 3 / 10)# f4 s1 b4 f+ L* B! f
            sheet.write(i, 1, xlwt.Formula(name_data), xstyle)7 s2 o0 X  k" Q9 F  R+ y' w) Z1 L
            sheet.write(i, 2, item['rank'], xstyle)% S& E1 G3 f1 R  N
            sheet.write(i, 3, item['hot'], xstyle)
    & ~* U9 U/ P/ K/ x        sheet.write(i, 4, item['play'], xstyle)
    ; \; P* K8 ]6 e  ~+ S& r( {        sheet.write(i, 5, item['comment'], xstyle)
    ' M3 p7 j. e, q0 v        i += 1+ I/ y0 j; c: _( W9 G! f' W8 P9 E
        # 如果文件存在,则将其删除# e8 l% b* M( }* Y* F
        if os.path.exists('D:/Test/b站热门视频信息.xls'):
    + \; G; y' Q* \; d        os.remove('D:/Test/b站热门视频信息.xls')
    4 d# J: D9 }( {& L# n1 D' i    workbook.save('D:/Test/b站热门视频信息.xls')
    8 N( c. C& o6 K! j    print('写入excel成功')
    ' A* A2 L" O7 |. p" w1 O3 X/ Y    print("文件位置:D:/Test/b站热门视频信息.xls"). E. w7 R& A% t! {

    8 g" s4 M5 }# x6 V+ Q6 T) g) Aif __name__ == '__main__':
    ; S1 Z3 I8 d3 ?- S. K' T    video_list = []
    + x# M( Y! M; Z$ ?    write_Excel(spider(video_list))
    4 |- t% T1 m$ I& z+ A9 J# P2 i! F% s( {& k% k

    2 [' W3 Q0 _8 R# f4 _( ]; `0 V* e/ H* L0 D0 [, r
    + @0 N+ v2 H5 [+ ~3 @3 [
    : P2 R/ S& u  g- T0 Y
    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-18 10:00 , Processed in 0.383768 second(s), 54 queries .

    回顶部