QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 4411|回复: 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表格% d0 y" ^8 i* b, E! K
    效果图:
    / R* i0 {8 }1 P, C 1.png 3 k# Y1 a6 d: a
    1.工先利其事必先利器,首先我们得下载相应的库:' L* b  h& W5 k7 e
    pip install requests
    7 p% W" ]9 G5 O1 O' U: ?: [. [pip install lxml9 {7 ^# E6 c) i. F2 U! W/ f! y
    pip install xlwt  m2 h$ n# R. _; Q3 Z( S
    ; \+ k! M3 Y* u7 C0 f

    & O# @! t. i9 P% x* X) K5 M5 _requests 向网页发送请求" T$ f( x$ k/ f) Q) @# a
    lxml 处理xml文件(xpath)
    9 P8 e5 T9 x9 C1 Q* d2 j. X) M4 Axlwt 对Excel做写入操作) w7 G' I5 x& y) p
    2.爬取b站热门视频的信息:
    % c; W" p0 I) t% u  打开b站热门视频页面:
    2 [6 f( p' ?" ]# c1 W1 K4 o 2.png
    + k$ k$ F3 e0 v  按f12进入开发者选项,然后点击选中你要获取的页面信息,即可找到该信息在该HTML文件中的什么位置(这对我们用xpath获取元素属性和元素值很重要),例如:
    / {6 B6 J: K  x 3.png   H  N  q9 A* ~- f" w
    代码如下:
    6 a6 o& n! |# W; X# 爬取b站热门视频信息
    7 f( B: [& f5 u$ U# C/ `def spider(video_list):
    ) \8 @+ d. K) z2 I' r! d- P    url = 'https://www.bilibili.com/ranking?spm_id_from=333.851.b_7072696d61727950616765546162.3'
    4 t, A! u3 L- ?; M3 }# ?    html_data = requests.get(url).text
    8 O# E. @! Z  Z% c+ Y3 u    selector = html.fromstring(html_data)
    ! k- I, m  }1 U8 E; c    infolist = selector.xpath('//li[@class="rank-item"]')
    4 x( m7 i- ]4 c    for item in infolist:
    - `+ V4 P, }) p, R! \        rank = "".join(item.xpath('./div[@class="num"]/text()'))3 c$ d* X: L( k  U: ~
            videolink = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/@href'))- e8 P+ W  J$ w0 D6 V6 \7 F1 c  z
            title = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/text()'))
    1 Y. T3 L0 d8 i3 K( U9 f# N% E# V        playinfo = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/span/text()')).split("万")* {5 M- T5 g# {5 ^3 S0 ~1 Q. |. X
            play = playinfo[0] + "万"9 o4 s0 `9 W6 x& O5 d/ c
            comment = playinfo[1]- Z7 H& }6 ]3 G% ]5 q0 I' [
            if comment.isdigit() == False:' m, k9 w* e4 `  t
                comment += "万"
    ' n! c8 i3 G1 r, @. {        upname = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/span/text()'))
    . w& X! u) m2 b9 ~* N' V7 b        uplink = "http:" + "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/@href')): r+ Q7 [2 U/ W5 Z/ {( }) L* ~
            hot = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="pts"]/div/text()'))3 O! |& V* o5 g+ ?/ x3 D
            video_list.append({, K4 }, x" E3 B2 R* U& c9 ?/ U* j, D
                'rank': rank,
    4 O" k5 P* }8 R# H9 x4 L            'videolink': videolink,
    2 P1 m- ]- J+ o0 T% ^            'title': title,2 ]% R, U- N( K
                'play': play," h: w7 K: q5 S/ b
                'comment': comment,' x4 h, W6 b6 T
                'upname': upname,
    ( l- _' x  O$ g' h; u            'uplink': uplink,$ I+ b- C3 @# ]
                 'hot': hot
    2 S2 p0 ]$ I: N% G( `        })
    - e/ @6 T7 o+ ]: K: k1 U8 n( W    return video_list
    2 _( a5 u, v3 s- q
    ; @* _* O* y6 ?" e
    9 p; \+ V9 r3 ~5 q
    3.将我们拿到的信息集合(video_list)写入到Excel表格中:
    % s$ F0 ?3 y" U8 T7 \9 P/ n: p  xlwt的基本使用方法:+ F( u0 Z  T3 t1 L3 [
    import xlwt
      w) g, L8 F9 y5 e# 创建一个workbook (并设置编码)5 d% ~4 {% P7 i" @7 g# H% a
    workbook = xlwt.Workbook(encoding = 'utf-8')1 D+ _* b! h3 p0 m4 P& D
    # 创建一个worksheet
    ; V* n9 K7 ~  E8 F5 Y% M0 l( o, wworksheet = workbook.add_sheet('My Worksheet')
    0 T2 V0 h4 L6 S/ H) N2 O6 J
    8 ^; j& m, b6 f1 J2 y- g0 I# 写入excel
    0 }; v! w- C; [# 参数对应 行, 列, 值,(格式)( @" u$ D6 M  {: V' D$ B( o
    worksheet.write(1,0, label = 'this is test')& Q  A1 e/ v& @( O
    # 保存
    ) p( h( s$ i0 w$ p) ?#参数为你保存该Excel文件的路径7 ]$ M6 p/ y( m+ v7 N3 p
    workbook.save('Excel_test.xls')
    & ?* l9 a/ Z. s# Z. B+ a! q! N
    % d/ H, {, b$ W) M( A, y
    7 M& i+ J0 O) }2 X) k  如果我们想要点击视频名或者up的名字可以跳转,那么我们就要使用Excel表格的HYPERLINK方法:
    8 T3 q+ u; n+ T& ]; rHYPERLINK(“http://www.baidu.com” ; “百度”). F$ r6 L' A( F2 N; {; C- @
    百度为显示在单元格的信息,而前面的链接为跳转链接。) a: @7 q1 p; m4 S
    xlwt.Formula()方法需要传入一个字符串s,s=‘HYPERLINK(“http://www.baidu.com” ; “百度”)’。
    2 ~' |- A4 m# {" \2 T" k% U代码如下:
    # U0 r2 a) u! Z% d5 i# 将爬取到的数据写入Excel表格
    0 ]3 S1 y6 p1 idef write_Excel(video_list):- H! ?9 \0 J3 U  I3 l  Z1 W5 e0 |6 @
        print("将b站热门视频信息导入到Excel表格:")0 @' C* p" p$ g9 i6 m2 U
        workbook = xlwt.Workbook()  # 定义workbook6 o0 N$ r. H/ x, {/ |
        sheet = workbook.add_sheet('b站热门视频')  # 添加sheet8 e4 @. \* r! _
        xstyle = xlwt.XFStyle()  # 实例化表格样式对象
    / K/ q# A- j6 a0 p$ c5 b    xstyle.alignment.horz = 0x02  # 字体居中& G! h* |- x# S- z( e: M4 F
        xstyle.alignment.vert = 0x01  # 字体居中
    9 i# D) {. [8 u) H' H+ ]0 R- R; t$ d" J    head = ['视频名', 'up主','排名', '热度','播放量','评论数']  # 表头! N2 }2 O  [1 D) R* w
        for h in range(len(head)):; D7 \& B( b! ^3 n! [3 R
            sheet.write(0, h, head[h],xstyle)  # 把表头写到Excel里面去! [# E# G& A3 v" }
        i = 1
    " E' b; G1 H2 z; Y    for item in video_list:
    & t5 l# x  v7 t* u8 W        # 向单元格(视频名)添加(该视频的)超链接
    & x: w( o) Y5 ^* G9 ]  P1 H        title_data = 'HYPERLINK("'+item["videolink"]+'";"'+item["title"]+'")'  # 设置超链接
    5 v4 s9 x7 l9 z1 P; f$ d        sheet.col(0).width = int(256 * len(title_data) * 3/5)   # 设置列宽# ]' m# P# E7 k& T( w
            sheet.write(i, 0, xlwt.Formula(title_data), xstyle)
    % y4 y" l. Z; p: A        name_data = 'HYPERLINK("' + item["uplink"] + '";"' + item["upname"] + '")'  # 设置超链接' H8 F) u: ?4 m  z3 _% h9 g3 E! u
            sheet.col(1).width = int(256 * len(title_data) * 3 / 10). B" i/ C/ E( P8 d7 G. J
            sheet.write(i, 1, xlwt.Formula(name_data), xstyle)- d- Q& v% j. {, e' T
            sheet.write(i, 2, item['rank'], xstyle)& f" ^8 l' R" m% |9 x: [. }2 b
            sheet.write(i, 3, item['hot'], xstyle)4 V; g, \/ w& d/ r
            sheet.write(i, 4, item['play'], xstyle)' w  J, Z) O3 K! v& f
            sheet.write(i, 5, item['comment'], xstyle)
    0 w7 A/ U# Z) H7 H        i += 1! G9 d" C  q. n4 M! k
        # 如果文件存在,则将其删除2 u. `) i  T4 o. d0 N* V9 Y
        if os.path.exists('D:/Test/b站热门视频信息.xls'):  x0 q" H4 o; z' i! X4 B$ E5 i* \1 N! o
            os.remove('D:/Test/b站热门视频信息.xls')5 D4 a6 D( T/ q
        workbook.save('D:/Test/b站热门视频信息.xls')( O6 X1 j1 e& n+ P; f9 |8 \
        print('写入excel成功')
    . f0 l4 r. H9 h* z8 B& A. t0 Y    print("文件位置:D:/Test/b站热门视频信息.xls")
    7 {5 t0 N8 d( [% Q
    2 p. e( \, a' Y6 \1 @; i; M
    8 h' D1 |( d! J4 h$ l  W1 {- S4.在入口main中调用上面两个函数
    3 d* f/ v, w/ A6 p完整代码如下:
    ! [4 u9 v+ p  s0 `; V, g# mimport requests: w3 @8 W" K! t. p/ E
    from lxml import html5 _( `% L( `2 g! e5 P( j) H! l
    import xlwt
    + {4 v$ N5 Z/ C/ M+ y2 N2 zimport os
    9 r: E0 e. ~# O% v; t
    , }6 n* P0 E# j4 C: y0 u( t# 爬取b站热门视频信息+ N5 D& w  m7 d' l' _3 c% q( p
    def spider(video_list):# D  H% h7 S- G  K, k
        url = 'https://www.bilibili.com/ranking?spm_id_from=333.851.b_7072696d61727950616765546162.3'; F  P/ ^, f! x9 x
        html_data = requests.get(url).text  X3 v% p& G$ x& S+ C
        selector = html.fromstring(html_data)
    0 v7 f7 I& u/ @. S) }& v+ y. Y. J    infolist = selector.xpath('//li[@class="rank-item"]')1 k- G: ~/ ?( a8 z' P8 V8 |
        for item in infolist:5 R6 A, u" g* B6 y. o1 b% L
            rank = "".join(item.xpath('./div[@class="num"]/text()'))# R* ]  _9 V  U+ r, h8 x" i  @$ L  v
            videolink = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/@href'))" J$ O2 b5 E/ S/ a3 L$ j8 I
            title = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/text()'))
    $ [; W. i" X' A  y% v        playinfo = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/span/text()')).split("万")
    ) G5 h: ]3 P9 u0 R, v" F9 I        play = playinfo[0] + "万"7 W/ L; S0 _# N( M  c6 ]
            comment = playinfo[1]1 Q* D3 ?, c+ O: b  u) k
            if comment.isdigit() == False:
    & p4 ^) G# h$ P. ^            comment += "万"6 i+ H2 T/ u' S1 W. ]0 X  t
            upname = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/span/text()')); I9 [- D. v8 ?& D
            uplink = "http:" + "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/@href'))
    ( H+ w2 y' f. C3 N4 C        hot = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="pts"]/div/text()'))
    0 s" @" Z9 o  T( q: E; I' ~        video_list.append({: d$ M2 Y9 P% r! |
                'rank': rank,
    . q" X$ m) v! q% p& [            'videolink': videolink,
    8 q/ i' V# s3 b9 O            'title': title,) ?" b' d  o8 `2 [, [7 W
                'play': play,
    ) s4 u, T2 [# j% n- F$ ?            'comment': comment,
    , c" i7 b( K% j# {1 m. g            'upname': upname,
    1 |9 F: X; B' [# v            'uplink': uplink,* f0 z2 ]; h! e1 @
                 'hot': hot# \: ]) S( b' G  k' b
            })4 w, x+ w. r6 T
        return video_list
    , M0 v) K6 I! }. ?2 m4 J$ _: v
    - m5 B1 J- f$ L# 将爬取到的数据写入Excel表格. ]7 Z8 c0 a" l6 b8 n. P( ~0 ?
    def write_Excel(video_list):
    ! e/ A1 q) y+ C7 ^4 T    print("将b站热门视频信息导入到Excel表格:")6 M2 _4 R+ l2 `( F, N0 x" l1 R
        workbook = xlwt.Workbook()  # 定义workbook* e3 s, c# H5 Y% }1 y$ h
        sheet = workbook.add_sheet('b站热门视频')  # 添加sheet; T% ]. Q) ~5 K7 U
        xstyle = xlwt.XFStyle()  # 实例化表格样式对象
    % ~7 k( @% ?' \1 Q/ n! ~    xstyle.alignment.horz = 0x02  # 字体居中# L0 v, `3 _. l
        xstyle.alignment.vert = 0x01  # 字体居中
    6 V, o' e3 e& r& T4 q8 e1 |$ b    head = ['视频名', 'up主','排名', '热度','播放量','评论数']  # 表头' b" J, p$ R" Q$ i7 B6 ]
        for h in range(len(head)):
    ! x  }& q6 A$ z2 O8 E        sheet.write(0, h, head[h],xstyle)  # 把表头写到Excel里面去
    % c# I7 V" N' b# ]    i = 1+ W& l( G0 E3 _
        for item in video_list:
    6 q; A/ m, Q* e6 U3 [        # 向单元格(视频名)添加(该视频的)超链接0 `, |- K) S1 e, y6 X& }
            title_data = 'HYPERLINK("'+item["videolink"]+'";"'+item["title"]+'")'  # 设置超链接6 d$ g% }  [- V- y  O( p. `
            sheet.col(0).width = int(256 * len(title_data) * 3/5)   # 设置列宽" A. t: L! V6 Z7 p% O- p4 f
            sheet.write(i, 0, xlwt.Formula(title_data), xstyle)1 I6 x, E3 ~4 w  M
            name_data = 'HYPERLINK("' + item["uplink"] + '";"' + item["upname"] + '")'  # 设置超链接
    & U2 ]4 U( @: T        sheet.col(1).width = int(256 * len(title_data) * 3 / 10)
    * q' _2 N  V4 C( i+ i5 s        sheet.write(i, 1, xlwt.Formula(name_data), xstyle)
      a7 G2 g: T$ `0 `" d9 N6 Z        sheet.write(i, 2, item['rank'], xstyle)
    9 Y) w1 F+ L% m        sheet.write(i, 3, item['hot'], xstyle)4 ]* e# o8 |7 I+ a" Z
            sheet.write(i, 4, item['play'], xstyle)
    ! R: x9 B: D5 l9 N# K        sheet.write(i, 5, item['comment'], xstyle)
    + W7 t: s% _' m4 r8 {2 O/ N0 f8 m9 H        i += 13 c# E8 k1 J: T) k# ?* F
        # 如果文件存在,则将其删除
    8 P& o) j# {5 x5 ^6 n    if os.path.exists('D:/Test/b站热门视频信息.xls'):
    2 g2 Y- u' \' |  j3 o, c+ M- J' S        os.remove('D:/Test/b站热门视频信息.xls')8 f, \: b$ E& ~5 S* w' c3 E
        workbook.save('D:/Test/b站热门视频信息.xls')
    $ m2 a& F" u4 Y7 y5 w* q    print('写入excel成功')
    5 x6 o. V) h, t    print("文件位置:D:/Test/b站热门视频信息.xls")
    7 V* h  I' ^5 _& S4 K; e1 x; K" d2 }' D2 `
    if __name__ == '__main__':' Z* `! Q, g6 ]3 G; Q! V* W
        video_list = []6 A8 Q9 x, D; L
        write_Excel(spider(video_list))4 K* s+ p. N, |9 Y
    / }0 p6 T) j8 o! H( ~% [

    : c, R" p9 v6 t6 h! V( V4 R
    ; [8 d  R6 O, ^  [: a; L! v4 u: o% K5 e  T* [/ U! i

    ; R; F3 O) Z, U3 m3 o, {
    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 06:57 , Processed in 0.354437 second(s), 53 queries .

    回顶部