QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 4432|回复: 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表格1 H, ~& q3 B, ?$ I0 J
    效果图:( G% q9 q& z' S3 n% |# o
    1.png # H3 g& J3 M  o8 d* l
    1.工先利其事必先利器,首先我们得下载相应的库:
    ) }6 \  Z4 v# |- q+ c9 ]+ j$ bpip install requests% D! s% c3 b$ J( G+ t  t! h
    pip install lxml: D# [9 e0 p' n* n! E# P# Q
    pip install xlwt& z/ ]3 }- x; g/ E8 l

    / J0 ^  Z) k1 Y6 D0 r9 G& ~5 P7 Q
    ; ]. t& J' B; g, O2 ]" vrequests 向网页发送请求# p+ R2 G6 M$ r) V$ r% j
    lxml 处理xml文件(xpath)
    % p! w& G; W  p% m. }" B, x9 }6 E, x! ixlwt 对Excel做写入操作
    $ X; N/ C* T* Y; a  j- \* G! _2.爬取b站热门视频的信息:8 v- |0 s; T) D
      打开b站热门视频页面:
    # I8 T. r# M5 O: [8 N5 I  F5 U! c 2.png
    " |+ \  R! z% E9 u& w0 t4 h1 x  按f12进入开发者选项,然后点击选中你要获取的页面信息,即可找到该信息在该HTML文件中的什么位置(这对我们用xpath获取元素属性和元素值很重要),例如:
    , g, B/ g! f9 h9 h' k 3.png
    5 G0 `$ z$ C4 J代码如下:
    ; F- R+ ~- H: H. y0 \# 爬取b站热门视频信息, J+ C1 B' t$ z
    def spider(video_list):5 [# e1 [: t+ ~6 g# x/ E7 a( Z
        url = 'https://www.bilibili.com/ranking?spm_id_from=333.851.b_7072696d61727950616765546162.3'8 ?. d8 ^" q! \
        html_data = requests.get(url).text
    , }  L: O& _/ o9 {$ z. Q    selector = html.fromstring(html_data)( ]# f" l$ r( Y5 g8 b2 _- |
        infolist = selector.xpath('//li[@class="rank-item"]')
    % J1 _* j# H  T, @# l    for item in infolist:; ]2 m! q5 h8 h0 r% P& D& u
            rank = "".join(item.xpath('./div[@class="num"]/text()'))8 u9 ?/ _  @8 {5 _) P* Q+ u
            videolink = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/@href'))
    9 b9 ~) J" e' H: X/ S) y        title = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/text()'))" j, n8 T+ J% K' S. \% x
            playinfo = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/span/text()')).split("万")
    # S' x( t$ w) g8 V" k# q0 u7 A        play = playinfo[0] + "万"5 o8 W0 a% H) P, W1 q# o9 Y- d
            comment = playinfo[1]+ m6 C4 k# v# p% X) F$ s) l
            if comment.isdigit() == False:$ k7 m: C/ |5 ^5 V
                comment += "万"7 ?- |. ^( Q* G. N
            upname = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/span/text()'))1 N4 }( [  E- R- e9 O
            uplink = "http:" + "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/@href'))
    # W, c% O8 Y4 N$ m8 ?) C        hot = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="pts"]/div/text()'))+ f. ]( j3 h( R2 w3 g3 i
            video_list.append({
    + Z1 _  m! s+ x7 ]$ h- `) D$ B            'rank': rank,
    ! R& a: ~$ m) O/ v# ?  r$ `. H# x            'videolink': videolink,1 V# I$ _" a) L: E
                'title': title,
    * Y: a" e# }' M- C; l            'play': play,
    2 G+ S, a5 n& E2 n* g            'comment': comment,4 m6 l4 @& k3 g8 M; ?& j
                'upname': upname,
    $ x7 a( K5 Z+ L            'uplink': uplink,
    % S/ T* z1 q0 Z+ d             'hot': hot
    7 _& @  Y1 b5 z$ |( A9 ^        })
    2 C) F8 ^8 X& p0 O' V6 M    return video_list
    & Y( V2 u6 g. E$ N* t! j; c! `# [2 E: f
    . G) `* p2 m* {  t
    3.将我们拿到的信息集合(video_list)写入到Excel表格中:4 @% l( C! V/ l4 C9 W
      xlwt的基本使用方法:
    2 L. t  C  `! Y0 {6 P$ Timport xlwt
    ' V8 j, g  q. k  P& I: c# 创建一个workbook (并设置编码)
    / h5 q( ]) S0 S4 y: x/ W2 Iworkbook = xlwt.Workbook(encoding = 'utf-8'). R, r# w* }7 X( i6 N" i
    # 创建一个worksheet7 {. \& y* o3 Q' j* B
    worksheet = workbook.add_sheet('My Worksheet')/ F1 u( ~4 }5 b( k% z
    , |5 b* l7 L, ?" }* w) T
    # 写入excel6 T; V( v6 A2 |/ q
    # 参数对应 行, 列, 值,(格式)
    % c" ~' P# q* b( Q- }worksheet.write(1,0, label = 'this is test')
    8 e9 ^- u9 D. N/ F# 保存: r1 T  e* B, ~% Z9 _
    #参数为你保存该Excel文件的路径
    , ~0 [4 h8 Q2 E2 Bworkbook.save('Excel_test.xls')  W" D* y9 l- q3 Y9 `
    2 [9 [$ H; T7 ~8 F  K$ g" \
    ( ]) a& v9 O! [
      如果我们想要点击视频名或者up的名字可以跳转,那么我们就要使用Excel表格的HYPERLINK方法:
    ) Z( _- T# F# O5 j9 i  M, z" F* AHYPERLINK(“http://www.baidu.com” ; “百度”)
    & V3 y' K. H* s. i4 m9 C9 o0 u4 s百度为显示在单元格的信息,而前面的链接为跳转链接。
    4 P- Y3 r( u4 I9 t& e- W% Bxlwt.Formula()方法需要传入一个字符串s,s=‘HYPERLINK(“http://www.baidu.com” ; “百度”)’。/ Q& I9 ^0 I, Z2 p
    代码如下:
    : ~- D. a' K. j! x& h# 将爬取到的数据写入Excel表格9 r9 {, g7 i6 j: }. p
    def write_Excel(video_list):( R- O+ i& a' D% u' _
        print("将b站热门视频信息导入到Excel表格:")6 N9 [& m( w) E9 s" F1 ~% r: v
        workbook = xlwt.Workbook()  # 定义workbook/ Z4 i' y( r# `! p) l
        sheet = workbook.add_sheet('b站热门视频')  # 添加sheet) o- M( W4 y+ N5 `& T, N: S
        xstyle = xlwt.XFStyle()  # 实例化表格样式对象
    # f# \: J* P- Q' u* H. ^1 C    xstyle.alignment.horz = 0x02  # 字体居中! _1 I6 T# ]2 L, V
        xstyle.alignment.vert = 0x01  # 字体居中2 G" F* H3 F# z) ~; |9 w
        head = ['视频名', 'up主','排名', '热度','播放量','评论数']  # 表头
    7 |2 B/ [% V+ p8 p* E    for h in range(len(head)):
    ) y$ H1 v( i/ c        sheet.write(0, h, head[h],xstyle)  # 把表头写到Excel里面去2 A- n& h, v: ~0 k+ g# e
        i = 1
    ' }) S0 ?/ ~( s: Z' Y. m    for item in video_list:9 W1 P9 m' M9 g- X2 ?
            # 向单元格(视频名)添加(该视频的)超链接9 T: o0 N/ e: }2 C; M9 @3 L' ?# ]
            title_data = 'HYPERLINK("'+item["videolink"]+'";"'+item["title"]+'")'  # 设置超链接1 f5 J; |( G1 p7 w0 |
            sheet.col(0).width = int(256 * len(title_data) * 3/5)   # 设置列宽
    ( Q$ ~" y6 n8 X. h+ P; L        sheet.write(i, 0, xlwt.Formula(title_data), xstyle)3 a) `; ?+ L$ a5 T& p) R6 z6 y
            name_data = 'HYPERLINK("' + item["uplink"] + '";"' + item["upname"] + '")'  # 设置超链接3 A! u. ]$ L7 v8 V4 h1 Y9 C
            sheet.col(1).width = int(256 * len(title_data) * 3 / 10)
    . S7 R+ o0 K, h+ D        sheet.write(i, 1, xlwt.Formula(name_data), xstyle)5 E/ K6 ?4 }4 h& W8 G* I
            sheet.write(i, 2, item['rank'], xstyle)
    ' f3 ?8 j6 O% o. Y! L) p        sheet.write(i, 3, item['hot'], xstyle)
    $ ~# g9 ?4 P: x        sheet.write(i, 4, item['play'], xstyle)
    1 b( [; \: {  g$ h  K% [9 s7 W/ r9 I        sheet.write(i, 5, item['comment'], xstyle)1 p6 p; P- r3 i& c7 j1 H3 A  s
            i += 1  _* V' h6 |  u) p) s* g
        # 如果文件存在,则将其删除
    9 b3 g$ J% @( d0 b( s% v7 T    if os.path.exists('D:/Test/b站热门视频信息.xls'):
    , d% D& C4 m* |, a: z        os.remove('D:/Test/b站热门视频信息.xls')
    7 M! a$ b" Z! P8 O' C- d+ X; _0 |$ X    workbook.save('D:/Test/b站热门视频信息.xls')
    - c! [1 D7 O% t* S! `    print('写入excel成功')) ?/ ]/ m# G5 E* ?1 A
        print("文件位置:D:/Test/b站热门视频信息.xls")
    ; p; Z3 Z* @2 _4 C/ R* D) c- k, y2 c8 \: |4 j% b& u, `- B0 \. Z
    + Z8 C; C# e0 l4 G  B0 B. s+ c0 p
    4.在入口main中调用上面两个函数
    + [* I. {  m, M7 K) i完整代码如下:, p5 w5 ?7 o2 W
    import requests9 m; {) u* x7 k+ [
    from lxml import html, e4 V( \1 |8 J! p
    import xlwt
    " M" j) F& e9 Aimport os
    - [* x5 n) T" M1 I1 a$ x# }
    9 T4 F( U- W8 |# 爬取b站热门视频信息
    ; N1 H3 R( ^4 ~% t  y/ w& _def spider(video_list):& B7 C% p, R$ y  E
        url = 'https://www.bilibili.com/ranking?spm_id_from=333.851.b_7072696d61727950616765546162.3'
    3 k. Y8 Z& H- B6 l& z    html_data = requests.get(url).text# ~- _6 n$ R1 Y" e5 P
        selector = html.fromstring(html_data), _* F% I1 B% n
        infolist = selector.xpath('//li[@class="rank-item"]')& V8 `  {1 D' D. G* [
        for item in infolist:
    ! _/ @1 [& w1 z        rank = "".join(item.xpath('./div[@class="num"]/text()'))' Y" c) z* r2 Q( a1 B, n* x
            videolink = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/@href'))
    3 ?+ m* l; J( p: i' G        title = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/text()'))+ s9 n( v7 L* Q% P3 E
            playinfo = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/span/text()')).split("万")* u" l# U3 f( g* N
            play = playinfo[0] + "万"
    % w" \+ I' M3 R& E# b        comment = playinfo[1]4 _, O; t/ n2 E
            if comment.isdigit() == False:
    7 d+ }# ~* r, f3 x3 B+ w% J            comment += "万"& t; t2 G4 G/ Z5 M6 u5 D
            upname = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/span/text()'))
    ' A$ l9 m8 |6 r1 I  M6 d% v        uplink = "http:" + "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/@href'))
    5 m$ f1 H* T  ^' D% S9 Y9 _        hot = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="pts"]/div/text()'))
    9 w! z, l- B& ?$ K* {2 R        video_list.append({
      Q. x0 z* n8 M9 U            'rank': rank,
    - d8 K4 s0 ]7 P            'videolink': videolink,
      o+ U$ E+ _$ Q, x0 ^  R" r            'title': title,' t8 F' G) D5 B7 H0 b/ Q$ w6 Q
                'play': play,
    . i5 L# r+ r4 U            'comment': comment,4 \- z' d4 \4 H, ?  U6 m: x
                'upname': upname,5 y* I+ W  v4 _' A. |3 D4 K2 q
                'uplink': uplink,
    % j2 e( g0 x- W2 \6 a% o% n             'hot': hot8 U& c) z' r2 P( M
            })
    ; e+ W( E" d9 g2 Y+ u7 f    return video_list
    ) t7 H% r/ s3 C
    & [. O7 O3 o- Y: u# 将爬取到的数据写入Excel表格
    8 J3 r) v! k' Q( e* Zdef write_Excel(video_list):
    # V. a$ V2 H6 \" |; q    print("将b站热门视频信息导入到Excel表格:")" e" A+ q0 B; x% C5 g: C" N, o1 C
        workbook = xlwt.Workbook()  # 定义workbook
    & a  Q  R% i+ T8 ]8 N9 J% d; G    sheet = workbook.add_sheet('b站热门视频')  # 添加sheet4 P" T2 \1 T: |. u9 a
        xstyle = xlwt.XFStyle()  # 实例化表格样式对象/ f- w' l6 A6 \% u7 I
        xstyle.alignment.horz = 0x02  # 字体居中3 a  d5 J* A1 B. U- w$ J
        xstyle.alignment.vert = 0x01  # 字体居中
    , j+ U8 U8 K8 U+ [& n8 d    head = ['视频名', 'up主','排名', '热度','播放量','评论数']  # 表头
    7 `8 b* t* q4 E8 g! o! A6 {    for h in range(len(head)):5 ]* p8 J9 x$ Y" Z) Y
            sheet.write(0, h, head[h],xstyle)  # 把表头写到Excel里面去
      h! e" n+ ]' s' o& L    i = 15 ~' C# _) a; h  z: U
        for item in video_list:
    1 |, f* G% G; p9 z        # 向单元格(视频名)添加(该视频的)超链接" l/ Y2 p% v) i
            title_data = 'HYPERLINK("'+item["videolink"]+'";"'+item["title"]+'")'  # 设置超链接7 @( U! v3 a( y! j& _% F, D' x
            sheet.col(0).width = int(256 * len(title_data) * 3/5)   # 设置列宽
    * D; U( `6 |; e7 @* y) Q        sheet.write(i, 0, xlwt.Formula(title_data), xstyle)
    ; N( z* u2 P) w. I& c- c        name_data = 'HYPERLINK("' + item["uplink"] + '";"' + item["upname"] + '")'  # 设置超链接% w% \" n: l, [% H; V
            sheet.col(1).width = int(256 * len(title_data) * 3 / 10)
    % o; p1 B9 D# I* H        sheet.write(i, 1, xlwt.Formula(name_data), xstyle)) N% y7 \( C$ g8 E9 X
            sheet.write(i, 2, item['rank'], xstyle)# @* C! Q0 z" `
            sheet.write(i, 3, item['hot'], xstyle)/ c+ B  `/ t4 M' b5 \3 w% C6 p
            sheet.write(i, 4, item['play'], xstyle)$ t) }/ R1 w. E8 M, d6 `! F# f9 I
            sheet.write(i, 5, item['comment'], xstyle)5 v' J* S  ]2 F. d
            i += 17 T( N+ m& c: T. i% d/ ?" ?7 l
        # 如果文件存在,则将其删除
    1 b! L4 H6 U) K+ e1 b    if os.path.exists('D:/Test/b站热门视频信息.xls'):
    : n6 i' g" n2 v4 {8 Q        os.remove('D:/Test/b站热门视频信息.xls')4 S7 V7 l2 u2 U: {! D4 m4 P
        workbook.save('D:/Test/b站热门视频信息.xls')
    4 m: ?# H6 w+ ^6 ^2 x/ t% U    print('写入excel成功')
    9 o* s! x+ S- s6 B9 |    print("文件位置:D:/Test/b站热门视频信息.xls")3 T$ ?4 D8 z# T

    $ J& e8 c# }( \0 z' a! ^7 pif __name__ == '__main__':
    * o. Q( d& k, P" E6 i  ~8 `) E4 \    video_list = []
    , d; }1 ^' {$ Z; U: n/ n' v% t! h5 `    write_Excel(spider(video_list))+ N9 R2 U# K: {* c
    ! e& M. F- {9 S! {

    ( j' p4 [  o. a6 `' Q
    5 N% {- J2 d9 @! K+ o
    3 o7 l( e5 @6 H; d* U
    8 j1 k0 \+ y" {: E7 c
    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-6-3 14:16 , Processed in 0.463397 second(s), 54 queries .

    回顶部