QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 4465|回复: 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表格& O) w, q8 l! H  {
    效果图:
    1 o/ |& N* [, L& D 1.png
    1 m2 K' Y6 H( l& ^5 f1.工先利其事必先利器,首先我们得下载相应的库:6 y9 z- ]6 e" z/ [/ Q7 a
    pip install requests
    1 j' u" p; b  s6 x$ Lpip install lxml
    8 e6 G  L7 @9 z" g" Zpip install xlwt
    2 c* V( D  I1 a! H
    + ^2 b, B" k( [
    3 f& s$ s4 R7 w: Rrequests 向网页发送请求* P0 l0 W7 }9 n. o" s4 a
    lxml 处理xml文件(xpath)
      j) e) N9 P4 T1 l7 s. f5 r/ Cxlwt 对Excel做写入操作. I+ S: G2 }. l6 A" a* ^* m9 K
    2.爬取b站热门视频的信息:
    1 k  _9 f/ ]# r& q- y4 i' _  打开b站热门视频页面:1 H6 o$ ^3 H8 ]! j  b; D* R
    2.png ! D: F8 Q; G- k( N' @) U4 F; s
      按f12进入开发者选项,然后点击选中你要获取的页面信息,即可找到该信息在该HTML文件中的什么位置(这对我们用xpath获取元素属性和元素值很重要),例如:: B. C! ^+ F! }" M: `# B
    3.png # F- K5 d# \: u  |2 Q- @
    代码如下:3 b! |. E, N. W9 N# N7 j' d
    # 爬取b站热门视频信息
    ; v! q; O. l$ W! T7 [def spider(video_list):
    $ v4 y0 K" S/ B0 M8 u& k/ K/ o5 ]    url = 'https://www.bilibili.com/ranking?spm_id_from=333.851.b_7072696d61727950616765546162.3'& A7 Y5 ?" C9 d4 ?  w
        html_data = requests.get(url).text
    ( c/ R6 d4 A3 s    selector = html.fromstring(html_data)
    7 G9 |2 L4 d- b: X0 R    infolist = selector.xpath('//li[@class="rank-item"]')% b( K' J; u( v
        for item in infolist:
    ) Y( y" P$ t  a. X- m        rank = "".join(item.xpath('./div[@class="num"]/text()'))
      K, M* j2 N1 H" J0 c        videolink = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/@href'))2 |) u$ n+ f0 b9 F3 i. Q
            title = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/text()'))! I/ n) ^* D" N# r8 u1 H  Y
            playinfo = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/span/text()')).split("万")
    ; b3 w4 T# z. I! A, |        play = playinfo[0] + "万"3 f$ L9 x8 s3 }5 l0 p0 U: [  j! Y
            comment = playinfo[1]
    / o- U( z5 r" B$ K8 i3 O* g) }$ G        if comment.isdigit() == False:0 }0 {' K: M+ X* \
                comment += "万"! a7 Z- ^% {" t% H$ b' C% {1 @( {3 {
            upname = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/span/text()'))
      H6 K" I8 B) V5 S7 g- d* M5 V        uplink = "http:" + "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/@href')). r( j0 ^% _. ~8 x
            hot = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="pts"]/div/text()'))
    % t& h5 n. I& f8 ?( d3 S, J        video_list.append({( [* t' U% T8 n4 T4 w  f8 [6 L/ V
                'rank': rank,
    ) n6 v* E, j% {0 e8 C2 y+ h2 K" X3 D            'videolink': videolink,8 C( K$ [9 P' X6 @7 w
                'title': title,1 Q5 f6 ~& H  m  J6 q7 l
                'play': play,
    4 ~9 O1 z0 [: n) a$ ]5 Q            'comment': comment,
    ! e; [1 _- i- O, T% n7 D( W3 j            'upname': upname,; y' {9 u' @" m
                'uplink': uplink,
    3 U, a+ `0 V  Y  g- K             'hot': hot
    0 ?3 D3 S- n; i5 z6 r. \4 q$ ?8 @        })1 G. H& b9 r& O0 ~* \( R2 [5 V3 T
        return video_list
    " L3 P* A6 T2 C5 F/ j
    - b4 `' J4 Y! ^. f1 N, ^% o
    7 {/ }- L% G+ Q4 A1 H8 r4 ~& T" |
    3.将我们拿到的信息集合(video_list)写入到Excel表格中:8 w8 J% n* u! i, C% |
      xlwt的基本使用方法:
    8 E, h+ }- `. z* b# himport xlwt1 Y9 ^3 Z- G: ]9 T+ B( N
    # 创建一个workbook (并设置编码)
    - G8 t, |, r1 c0 ~4 Wworkbook = xlwt.Workbook(encoding = 'utf-8')- T0 O- i1 w2 a0 J1 U" j
    # 创建一个worksheet/ I+ @+ T6 y- D. ^( z
    worksheet = workbook.add_sheet('My Worksheet')
    + M$ O/ Z# c2 y1 d! E: v) K5 v* N5 b6 s) O( ~
    # 写入excel
    ; m7 M' s2 {4 C9 M# 参数对应 行, 列, 值,(格式)
      h3 z; E( }, J8 i3 q& Sworksheet.write(1,0, label = 'this is test')
    " Y7 f' Y" v( e" q" g* B) i# 保存) m' [+ ~5 `, |7 V
    #参数为你保存该Excel文件的路径% D1 Z8 O4 j  Z9 G/ o% Q7 q
    workbook.save('Excel_test.xls')
    9 b3 w1 i. {: Q6 J+ M% d5 T: |& e! I$ n$ A; Z* z) y9 l

    0 C, m  W5 ]  A/ [( D4 y/ {5 }  如果我们想要点击视频名或者up的名字可以跳转,那么我们就要使用Excel表格的HYPERLINK方法:0 @/ J7 m: s* L
    HYPERLINK(“http://www.baidu.com” ; “百度”)
    2 U1 H: W6 m; \百度为显示在单元格的信息,而前面的链接为跳转链接。
    9 f4 c! U. `/ K4 ixlwt.Formula()方法需要传入一个字符串s,s=‘HYPERLINK(“http://www.baidu.com” ; “百度”)’。
    : E. `. C2 c4 Q8 o, N9 V: z代码如下:
    " W5 I6 V% _3 ^6 P# 将爬取到的数据写入Excel表格: i- B( r0 f: j. Z
    def write_Excel(video_list):
    # i' ~+ U2 W( @3 T" _. A0 X! L    print("将b站热门视频信息导入到Excel表格:")
    6 P8 {# H" ~4 O" V    workbook = xlwt.Workbook()  # 定义workbook
    : |- t! E' D" c! w6 K4 N    sheet = workbook.add_sheet('b站热门视频')  # 添加sheet# u4 ?$ K2 R/ ?5 A- ^
        xstyle = xlwt.XFStyle()  # 实例化表格样式对象5 T- M* }+ ^3 ?
        xstyle.alignment.horz = 0x02  # 字体居中  e* T2 ]' P/ V
        xstyle.alignment.vert = 0x01  # 字体居中3 N( G- `8 H1 h7 r" P
        head = ['视频名', 'up主','排名', '热度','播放量','评论数']  # 表头
    . {! _% w6 t1 m9 F* E  p. N% W    for h in range(len(head)):1 l/ z7 _( }% R1 s& z. ~# b* X5 x
            sheet.write(0, h, head[h],xstyle)  # 把表头写到Excel里面去1 t0 G, P! N# _+ U* k# N% e  K
        i = 18 L; N) Y( ?) B  Y
        for item in video_list:* n) L  |+ @) ^
            # 向单元格(视频名)添加(该视频的)超链接
    ; w7 H: W; L% [: R3 ^- q5 A        title_data = 'HYPERLINK("'+item["videolink"]+'";"'+item["title"]+'")'  # 设置超链接
    & R6 }5 `* I% O# j2 {# L) {        sheet.col(0).width = int(256 * len(title_data) * 3/5)   # 设置列宽2 f* y  T1 c& Q6 D1 b: Z/ ]
            sheet.write(i, 0, xlwt.Formula(title_data), xstyle)
    / n& b6 F5 p# t' Y5 b        name_data = 'HYPERLINK("' + item["uplink"] + '";"' + item["upname"] + '")'  # 设置超链接
    ; M# z$ i6 z* K6 P/ q+ C9 ]        sheet.col(1).width = int(256 * len(title_data) * 3 / 10)/ y. R8 P' E0 a# O
            sheet.write(i, 1, xlwt.Formula(name_data), xstyle)
    ! }( R- p8 j0 Y  I$ `& M/ ]        sheet.write(i, 2, item['rank'], xstyle)
    - \0 L# m9 v& q1 h- a        sheet.write(i, 3, item['hot'], xstyle)
    5 E$ [  @+ L) m! k7 w2 `        sheet.write(i, 4, item['play'], xstyle)* n8 X: r) R: h
            sheet.write(i, 5, item['comment'], xstyle)6 R4 t( E" V. S8 v$ L1 P4 g
            i += 1; m7 P  G9 J" r  n* Z; y/ X
        # 如果文件存在,则将其删除5 w  g5 ~$ a" n8 R
        if os.path.exists('D:/Test/b站热门视频信息.xls'):! N; x4 H2 D# _( D- h' p* E
            os.remove('D:/Test/b站热门视频信息.xls')
    . g& C1 B1 `5 T% t0 s) n8 m    workbook.save('D:/Test/b站热门视频信息.xls')
    - c  ]& T& j/ b    print('写入excel成功'): V) h2 |4 U1 ^- a# _! r3 K
        print("文件位置:D:/Test/b站热门视频信息.xls")
    1 |" H, l( t& T$ N- o- K. o0 t* ]8 j6 @  j0 L( f' e

    * j' d# \! ]7 l% {' T) ^) U4.在入口main中调用上面两个函数( a3 h+ C+ C* E7 U. R5 O- E
    完整代码如下:4 s8 V$ ^& j9 i' K# r# d* ?
    import requests
    $ N6 n( W. K: W" M4 Gfrom lxml import html9 g& a3 k$ V" h7 _! x
    import xlwt3 I8 l( x; n$ M9 l8 G
    import os: P5 a1 \0 b3 g& Z/ r% p* _2 c

    2 S* [' t/ F6 T8 T, g; E/ P: B' a# 爬取b站热门视频信息6 z4 y# {7 c$ z' U
    def spider(video_list):
    6 i/ b) q$ ^$ ~7 ]    url = 'https://www.bilibili.com/ranking?spm_id_from=333.851.b_7072696d61727950616765546162.3'/ s! P- g! s/ x( R
        html_data = requests.get(url).text
    % ]9 w# ^$ t+ C3 L    selector = html.fromstring(html_data)
    8 @; m4 |$ L/ c" c( m6 f    infolist = selector.xpath('//li[@class="rank-item"]')
    ( U  O' X  E; i% w8 l) ]/ A    for item in infolist:
    3 z2 N; Y/ R5 q- x        rank = "".join(item.xpath('./div[@class="num"]/text()'))
    ) p& Y, }* ?" E+ b' v: C        videolink = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/@href'))
    % O9 h0 E. x% p- G, ?3 n        title = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/text()')), \, d+ D  [# P0 c0 r
            playinfo = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/span/text()')).split("万")
      N8 c: x/ \5 V$ F$ N        play = playinfo[0] + "万"1 m/ }# D9 I- W' c5 }9 n, @
            comment = playinfo[1]/ G3 K/ y4 F+ ]) c( I3 v( \
            if comment.isdigit() == False:
    + Z3 P5 T/ m: D7 c. I* u) h: S            comment += "万"
    7 n; O+ i5 k7 r: M* v8 M4 _        upname = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/span/text()'))$ h; Y8 }4 ?1 U" J
            uplink = "http:" + "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/@href'))
    ; w) Z7 C* @9 B        hot = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="pts"]/div/text()')). V5 O( s5 R, f1 Y) |
            video_list.append({
    3 W2 V# I  d- O  _& q/ x7 t6 v, q7 A            'rank': rank,
    1 q1 I3 Q/ E2 w! n0 ?3 i/ R- i& ~            'videolink': videolink,3 }0 n% Y3 k6 e/ Y% H
                'title': title," L8 y; |( ?; i- |% z
                'play': play,5 i, J. p- }- r4 f& B4 \1 T2 Q7 _- ]
                'comment': comment,
    . i4 v+ f! Y) m! `' |            'upname': upname,3 U9 W) r' W0 V3 R; l+ Q
                'uplink': uplink,8 N4 E1 t/ u, o" O
                 'hot': hot$ H$ p5 _6 \% Q) d0 j
            })
    , A) M8 S; ~" W: q- B9 B    return video_list0 j/ d2 L2 R8 C1 d, ~0 r0 x

    1 P( I; ~* ?( }1 f$ c# 将爬取到的数据写入Excel表格1 l+ X& y" Q3 D; L1 u) _
    def write_Excel(video_list):) W4 T" \( ?" E, @
        print("将b站热门视频信息导入到Excel表格:")" d" `. k  y, E! X9 l) U( [
        workbook = xlwt.Workbook()  # 定义workbook
    ) z: ^. m$ ^! V( G" T+ a    sheet = workbook.add_sheet('b站热门视频')  # 添加sheet. C& T" ~) b+ f$ `$ b* U) K
        xstyle = xlwt.XFStyle()  # 实例化表格样式对象
    # B' F$ J# a, w3 g- |    xstyle.alignment.horz = 0x02  # 字体居中
    + {2 |3 V# S1 |. i7 W5 t5 {# c% L6 i    xstyle.alignment.vert = 0x01  # 字体居中! v" n" `4 C  E6 V8 s5 H2 E
        head = ['视频名', 'up主','排名', '热度','播放量','评论数']  # 表头
    % v' V9 R" S5 l    for h in range(len(head)):
    % |2 i' @9 e4 O$ S        sheet.write(0, h, head[h],xstyle)  # 把表头写到Excel里面去' W7 ]! i) [1 ?
        i = 1) L( X, m, O9 k# @+ O1 I. ]
        for item in video_list:" c' s' ^1 m* p& [7 w7 m- {9 d
            # 向单元格(视频名)添加(该视频的)超链接) Q& E! o  N1 \( P/ ?" L8 i1 J5 @
            title_data = 'HYPERLINK("'+item["videolink"]+'";"'+item["title"]+'")'  # 设置超链接* \$ b: Q' Y9 K# @$ L) E7 e& }, w
            sheet.col(0).width = int(256 * len(title_data) * 3/5)   # 设置列宽
    " R! D+ ]0 Z/ H' ~& H        sheet.write(i, 0, xlwt.Formula(title_data), xstyle)
    8 ?6 U% y- ^$ _5 P        name_data = 'HYPERLINK("' + item["uplink"] + '";"' + item["upname"] + '")'  # 设置超链接( m$ P& W$ w$ [; d9 |) v
            sheet.col(1).width = int(256 * len(title_data) * 3 / 10)5 j3 ?6 Y; ]8 I& [) i: Z
            sheet.write(i, 1, xlwt.Formula(name_data), xstyle)
    . _( w! f- w4 r( @7 e        sheet.write(i, 2, item['rank'], xstyle)
    8 i0 n' ]! \  P6 P9 W6 c( u3 s7 Q        sheet.write(i, 3, item['hot'], xstyle)1 d# O9 w# k. W' C- Z: C
            sheet.write(i, 4, item['play'], xstyle)0 @6 |8 S; K1 X; T
            sheet.write(i, 5, item['comment'], xstyle)
    - ^4 v) C0 z' C  ~        i += 1
    3 Z8 g& y# s8 h5 ]* M    # 如果文件存在,则将其删除7 A7 q' t  j8 Q4 V
        if os.path.exists('D:/Test/b站热门视频信息.xls'):, D( p0 b& E( G' Z- V9 f
            os.remove('D:/Test/b站热门视频信息.xls')3 A# p* E/ N* |2 g; B8 C
        workbook.save('D:/Test/b站热门视频信息.xls')
    " H" i, c9 a3 |# t- e! n! P) d    print('写入excel成功')4 Q, v' a4 ~4 ]5 K+ l8 B3 Y1 U
        print("文件位置:D:/Test/b站热门视频信息.xls")9 D: A6 F) T5 E/ {5 Z
    8 Y) h2 q2 M' D' W: [6 P: K- M! Z$ k" g
    if __name__ == '__main__':
    7 v. A5 ]# \; e3 W$ S/ b3 I    video_list = []7 c/ G. G. D: |* m3 s
        write_Excel(spider(video_list))
    ) W4 Z  a1 r" ]" v; R( o8 l' F. z9 A) J' S

    ) I5 N( E- f# I* |7 i3 Z: t
    " O& ~" K$ R8 ?$ H8 L' d1 ^
    / x3 V; r7 \  q/ Y) K- \
    0 G/ a* D7 l" P$ _& u- w# _
    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-1 14:43 , Processed in 0.460770 second(s), 55 queries .

    回顶部