QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 4467|回复: 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表格% _6 V& I' v1 x* ?% r1 q+ \
    效果图:
    . N4 o! @9 {' E 1.png + g" n+ p- T- T4 ]0 F2 `! `' t
    1.工先利其事必先利器,首先我们得下载相应的库:
    % _0 d. @9 [$ p, i/ \+ spip install requests+ Z5 j! U0 h: M" \
    pip install lxml
    1 `% x- ]5 C  P( Z' `* R; _pip install xlwt
    $ s. Q! d& U0 f2 F' O7 k2 U: b/ Y- \" a- e9 Z5 K0 b9 w
    0 g5 G( Y; o! S0 a5 R
    requests 向网页发送请求; t  F, D* N' J9 g
    lxml 处理xml文件(xpath)
    , _$ l3 m5 q' nxlwt 对Excel做写入操作
    6 o+ X, B0 T8 K9 V9 ?# I# E2.爬取b站热门视频的信息:
    6 ?6 E/ F% j9 w4 [+ e  打开b站热门视频页面:; E' G5 D: q  R0 x
    2.png
    7 m8 w4 g6 S0 M( U- p+ Y2 }' v  按f12进入开发者选项,然后点击选中你要获取的页面信息,即可找到该信息在该HTML文件中的什么位置(这对我们用xpath获取元素属性和元素值很重要),例如:' `' U% @  G) z9 u
    3.png 6 Z) H; @% }* c( Q5 e% Q
    代码如下:
    # o9 H. Y$ ~4 K& F0 M. Y" D$ b# 爬取b站热门视频信息
    - X$ M5 }( Y* d( h! Adef spider(video_list):( R- N8 _% `) o' g/ B* C
        url = 'https://www.bilibili.com/ranking?spm_id_from=333.851.b_7072696d61727950616765546162.3'
    " N8 p4 G1 y0 y7 @3 v" v# H    html_data = requests.get(url).text! Q( f% j* y- Y0 H8 Z
        selector = html.fromstring(html_data)
    ) k: c: l* S/ z7 y" k( {    infolist = selector.xpath('//li[@class="rank-item"]')2 I6 c3 \$ p* v: m% z8 u* f. J# [
        for item in infolist:
    * a% W; ?4 K8 f/ [/ X9 p! P        rank = "".join(item.xpath('./div[@class="num"]/text()'))
    8 {. A7 |& A0 R; I        videolink = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/@href'))
    " N6 H; a- A$ B* E5 `" [2 W        title = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/text()'))6 y+ i1 y  z) T. n) ^' r4 X/ p
            playinfo = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/span/text()')).split("万")2 F% r0 x8 x" [, Q0 M3 J; T
            play = playinfo[0] + "万"6 I; Q3 c6 f6 [, f
            comment = playinfo[1]
    3 f, g" @7 p* [! Z, s2 h0 ~! k6 r, Q        if comment.isdigit() == False:" V/ G, p! b5 ]; N6 \9 o- g
                comment += "万"
    : b# B2 d7 e5 O4 a7 |        upname = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/span/text()'))
    $ `) p: I' \5 A5 k3 I2 t( W2 F        uplink = "http:" + "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/@href'))' w) d1 c3 X; F% s( h7 L5 y6 n
            hot = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="pts"]/div/text()'))
    ' @) }( r" k/ h: W5 n( @8 p        video_list.append({- ]1 f$ e5 {; _$ |' C) \
                'rank': rank,9 S3 C2 Q( z4 |; c- v
                'videolink': videolink,6 C  e8 S5 c1 t, J, x0 W- w* q+ g' k" q
                'title': title,
    , l, h4 `, i5 h) ?3 M8 J            'play': play,
    6 s2 h  B4 G# y% n5 I            'comment': comment,) E0 E+ ?+ G3 c% a& H3 j1 V
                'upname': upname,& Y1 }6 O( [, a' D+ ]
                'uplink': uplink,% F7 Q( U  c; z7 [/ j, f
                 'hot': hot# N* E+ o0 W- I2 B; v7 R: ]
            })' ]+ ?: N8 w! Q
        return video_list
    $ F, [& n4 U3 Z, B7 W& o( l
    . C( a# x) n7 [

    6 r5 S2 d- l- Z# ^3 \3.将我们拿到的信息集合(video_list)写入到Excel表格中:
    % e! e2 o6 {; ?7 f' i, o  xlwt的基本使用方法:
    * i) Q& @6 L( K; y* h, F8 }5 ximport xlwt
    , L- D3 m' c% ?! R# 创建一个workbook (并设置编码)/ G. a% t; \* l" k
    workbook = xlwt.Workbook(encoding = 'utf-8')
    & @+ i9 e; Y0 }6 {# G; m# 创建一个worksheet, @1 b0 q1 [4 ?  B1 t! }
    worksheet = workbook.add_sheet('My Worksheet')
    6 h. A$ C5 U, K' E+ `1 M
    # N' P0 Z$ Z7 R! ]( p2 Z# 写入excel
    3 x/ I1 C+ K5 X& F% [: ?/ a8 T# 参数对应 行, 列, 值,(格式)/ B* R# r+ j+ Y
    worksheet.write(1,0, label = 'this is test')
    5 m/ `0 B$ o$ a1 r1 ?# 保存
    2 `2 `- o4 W1 p; ^; m( N' v8 e#参数为你保存该Excel文件的路径; S$ s9 ?2 p; e+ z3 }
    workbook.save('Excel_test.xls')8 c9 i/ p6 C7 E& N
    & ^- m) N" H* I6 W! o
    5 [  d5 A3 s8 Z1 r
      如果我们想要点击视频名或者up的名字可以跳转,那么我们就要使用Excel表格的HYPERLINK方法:
    $ S2 m" d& }3 A5 o, tHYPERLINK(“http://www.baidu.com” ; “百度”)
    " {. A! F, t$ n百度为显示在单元格的信息,而前面的链接为跳转链接。
    6 e' r- m: D! Z8 x$ `+ ^! V2 o1 Exlwt.Formula()方法需要传入一个字符串s,s=‘HYPERLINK(“http://www.baidu.com” ; “百度”)’。
    % B9 w* ^% c& a/ m) m代码如下:( r: J8 U' R( k6 [- a& `
    # 将爬取到的数据写入Excel表格
    " O: i* ^. q  C' S" K) ~def write_Excel(video_list):6 h6 U; t3 I& F- ]; A
        print("将b站热门视频信息导入到Excel表格:")
    % a4 |' O8 a/ M2 Y  V# d" x& Z    workbook = xlwt.Workbook()  # 定义workbook% {) k, D3 d* o" U
        sheet = workbook.add_sheet('b站热门视频')  # 添加sheet
    3 t/ |+ A& m, S6 ]# h% s% B4 w    xstyle = xlwt.XFStyle()  # 实例化表格样式对象
    4 t: [0 I* J/ w5 C; V, |    xstyle.alignment.horz = 0x02  # 字体居中
    # ~( r& h7 K# M9 `    xstyle.alignment.vert = 0x01  # 字体居中/ s! p+ y( T7 O4 g/ K/ {' [3 Y' U' w
        head = ['视频名', 'up主','排名', '热度','播放量','评论数']  # 表头9 O& Q2 l) D# Q
        for h in range(len(head)):
    , A, c5 n+ ^: E$ i3 N        sheet.write(0, h, head[h],xstyle)  # 把表头写到Excel里面去
    ( F- b0 E; c+ i1 x; {; @) b" j    i = 1- n$ K- c4 `1 ]9 ?+ E( V% V  h1 u
        for item in video_list:
    5 C1 a" v' h% m& l% x) \/ L) q        # 向单元格(视频名)添加(该视频的)超链接
    6 Z7 D6 N' P. ~' I& d) X+ L        title_data = 'HYPERLINK("'+item["videolink"]+'";"'+item["title"]+'")'  # 设置超链接
    & a0 U7 _3 F* O+ i        sheet.col(0).width = int(256 * len(title_data) * 3/5)   # 设置列宽
      o3 ^# M1 h7 m$ l- c  a3 k/ T        sheet.write(i, 0, xlwt.Formula(title_data), xstyle)0 n) w0 c) k# q% L
            name_data = 'HYPERLINK("' + item["uplink"] + '";"' + item["upname"] + '")'  # 设置超链接8 c: f9 r# o6 s" y
            sheet.col(1).width = int(256 * len(title_data) * 3 / 10)* V" j+ E9 ?. a2 b1 E7 ]! O, c, e2 ]7 Y
            sheet.write(i, 1, xlwt.Formula(name_data), xstyle)7 Y5 |* H" F; R7 z
            sheet.write(i, 2, item['rank'], xstyle)3 \5 q! F* K6 [$ w! {
            sheet.write(i, 3, item['hot'], xstyle)
    3 [5 j  R& b! ]" I. a( E        sheet.write(i, 4, item['play'], xstyle). G) g: B% D& j; T% g3 G
            sheet.write(i, 5, item['comment'], xstyle)
    $ }8 j. m6 C! b: x! @        i += 1' P- ?/ i! I& L8 l& a( Y5 m* I) ]
        # 如果文件存在,则将其删除
    ' g6 J; M% t1 H2 Z" E& D( ~    if os.path.exists('D:/Test/b站热门视频信息.xls'):; Z- m# C: O1 c& o' p
            os.remove('D:/Test/b站热门视频信息.xls')1 l! W- i2 c, f9 k3 m: c
        workbook.save('D:/Test/b站热门视频信息.xls')
    9 D3 R- @! u9 a+ M, L    print('写入excel成功')
    " ]% m. b/ W8 K( \5 ~    print("文件位置:D:/Test/b站热门视频信息.xls")7 s/ c. s' V- R: \4 M# K" o% g5 p7 E

    1 X) d  {  @  e- o% {. ]
    . `0 ]3 W( a# g. v* g% D- a8 u' X; ~4.在入口main中调用上面两个函数1 R1 T$ g1 `- ^  W! G; p
    完整代码如下:9 a) }. t/ h  _" q
    import requests
    ( Z7 a' ~7 q( V9 b" H6 ?1 Sfrom lxml import html
    ! Y7 D9 c3 @$ v' r) J+ himport xlwt
    . y* I2 V3 Q4 r5 e3 L, Rimport os' K9 ^* f! N, N) J; f
    1 s; X+ V* @8 B) ?. k
    # 爬取b站热门视频信息7 r& V+ z7 A- q8 M& `3 k) D. E
    def spider(video_list):
    % ~0 M! I5 L7 Q    url = 'https://www.bilibili.com/ranking?spm_id_from=333.851.b_7072696d61727950616765546162.3'
    2 S$ ?& c1 o- Y$ w! Y$ k9 M7 r    html_data = requests.get(url).text
    1 I1 z1 l8 G& y4 X( ]" n    selector = html.fromstring(html_data)
    4 b! K( @5 d, E# d' ~    infolist = selector.xpath('//li[@class="rank-item"]')* l4 `$ P0 M( K3 Z1 a9 n7 h
        for item in infolist:% }& u9 ~" E4 r2 e. f+ O9 N, w
            rank = "".join(item.xpath('./div[@class="num"]/text()'))# u4 ^% F9 r. g' `7 W
            videolink = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/@href'))  Z+ y3 X% n% n+ f1 C
            title = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/text()'))
    4 R4 g9 N  C1 E# j        playinfo = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/span/text()')).split("万")/ i' u) h8 F, b) I* W, k
            play = playinfo[0] + "万"
    2 J, E3 I1 f4 o' \        comment = playinfo[1]
    : h; s2 }% R! g) P  \4 k4 x" e$ J        if comment.isdigit() == False:! F& _7 C) d7 w% N
                comment += "万"
    6 t" l# |$ U  z        upname = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/span/text()'))
    ) n4 w4 @/ v1 o% O$ N9 V; g4 {        uplink = "http:" + "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/@href'))6 y: ~7 f$ a0 o  @' ?
            hot = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="pts"]/div/text()'))4 z" B; z1 V: i/ i
            video_list.append({" K8 W* p; ?7 w$ s
                'rank': rank,. j9 t! @  h, y+ o: _! W" d
                'videolink': videolink,
    4 D0 q- J* N7 ^; U4 f" z            'title': title,) B9 D( m( Y6 o4 d( v
                'play': play,; n& O4 J6 r  y: k3 a
                'comment': comment,& R$ x5 l# _) S
                'upname': upname,; w7 U$ R0 i  \9 b5 j5 @4 d; y. z
                'uplink': uplink,' m, P: C- z  H6 S# ?
                 'hot': hot
    5 r* B/ Y; P- b3 @' \( D' s        })2 r9 r) k, Q/ M  {) h
        return video_list
    0 ^4 R) }2 o2 N( F" u) h' L+ n: l
    6 D! }. A" T7 L# 将爬取到的数据写入Excel表格
    5 {0 Z2 a" u/ B) I8 ydef write_Excel(video_list):
    ; a! {0 w9 [8 r8 {; u: ?% T. W    print("将b站热门视频信息导入到Excel表格:")
    0 b% ?* S, z7 p  w! s    workbook = xlwt.Workbook()  # 定义workbook
    1 `1 Z) }% ?6 ~  ]    sheet = workbook.add_sheet('b站热门视频')  # 添加sheet  g1 L' X0 u% V! j' I, ^
        xstyle = xlwt.XFStyle()  # 实例化表格样式对象
    & \% A4 Q  F! \& j$ H. p/ z    xstyle.alignment.horz = 0x02  # 字体居中
    7 Z1 b- ~/ ~: [9 T- x. F1 g    xstyle.alignment.vert = 0x01  # 字体居中
    8 [  E, g% b$ ^2 `    head = ['视频名', 'up主','排名', '热度','播放量','评论数']  # 表头
    + C) _, d# I3 L9 E4 ]    for h in range(len(head)):6 i% X" |  E8 Z% B
            sheet.write(0, h, head[h],xstyle)  # 把表头写到Excel里面去# \( u- D0 S* ^! Z3 L& b
        i = 1
    1 _0 D6 y& U: {2 I% a    for item in video_list:
    + {) ?+ _( x, S, I3 }        # 向单元格(视频名)添加(该视频的)超链接
    / s& u2 a* _3 l* [8 _        title_data = 'HYPERLINK("'+item["videolink"]+'";"'+item["title"]+'")'  # 设置超链接
    * j9 o& U) r% u# y        sheet.col(0).width = int(256 * len(title_data) * 3/5)   # 设置列宽/ I/ o. `- h$ X: W) ~/ |& L( A
            sheet.write(i, 0, xlwt.Formula(title_data), xstyle)6 `6 n" K& g, y9 F+ F4 Z
            name_data = 'HYPERLINK("' + item["uplink"] + '";"' + item["upname"] + '")'  # 设置超链接
    ( ~: S4 u; I) `2 r/ G& P- Y        sheet.col(1).width = int(256 * len(title_data) * 3 / 10)' w& u/ J9 R4 Q! x8 H
            sheet.write(i, 1, xlwt.Formula(name_data), xstyle)# y; [1 N9 E$ p' ~3 H
            sheet.write(i, 2, item['rank'], xstyle)( `2 S( r9 M  u% E( W
            sheet.write(i, 3, item['hot'], xstyle): j$ F) s: y9 ^8 C- p' @  h
            sheet.write(i, 4, item['play'], xstyle)
    , {0 t% P0 _: s5 i$ O9 a1 a" {/ d+ S        sheet.write(i, 5, item['comment'], xstyle)
    8 e$ b# Z4 e( W, t/ F! a8 q        i += 1
    ' w7 S+ ~, X# A$ \, D' {* c    # 如果文件存在,则将其删除
    # h0 g, v* [/ m' o7 p/ {# ^/ r, y% M    if os.path.exists('D:/Test/b站热门视频信息.xls'):
      d0 k. b% j/ j4 `) H# Y        os.remove('D:/Test/b站热门视频信息.xls')
    / ^, m/ V# D, A    workbook.save('D:/Test/b站热门视频信息.xls')
    & n& W  S6 e7 Z7 H; s3 `7 E    print('写入excel成功')  d6 O4 n' @# I
        print("文件位置:D:/Test/b站热门视频信息.xls")
    % V9 \8 o9 z5 M; K0 l, r1 V) }7 S3 ^* @
    if __name__ == '__main__':4 ~4 g& X/ Z# U5 d  }4 Y
        video_list = []" E: z: V' m4 u0 G9 I
        write_Excel(spider(video_list)), c/ c) z* a. I/ x

    # D3 i: S$ H& s$ B- B- H8 w* e9 G; w
    & g1 |9 I8 }$ G- k
    ) U2 I1 z: I, k! ?
    " u( E8 |7 B" ^7 I. ~, l6 J6 Z8 l' J# W/ @7 L5 T4 @
    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 17:33 , Processed in 0.676789 second(s), 54 queries .

    回顶部