QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 4447|回复: 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表格
      B( u9 ?7 Y4 e* p效果图:
    - D) v) O" A1 c) }9 O 1.png
    7 I8 d1 O6 p! c% f- e' ~& t* Z- l6 F1.工先利其事必先利器,首先我们得下载相应的库:
    ) W+ W1 z2 p4 ~; u0 }+ k6 Z/ T8 Upip install requests6 B5 O* g9 P( y, j
    pip install lxml
    " V" ^6 ?4 Q& }  _  ~pip install xlwt0 `, }  Q1 T$ b: g$ t4 b* z

    : i2 i7 z) s/ R( z* y# R; I+ p/ S
    # f; m7 ~( d% krequests 向网页发送请求
    2 c9 u, U# G3 p$ K! ulxml 处理xml文件(xpath)8 C! i& d& k1 N+ _) T; w1 g% b5 W
    xlwt 对Excel做写入操作
    2 S  c- ^: {( O& a. \' w8 q2.爬取b站热门视频的信息:$ @& v; l: U/ ^& z8 B
      打开b站热门视频页面:' V3 S* q( {! K. I
    2.png % s  }" `0 F6 A; Q3 U
      按f12进入开发者选项,然后点击选中你要获取的页面信息,即可找到该信息在该HTML文件中的什么位置(这对我们用xpath获取元素属性和元素值很重要),例如:+ e0 `5 P8 m( D7 C1 Z3 b6 I
    3.png 2 u1 E! X2 ^9 p/ h
    代码如下:  j8 u( j9 G0 i3 {
    # 爬取b站热门视频信息9 D% D9 ~* O: Z/ I; K, V
    def spider(video_list):
    / o1 C; ]2 I5 X( ~% m( X    url = 'https://www.bilibili.com/ranking?spm_id_from=333.851.b_7072696d61727950616765546162.3'/ K$ U! {8 v7 b8 K, P, n& y, i
        html_data = requests.get(url).text: ~2 B+ _' l$ ?; S: \+ V3 ~3 ^
        selector = html.fromstring(html_data)
    1 V1 A! s+ ]; ~    infolist = selector.xpath('//li[@class="rank-item"]')- Y( W$ y9 F! x" L) y% j0 O$ G
        for item in infolist:
    9 t; _- Z( w7 K, K% i. r3 O! ~        rank = "".join(item.xpath('./div[@class="num"]/text()'))
    1 y* U- U+ p% a& z4 c        videolink = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/@href'))9 _8 m2 l% f3 `+ c. r
            title = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/text()'))
    ! n' {7 L: E/ G8 n        playinfo = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/span/text()')).split("万")
      t7 H( }, z% ^- i2 H$ t        play = playinfo[0] + "万"4 |& K, g; t( I9 ]; Q7 v
            comment = playinfo[1]
    $ q5 `* u  C" u& ]% M8 |- V% H        if comment.isdigit() == False:
    ' ^4 m# l" A9 B. X/ v6 x) C            comment += "万"" n7 Q) L) ~0 @( ?
            upname = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/span/text()'))
    6 e3 q* `0 E7 B: e0 k4 H0 {* h        uplink = "http:" + "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/@href'))
    1 V9 l) H- k* V% |  _1 R% W        hot = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="pts"]/div/text()'))
    2 a# r% h/ r1 c% l4 B- r9 t7 z1 b        video_list.append({
    & ], `- u' \3 d! r! U: v  a) l. k            'rank': rank,
    1 u  f/ u/ A, l+ ~& |8 O! S1 Z            'videolink': videolink,, `* V5 t- S; L/ K' A; C/ J
                'title': title,; F7 H, D( o$ h5 K; P& r. Q% p
                'play': play,6 ~" h$ c- a1 p& ^
                'comment': comment,
    0 W" K4 v) h- i7 {2 L  h" T5 x5 Y            'upname': upname,7 g3 ]# ^) U2 |0 V" r7 v& [9 X
                'uplink': uplink,
    * s# I) M7 l- M# M7 ~             'hot': hot' l% [# I6 \. [0 _$ l
            })! J  W8 h! I! r1 Y4 F: g: H  o9 X
        return video_list
    8 e4 Y. b5 D  _6 j2 `2 _0 a1 X1 X- v5 @4 ~
    : U  g. o7 H. x% F0 D1 X
    3.将我们拿到的信息集合(video_list)写入到Excel表格中:2 T. n0 s0 E4 q2 O/ P1 i. B4 E- \
      xlwt的基本使用方法:
    & n( N. G* Y. j! S9 L/ p$ b" Z, U; cimport xlwt
    " w0 j6 a; ?' d3 o1 Y/ a# 创建一个workbook (并设置编码)1 P: B( q! [, l3 f
    workbook = xlwt.Workbook(encoding = 'utf-8')# U4 V0 H; H8 s6 L3 W+ I; A& }
    # 创建一个worksheet
    : i6 r8 q: \3 \# u/ L  U+ H& Dworksheet = workbook.add_sheet('My Worksheet')
    ) c/ R: `% J' _8 z
    5 f  y$ y/ }* E  M7 N& A' i/ O6 T# 写入excel
    & S, p6 o) @4 U) T( ]; Z8 o3 h# 参数对应 行, 列, 值,(格式)/ e& u8 s; c$ V: F* Q
    worksheet.write(1,0, label = 'this is test')
    / v# d' e0 _0 [1 {8 G- g: s# 保存- w8 E8 ~# q/ i: D7 l
    #参数为你保存该Excel文件的路径
    $ D  u( T/ k; Sworkbook.save('Excel_test.xls')% M$ u8 {  {. K0 C

    2 y  i9 e) b" d2 g0 D& b* d$ z
      如果我们想要点击视频名或者up的名字可以跳转,那么我们就要使用Excel表格的HYPERLINK方法:# z$ W* N4 ^" j8 _
    HYPERLINK(“http://www.baidu.com” ; “百度”)7 X* C8 i/ {0 O) [% l9 f, K
    百度为显示在单元格的信息,而前面的链接为跳转链接。
    7 A7 Y5 }5 D% B4 e5 {xlwt.Formula()方法需要传入一个字符串s,s=‘HYPERLINK(“http://www.baidu.com” ; “百度”)’。
    " U9 f; t. z- L. e* ]代码如下:
    * [8 S3 V3 j  ]# 将爬取到的数据写入Excel表格+ n8 v. g# K" q+ [1 u; r; a1 J* n; ~
    def write_Excel(video_list):
    % O  h* y3 f+ U% h% K+ X0 _/ p    print("将b站热门视频信息导入到Excel表格:")
    0 }# k" W1 ^- P' Z: {5 z; Q    workbook = xlwt.Workbook()  # 定义workbook; w) E- u9 K" Q1 I% s1 V
        sheet = workbook.add_sheet('b站热门视频')  # 添加sheet* u4 T. G- ~$ m. O$ ^2 b* {
        xstyle = xlwt.XFStyle()  # 实例化表格样式对象5 F1 R9 D& j2 ^+ F% \8 [' S/ h
        xstyle.alignment.horz = 0x02  # 字体居中
    7 P! ]% `6 f3 T1 X4 ]    xstyle.alignment.vert = 0x01  # 字体居中
    , Y8 S' V! A& f4 G9 Q/ y7 v  K    head = ['视频名', 'up主','排名', '热度','播放量','评论数']  # 表头
    8 R0 N4 B+ i9 Q) I- s+ Y; j    for h in range(len(head)):
    1 ]8 ^; |: P" }+ M$ I+ b" i- c        sheet.write(0, h, head[h],xstyle)  # 把表头写到Excel里面去. e* w2 l, \, z5 S
        i = 1! {9 i' M) a5 J+ A* c
        for item in video_list:
    % E" Y7 p( T- Z# X        # 向单元格(视频名)添加(该视频的)超链接
    ; d* M1 _$ f$ D' X1 r        title_data = 'HYPERLINK("'+item["videolink"]+'";"'+item["title"]+'")'  # 设置超链接
    ' L# i6 a( @+ F% \        sheet.col(0).width = int(256 * len(title_data) * 3/5)   # 设置列宽
    ! U/ k( F) ?! v( q# Z' z+ f        sheet.write(i, 0, xlwt.Formula(title_data), xstyle)* _% a  p. Y/ z3 l5 H
            name_data = 'HYPERLINK("' + item["uplink"] + '";"' + item["upname"] + '")'  # 设置超链接+ _4 G* X- L% _  F2 t( X. `
            sheet.col(1).width = int(256 * len(title_data) * 3 / 10)
    3 j  }& Q- Y( s        sheet.write(i, 1, xlwt.Formula(name_data), xstyle)
    $ m! v3 I" D0 f0 V, u        sheet.write(i, 2, item['rank'], xstyle)
    * [# ^1 g1 d7 l  M5 M2 l& ~  Q        sheet.write(i, 3, item['hot'], xstyle)- R2 p0 @  n8 L8 X( B$ L
            sheet.write(i, 4, item['play'], xstyle)$ }/ R% }+ ]; h: R. v9 x1 i3 c
            sheet.write(i, 5, item['comment'], xstyle)
    # M1 o3 A1 }+ H" i7 G! B! x8 T7 ~5 D/ Q, i        i += 1
    $ D  }6 U7 c  O7 c$ H    # 如果文件存在,则将其删除. I, _& U, _0 I
        if os.path.exists('D:/Test/b站热门视频信息.xls'):
    4 Y# V. R* t! ^' @        os.remove('D:/Test/b站热门视频信息.xls')
    2 W! S+ Y1 [, a+ ?3 ^& i% c    workbook.save('D:/Test/b站热门视频信息.xls')
    % ?* C2 N! p& F& W    print('写入excel成功')5 _! M3 ~) z7 B8 h6 `1 ]( T7 X  G
        print("文件位置:D:/Test/b站热门视频信息.xls"); \. |6 R( ?/ b' H. {

    . R: K# ]0 m8 f2 L" N* i
    2 N2 g. a/ r; p5 }! Z( r; @1 _4.在入口main中调用上面两个函数
    . B3 }5 P3 ^6 l& W4 A  X. \完整代码如下:
    % S4 Z* }& g. K/ Zimport requests
    1 V/ H- u: `8 C1 N$ O0 u6 Ffrom lxml import html
    ) z# f* n  y; l# D1 yimport xlwt; I. {( a3 J0 J
    import os
    * @: T9 a* U) c0 ^' q& J4 z; b
    : h* h2 ^% h( S+ I# 爬取b站热门视频信息
    7 ~3 B- L9 U$ ~def spider(video_list):
    & X0 A# E* I7 u3 v    url = 'https://www.bilibili.com/ranking?spm_id_from=333.851.b_7072696d61727950616765546162.3'/ Y% e: g% X5 n( g4 g8 I
        html_data = requests.get(url).text
      L& ^. n7 M7 E% Q* ~) n    selector = html.fromstring(html_data)! `8 ]3 o) a# r7 w/ W2 x
        infolist = selector.xpath('//li[@class="rank-item"]')
    1 x  J) M% K( }& g( Z    for item in infolist:
      {8 e4 X& L8 h* c4 z/ q- i        rank = "".join(item.xpath('./div[@class="num"]/text()'))1 t& \5 P/ a: X" a, a/ k1 |8 g0 O
            videolink = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/@href'))$ g+ C( }7 _0 L5 l, H/ j
            title = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/text()'))& U; Z# N+ W2 y/ y- a7 ^% I
            playinfo = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/span/text()')).split("万")
    - |( |* h1 T* I& ?! y, A" y) Q: G        play = playinfo[0] + "万"% j6 L$ I; W2 i" d- O1 {2 ~
            comment = playinfo[1]
    + o; i8 A1 ~# R) i- t+ m" G        if comment.isdigit() == False:
    ' O8 ~( H# `5 _% M3 O6 |, |            comment += "万"7 P) ~8 Q; f& l9 K3 E9 S8 J8 u
            upname = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/span/text()'))+ Z0 F4 h' b5 I8 Z5 j& e4 Q
            uplink = "http:" + "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/@href'))
    2 x" Q& T; t1 N  t& X! O        hot = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="pts"]/div/text()'))
    5 {  N4 d, {& }, l6 U        video_list.append({& o3 ~5 y: ^/ ~: m4 \
                'rank': rank,
    % C+ H: z5 D5 c7 R9 t            'videolink': videolink,& K( g! H; O" A2 G/ ~/ r( Y
                'title': title,+ E0 D# a1 t3 G
                'play': play,
    $ P% n/ n* ^' Z8 T  f            'comment': comment,
    # ~9 }8 Z7 V+ v+ X( p) {5 A; {, \            'upname': upname,
    # e+ [8 k* u+ n% M" \" e8 @( c            'uplink': uplink,# M' Q' f$ ^; y8 G" V
                 'hot': hot
    8 X# {- P. u- c( V        })5 s) S8 D, Y2 p  r) }/ W% ?
        return video_list: S# |; V3 S; h* e- A
    5 Y' ]8 ]: ]7 x+ i- C& J: e* U
    # 将爬取到的数据写入Excel表格" a; W5 p. s2 `& s8 K' i0 I
    def write_Excel(video_list):# y: T. ~4 R7 |# e% \$ _
        print("将b站热门视频信息导入到Excel表格:")4 r8 ]2 e8 T2 ], r* y
        workbook = xlwt.Workbook()  # 定义workbook% X" [; q, ?8 C! N0 a
        sheet = workbook.add_sheet('b站热门视频')  # 添加sheet, Z0 Z. ?6 |; T( p
        xstyle = xlwt.XFStyle()  # 实例化表格样式对象
    3 u5 Z8 n) U7 b; W0 m    xstyle.alignment.horz = 0x02  # 字体居中, \$ y8 `! c& n8 q9 ^
        xstyle.alignment.vert = 0x01  # 字体居中
    3 l0 v9 v) L$ N) M- G$ I    head = ['视频名', 'up主','排名', '热度','播放量','评论数']  # 表头
    ' R8 y9 y% U: `4 m    for h in range(len(head)):
    / k/ Z' G3 G/ q; J        sheet.write(0, h, head[h],xstyle)  # 把表头写到Excel里面去: N0 {% i' P3 W; j
        i = 1
    8 D" b( h" Z% \. _9 U1 ~9 N    for item in video_list:9 p6 u8 z" X$ G% K" ^) M
            # 向单元格(视频名)添加(该视频的)超链接$ q/ W* Q' {" p# l( Y# X7 b
            title_data = 'HYPERLINK("'+item["videolink"]+'";"'+item["title"]+'")'  # 设置超链接% _- b+ f* ]3 L6 R3 @' L  w
            sheet.col(0).width = int(256 * len(title_data) * 3/5)   # 设置列宽  p4 ]1 i# o% W5 Y/ A- }- b4 D3 \" T
            sheet.write(i, 0, xlwt.Formula(title_data), xstyle)
    % N9 A: D  @2 O. @, Q& q7 ?        name_data = 'HYPERLINK("' + item["uplink"] + '";"' + item["upname"] + '")'  # 设置超链接
    8 P4 r" h# s5 e) v4 Z# }/ S# c$ b        sheet.col(1).width = int(256 * len(title_data) * 3 / 10)
    ; Q& d/ i' h* C3 Y( I( i* j6 e3 I        sheet.write(i, 1, xlwt.Formula(name_data), xstyle)
    + c' ~2 D6 k2 [/ N) T3 Z7 h        sheet.write(i, 2, item['rank'], xstyle)
    , z' _1 q+ {. v& M+ @* L        sheet.write(i, 3, item['hot'], xstyle)
    / H% f! X  f5 l        sheet.write(i, 4, item['play'], xstyle)
    3 P3 l8 |% H% Q& a6 z        sheet.write(i, 5, item['comment'], xstyle)
    # j& {8 g: W( s$ X, G! q3 S        i += 1
    # A3 e# W5 r6 V/ p0 ~    # 如果文件存在,则将其删除
    , A6 Z9 _) U# T: c! `2 N, a5 K    if os.path.exists('D:/Test/b站热门视频信息.xls'):
    1 A; O# u7 L# `2 v        os.remove('D:/Test/b站热门视频信息.xls')3 x! `2 `$ Z8 m& E; x
        workbook.save('D:/Test/b站热门视频信息.xls')
    6 h* T  v4 H. N3 D    print('写入excel成功')
    ) a# @/ j; O" L# ^    print("文件位置:D:/Test/b站热门视频信息.xls"); O- N# n; k2 V6 d

    1 f$ m% ]6 X6 \8 s7 L# h+ I8 k( pif __name__ == '__main__':
    * N+ P, |. m+ C  m    video_list = []( D" R$ q5 S7 e4 A1 L
        write_Excel(spider(video_list))
    - J$ @) c  f+ {/ R  O. X# D9 I& G  {! `
    * {, V+ ]" s; ^- K( m
    9 z( x  w1 N! t' S& _

    8 H- c- I8 _- P
    9 m: m' j( P5 i' N
    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 08:41 , Processed in 0.465083 second(s), 54 queries .

    回顶部