QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 2036|回复: 0
打印 上一主题 下一主题

Python 爬取b站热门视频信息并导入Excel表格

[复制链接]
字体大小: 正常 放大
杨利霞        

5250

主题

81

听众

16万

积分

  • 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表格, l) {; I; f  U- D
    效果图:
    4 Y- y% ?/ t1 f9 @  N 1.png 2 ]- a% \5 I6 L% b5 B! ?& s2 [
    1.工先利其事必先利器,首先我们得下载相应的库:; K% ?' B+ Y5 _" H0 d
    pip install requests
    1 K& ^. t" a# r9 g* X" ]$ fpip install lxml
    ( u( K3 R/ E( B6 \$ T, upip install xlwt
    ( f; o$ v7 {+ q7 S$ n% O9 y
    0 `* u: ?+ J$ w9 T1 O
    $ H) T2 s) N- Jrequests 向网页发送请求' e# \3 s  @/ d: p  x  Y4 \
    lxml 处理xml文件(xpath)9 }7 J/ E; [& c$ m3 u1 h
    xlwt 对Excel做写入操作: j2 V/ Q) |6 T1 K8 N. x3 a
    2.爬取b站热门视频的信息:5 k# u: O! N) n0 E5 y& U3 B( v
      打开b站热门视频页面:8 ~( F9 i7 {6 i
    2.png 3 |% T; n* `6 N
      按f12进入开发者选项,然后点击选中你要获取的页面信息,即可找到该信息在该HTML文件中的什么位置(这对我们用xpath获取元素属性和元素值很重要),例如:
    " S2 A% {; p5 g) A. {& E 3.png ) G5 [; j& z4 F4 }6 j( i
    代码如下:& E( m1 X2 b  H/ d
    # 爬取b站热门视频信息8 X* U0 |. S1 f. a( c0 p% k
    def spider(video_list):
    # e( T2 R* k+ Q1 W7 A    url = 'https://www.bilibili.com/ranking?spm_id_from=333.851.b_7072696d61727950616765546162.3'
      v# _1 C! v- E  F7 a1 e9 N    html_data = requests.get(url).text
    8 h7 B" I( j9 a* J# Q    selector = html.fromstring(html_data)9 L$ }2 i- d0 G1 V8 V# C
        infolist = selector.xpath('//li[@class="rank-item"]')6 R) H8 u+ W+ }* o4 D
        for item in infolist:/ j3 P( K# i0 A! n7 n
            rank = "".join(item.xpath('./div[@class="num"]/text()')): k3 B# `) b, O$ H2 g
            videolink = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/@href'))& r2 s; ^& z; [) f5 V
            title = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/text()'))) U; f6 S- J1 L
            playinfo = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/span/text()')).split("万")3 T% l6 N1 x; G2 W% g
            play = playinfo[0] + "万"
    $ ?# d2 g/ Z/ O( x% ~4 F7 X        comment = playinfo[1]
    % l0 Y2 R# Z0 F1 b1 c* {, Y        if comment.isdigit() == False:
    ! L4 U  P- l* z" `& m            comment += "万"4 ~% z; [/ b$ G1 R* ]3 `
            upname = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/span/text()'))
    5 `9 w' v4 U: y! m        uplink = "http:" + "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/@href'))
    5 {# j: g/ j$ R; r! f. Z2 z        hot = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="pts"]/div/text()'))
    2 c2 g8 \' j2 N! ~( |        video_list.append({
    / ^) d  ?8 a& L% P9 F- {' Q            'rank': rank,
    , Z' V" I# n5 R2 _) {" Q, s5 Z4 M: T0 b            'videolink': videolink,& U) f& t. X8 y. z* ^" M$ h& a! H
                'title': title,  V4 \! h: K3 {3 K0 w( Q
                'play': play,
    " |/ E) t- r2 k" \; j( a1 Q            'comment': comment,
    0 S2 G3 J* \$ R            'upname': upname,' _5 G/ j5 E5 @2 ~
                'uplink': uplink,5 f$ w& ?/ D7 a" |4 c2 Z
                 'hot': hot4 t) t* k) x1 x) X3 H
            }): ^. v6 m+ N9 `
        return video_list1 E& G- I7 i$ J8 O) s3 J$ }! N
    $ u- s# m; }3 q4 ]+ B2 D$ _( n
    , ^  @, p9 |' l9 b9 w) x
    3.将我们拿到的信息集合(video_list)写入到Excel表格中:
    ; I- r3 e+ z2 h9 Z0 x  xlwt的基本使用方法:
    . @1 z- \2 t+ M5 ^4 fimport xlwt" ~( U5 G' Y9 q/ C
    # 创建一个workbook (并设置编码)* L# g4 K6 G  A; H6 Z
    workbook = xlwt.Workbook(encoding = 'utf-8')
    : u/ W6 O* q' g( d# 创建一个worksheet
    6 p( }1 W; J6 b3 gworksheet = workbook.add_sheet('My Worksheet')
    % A4 s' @0 h& ~& |2 s, j5 K1 O+ `
    # 写入excel' O  m0 q0 o& O- v. d
    # 参数对应 行, 列, 值,(格式)
    - U' X! f* g9 _4 {2 @  ]worksheet.write(1,0, label = 'this is test')5 h: L8 Q( Q( @5 c2 E
    # 保存
    9 U6 D: D/ r  g+ m#参数为你保存该Excel文件的路径
    - G3 ]5 _- x/ K( h5 aworkbook.save('Excel_test.xls')
    5 J# s8 A- X: k* Z
    8 r: ^6 H% z% A" E
    / `" O9 J" |& T  如果我们想要点击视频名或者up的名字可以跳转,那么我们就要使用Excel表格的HYPERLINK方法:
    : }. v$ A& {/ }: VHYPERLINK(“http://www.baidu.com” ; “百度”)
    2 `. a7 P" o9 o( r& Z2 M! L2 [百度为显示在单元格的信息,而前面的链接为跳转链接。
    " r' R( a3 d5 Z2 x4 {/ Dxlwt.Formula()方法需要传入一个字符串s,s=‘HYPERLINK(“http://www.baidu.com” ; “百度”)’。0 \- p# q$ X$ S8 z
    代码如下:  j7 }$ H+ Z& A$ T, f' m
    # 将爬取到的数据写入Excel表格
    . Z. o5 O# X* }! a- @7 p2 I( I$ Z8 [def write_Excel(video_list):
    8 z5 _+ `3 H) d: H3 k    print("将b站热门视频信息导入到Excel表格:"). a' ]# Y' {8 I% z
        workbook = xlwt.Workbook()  # 定义workbook
    ; i- ]( I6 r$ d" o; g. x$ O' ~    sheet = workbook.add_sheet('b站热门视频')  # 添加sheet
    " E2 V0 S; k6 l* J! v# B8 @; o* V( A    xstyle = xlwt.XFStyle()  # 实例化表格样式对象
    % a1 m7 `6 m+ r    xstyle.alignment.horz = 0x02  # 字体居中, P- W3 r) W1 U' z8 }- I$ {# b
        xstyle.alignment.vert = 0x01  # 字体居中
    7 {3 ]$ W; y+ X: z; n0 k- l    head = ['视频名', 'up主','排名', '热度','播放量','评论数']  # 表头5 H- M5 }& L) ?0 T4 k7 Z" y
        for h in range(len(head)):
    + f$ e! Q5 E- e+ W, |7 J        sheet.write(0, h, head[h],xstyle)  # 把表头写到Excel里面去
    & ]6 p" S4 Z; e/ u" y    i = 1
    / T5 }$ q  F$ u- D" C4 F2 k& |- F    for item in video_list:
    7 s- @+ c+ O4 _7 Q* f        # 向单元格(视频名)添加(该视频的)超链接7 B- M+ @! S( L3 G0 d' C( L/ M
            title_data = 'HYPERLINK("'+item["videolink"]+'";"'+item["title"]+'")'  # 设置超链接
    2 m% Y: Y% ~7 D4 S        sheet.col(0).width = int(256 * len(title_data) * 3/5)   # 设置列宽& ~$ k& [1 {/ O- X0 x$ o
            sheet.write(i, 0, xlwt.Formula(title_data), xstyle). s% C8 n$ {4 l( ^
            name_data = 'HYPERLINK("' + item["uplink"] + '";"' + item["upname"] + '")'  # 设置超链接$ Q, j5 y# f. I( @& ?' B
            sheet.col(1).width = int(256 * len(title_data) * 3 / 10); v: v3 W% G8 Y& H' }8 t
            sheet.write(i, 1, xlwt.Formula(name_data), xstyle)4 M6 W1 N* y' R/ T
            sheet.write(i, 2, item['rank'], xstyle)
    ; D! k) y1 P; E0 O        sheet.write(i, 3, item['hot'], xstyle)
    , @* I. i0 K' \+ y4 N. w9 Z        sheet.write(i, 4, item['play'], xstyle)
    & F  V5 W& W  ]        sheet.write(i, 5, item['comment'], xstyle)
    4 D2 g: ]+ Z3 P' r& L( t; s# Q        i += 1
    ( V8 \' D0 y$ J' v# H    # 如果文件存在,则将其删除0 g3 f& h  N- f) |6 _
        if os.path.exists('D:/Test/b站热门视频信息.xls'):
    4 ^, H9 {1 d. u9 K: i! \* \        os.remove('D:/Test/b站热门视频信息.xls')
    ! V" o/ J) X) L, u    workbook.save('D:/Test/b站热门视频信息.xls'), V# I, @" G' I, V  R& g
        print('写入excel成功')$ Q% b. }1 u8 K9 X5 Y
        print("文件位置:D:/Test/b站热门视频信息.xls")
    ' H2 h9 u, C5 H+ i5 r9 q
    & b/ p$ ]% y( Z4 N3 M4 u8 e1 H% r8 D& ]. }1 g
    4.在入口main中调用上面两个函数
    9 B9 X0 J; {) l完整代码如下:7 q5 q. O7 v; \& O( ^
    import requests
    1 |  z5 Y1 z- N( Kfrom lxml import html
    9 O3 u  C7 t; I8 W2 c- A1 F# vimport xlwt) S  o/ p7 Q4 A3 U' t0 H5 D
    import os. z. P/ Q& Y  `2 M) k& V

    9 T  q0 C( y5 T# 爬取b站热门视频信息
    ' P: N0 x8 I6 M( v6 Jdef spider(video_list):0 v0 v, H9 o/ I' l1 H' j3 U
        url = 'https://www.bilibili.com/ranking?spm_id_from=333.851.b_7072696d61727950616765546162.3') _% o3 F$ d  W0 W
        html_data = requests.get(url).text9 {6 g7 v: e% Q- t
        selector = html.fromstring(html_data)
    $ \, r/ {, q; i" B# X4 F, c% z    infolist = selector.xpath('//li[@class="rank-item"]')
    , K, o' W4 Q/ M( o    for item in infolist:( u* v3 U1 i0 f' Z. Z' M
            rank = "".join(item.xpath('./div[@class="num"]/text()'))
    ) V2 d' y8 U0 ^, \4 [# I2 q! T        videolink = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/@href'))
    ) F, n) M( Y' c; Y+ Q* x        title = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/text()'))
    % n' ~  t. w' Y  @: x9 v        playinfo = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/span/text()')).split("万")
    - S3 i. g4 \1 e: ?# u! y  H9 U' K        play = playinfo[0] + "万"
    2 z1 Z$ K+ q) k5 g2 d' H        comment = playinfo[1]% `+ n( O$ q1 o" n+ `: |* f
            if comment.isdigit() == False:
    ) N6 j' e9 I' E  f6 B; u            comment += "万". _8 ^$ v, z: I- {9 \. M
            upname = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/span/text()')): q  b' k, T: s1 m. l! V
            uplink = "http:" + "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/@href'))
    $ v; I3 e+ n2 P6 M7 y* J        hot = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="pts"]/div/text()'))
    : k$ B2 c& x) S. H7 A9 ^# K5 f3 ?        video_list.append({
    * c% Y( f& y9 ~) j# J7 q% F, M            'rank': rank,
    / X9 d5 r7 Q# C, H            'videolink': videolink,, M4 |( D: u2 ~& |. h* m# F
                'title': title,. `) I6 C( k% D& a
                'play': play,
    * l. h. ^4 R! l5 B2 W1 k            'comment': comment,
      @8 E. R: u2 v8 q  ^# P            'upname': upname,
    , Y& R3 H4 w# u0 D. W- j1 K5 o            'uplink': uplink,
    " Q, B% n8 f& P# q  Q             'hot': hot
    : f; \, O- Q. Q3 i5 S        })+ I5 E/ N# {7 I0 l
        return video_list
    5 x; d$ `6 P) M0 p% M$ Y* [1 t7 I* e& f' i' @+ c0 D
    # 将爬取到的数据写入Excel表格# s+ `" \4 p% j5 n- \4 }
    def write_Excel(video_list):8 ~, N2 Q4 O2 K4 Y5 J
        print("将b站热门视频信息导入到Excel表格:")9 k7 |7 V$ l, E+ S  r$ ^
        workbook = xlwt.Workbook()  # 定义workbook6 y- D0 F/ f! e' C8 C' L
        sheet = workbook.add_sheet('b站热门视频')  # 添加sheet6 G0 [& ~1 e. X9 y; |! L
        xstyle = xlwt.XFStyle()  # 实例化表格样式对象# t- k0 a9 \3 ?, E4 l5 m4 i4 m, k
        xstyle.alignment.horz = 0x02  # 字体居中
    2 d/ q9 P2 R4 ?9 A6 N+ ~    xstyle.alignment.vert = 0x01  # 字体居中
    - A' u6 n2 F, \% G4 Y% W- v    head = ['视频名', 'up主','排名', '热度','播放量','评论数']  # 表头& e* i/ W: S+ e. K' J6 A5 Q
        for h in range(len(head)):) A+ }, S6 e3 }3 s( g
            sheet.write(0, h, head[h],xstyle)  # 把表头写到Excel里面去
    - P5 x6 @! b3 {3 B    i = 14 ~( N" s* i7 h0 c
        for item in video_list:
    $ |: f" K6 v( \: y8 W0 u  B  V7 G        # 向单元格(视频名)添加(该视频的)超链接9 S( u. v( N: M5 W' z- c1 s) [
            title_data = 'HYPERLINK("'+item["videolink"]+'";"'+item["title"]+'")'  # 设置超链接$ A% O4 r5 a8 g$ r1 Z
            sheet.col(0).width = int(256 * len(title_data) * 3/5)   # 设置列宽3 ?7 E8 _+ g& ?9 F+ [9 o- j
            sheet.write(i, 0, xlwt.Formula(title_data), xstyle)
    8 K6 X  K& c( y* l( ^- B# f        name_data = 'HYPERLINK("' + item["uplink"] + '";"' + item["upname"] + '")'  # 设置超链接" _7 M: N- x! a% b* C
            sheet.col(1).width = int(256 * len(title_data) * 3 / 10)+ J- l# r; q' D1 p" F4 X& D
            sheet.write(i, 1, xlwt.Formula(name_data), xstyle)# k+ l. S- Q  Z
            sheet.write(i, 2, item['rank'], xstyle)
      d: ?) D: h9 @& L$ ^* b        sheet.write(i, 3, item['hot'], xstyle)
    , z- d4 w2 U2 z* k; U7 E        sheet.write(i, 4, item['play'], xstyle)3 a4 {! D5 ^4 H
            sheet.write(i, 5, item['comment'], xstyle)
    / m" m) u0 C: u4 J        i += 12 y! j6 @7 C) |6 o- s" M1 }
        # 如果文件存在,则将其删除$ ^) R% z+ w: e1 o& W5 `
        if os.path.exists('D:/Test/b站热门视频信息.xls'):
    3 }6 f' o4 f0 T; P        os.remove('D:/Test/b站热门视频信息.xls')  a" ?7 F  k8 E3 i. |/ S
        workbook.save('D:/Test/b站热门视频信息.xls')
    5 J; S- d3 n: Z2 v    print('写入excel成功')6 Y% a! r9 g2 k. V$ x
        print("文件位置:D:/Test/b站热门视频信息.xls"), U% V. ~& D& k* u% Q
    $ Q% C( t, w5 p) j& G' z6 m
    if __name__ == '__main__':- @; ?5 }/ R4 ]! t' S) x$ T
        video_list = []
    % M7 F, `% ^, A; `' t% W    write_Excel(spider(video_list))* {4 d7 ?% ~2 e& Z) i( b: Q7 {# J6 e1 y
    - w2 X7 H% q5 T% T! h/ J0 v
    - y+ P3 b6 \  r

    # @' C) Z% A% S
    ) ?, r; E! f# l: D# L, ^
    ' {! E$ A& |8 p- r
    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, 2024-4-19 22:57 , Processed in 0.503262 second(s), 53 queries .

    回顶部