QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 4468|回复: 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表格
    " j* H: X/ X! _$ e0 S) z效果图:
    1 R; _" x6 j+ d# [! k 1.png
    5 s6 N( y; t4 j; v! l- a1.工先利其事必先利器,首先我们得下载相应的库:. k: ~% h. X6 q3 X5 ?$ }
    pip install requests: F4 }2 m' Q- w" Z! q5 V0 E3 }$ Z
    pip install lxml
    9 p9 d9 E+ t1 R; u/ n" Y, Cpip install xlwt
    2 l3 O4 P; T8 e* |: G
    , t/ Y4 T1 h3 E3 `+ |% B% y2 B% ?  k* Y- m
    requests 向网页发送请求+ D4 R! \. L5 J% f( K
    lxml 处理xml文件(xpath)# S! L% Y4 y/ T4 ]" [7 S
    xlwt 对Excel做写入操作
    ! W( U- ?$ o% t: ^. }, e0 m2.爬取b站热门视频的信息:0 g& s# O9 T' A7 l' O, j
      打开b站热门视频页面:
    , X% q, D4 W( Q% b 2.png 3 c4 @$ u& n0 e: Q2 @# k" J
      按f12进入开发者选项,然后点击选中你要获取的页面信息,即可找到该信息在该HTML文件中的什么位置(这对我们用xpath获取元素属性和元素值很重要),例如:( D* X# m3 v2 ~3 {2 ]0 ^
    3.png
    & e9 d; t" |9 m1 U代码如下:
    3 K# f& M6 f1 Z) }1 [- ?6 J! u' ?# 爬取b站热门视频信息
    0 k8 ^8 O# v/ b4 adef spider(video_list):! ]% H- `) @; H" S! ~& Y% X8 L9 T
        url = 'https://www.bilibili.com/ranking?spm_id_from=333.851.b_7072696d61727950616765546162.3'" Q; q$ v; ^: U. l' I9 X# {+ }
        html_data = requests.get(url).text
    : g" V6 x# J, g$ K' a    selector = html.fromstring(html_data)3 d/ o; d8 I# A4 p& M
        infolist = selector.xpath('//li[@class="rank-item"]')
    3 b, ?" B; L$ a0 L: Y# u8 n  r    for item in infolist:
    6 a/ w# R- @! B5 q' x        rank = "".join(item.xpath('./div[@class="num"]/text()'))3 V% q& I, y; Z# h5 N
            videolink = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/@href'))
    ! E. E6 Y( b& Q' D% U8 ^4 r        title = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/text()'))# v9 I4 Z& p; o
            playinfo = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/span/text()')).split("万")
    . A, ~7 ?4 A6 q+ o' `/ p        play = playinfo[0] + "万"
    8 z. L2 T8 A. r/ q( j        comment = playinfo[1]+ u( j/ f1 U6 s' V. F, Y/ M
            if comment.isdigit() == False:2 U2 ^% C' e, R) t2 G6 v  a
                comment += "万"
    4 p* t: c7 [7 @4 n5 C# n        upname = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/span/text()'))% B+ a# M9 ^0 b
            uplink = "http:" + "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/@href'))
    9 E! t  m; ^1 |% Q        hot = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="pts"]/div/text()'))# c" U: H; N: t% I# }. k
            video_list.append({
      U6 l. D) b( T" G& Q            'rank': rank,* P' R; J6 X" a# R' M" U
                'videolink': videolink,
    # c& B* F" P. }; a$ [! p" E            'title': title,. Q) E9 n/ J0 \" x& Y# p- k
                'play': play,
    0 H. B5 v& M1 j, n7 m' G3 u            'comment': comment,# [/ k* b4 Z; m
                'upname': upname,
    4 X  h. J9 o2 b" l2 {  z            'uplink': uplink,
    ; ], K3 k/ F$ F) V( c             'hot': hot
    4 I5 z# @) v9 V! U        })
    . Z  x$ x/ ]( \% _- l( r    return video_list
    ( F' p- J' B: m. v/ S+ Y" y! F1 K0 N! _
    1 e2 L7 R1 m5 v
    3.将我们拿到的信息集合(video_list)写入到Excel表格中:" J& F: X# s( z' p
      xlwt的基本使用方法:' S( u/ W+ }! j; w* e  ^, H1 H
    import xlwt
    : c% ?/ e6 p3 Z4 g# p4 Z9 ?: c6 U# 创建一个workbook (并设置编码)5 ^6 z% [) n4 O& b+ d. d
    workbook = xlwt.Workbook(encoding = 'utf-8')# V8 i( E' h/ W& i% |8 h& y. l5 D
    # 创建一个worksheet
    5 ]: j% s1 \# oworksheet = workbook.add_sheet('My Worksheet')
    6 v8 ?( Y$ u7 |1 J* o+ T% r5 N- H
    # 写入excel# i7 k8 [! g; c9 c; b) P
    # 参数对应 行, 列, 值,(格式)
    ) F+ D) y$ f1 _+ \2 C, {- cworksheet.write(1,0, label = 'this is test')/ j; ~: D: r0 z, ~( u' u2 _
    # 保存
    " |/ O, S2 y8 I* e( S#参数为你保存该Excel文件的路径
      p7 m2 |' k! ]. b! D7 g% Rworkbook.save('Excel_test.xls')
    5 |! A( F% V) }/ v! b9 {
    ; {- S" m6 L  N3 D9 D
    2 F/ G4 N, O* @% Q  如果我们想要点击视频名或者up的名字可以跳转,那么我们就要使用Excel表格的HYPERLINK方法:( @) n3 @( {* ~
    HYPERLINK(“http://www.baidu.com” ; “百度”)
    8 r5 @  b$ }1 n百度为显示在单元格的信息,而前面的链接为跳转链接。/ F/ f7 P8 ^0 c' y) P. v3 X: o
    xlwt.Formula()方法需要传入一个字符串s,s=‘HYPERLINK(“http://www.baidu.com” ; “百度”)’。/ w. v8 j: c. r; |
    代码如下:- q2 I0 o0 ^2 j0 v
    # 将爬取到的数据写入Excel表格
    2 B5 c" B, w/ R, U; O4 \, ?def write_Excel(video_list):
    ' ]! l, @. h0 V  r4 m- j6 _, ?    print("将b站热门视频信息导入到Excel表格:")7 v) |- t' B; ~2 V
        workbook = xlwt.Workbook()  # 定义workbook
    1 @) P$ P) [, D, l4 }) x    sheet = workbook.add_sheet('b站热门视频')  # 添加sheet
    1 U+ J; s9 J7 `7 d9 h# \    xstyle = xlwt.XFStyle()  # 实例化表格样式对象
    . J' M2 u/ H% y( w* m& R    xstyle.alignment.horz = 0x02  # 字体居中
    * f  Z& p9 R  k0 W8 Y" A: P$ x1 w    xstyle.alignment.vert = 0x01  # 字体居中7 W1 J; }+ n) y$ N
        head = ['视频名', 'up主','排名', '热度','播放量','评论数']  # 表头* \3 J5 \1 d  f) r
        for h in range(len(head)):
    , K8 Q1 i9 S1 l0 H0 E$ j7 w8 y        sheet.write(0, h, head[h],xstyle)  # 把表头写到Excel里面去' H! I1 o0 v  ~# z
        i = 1
    % p. I9 S" \& \) z& p* ~$ y3 ]  Y    for item in video_list:
    / U% p0 R1 n1 h/ ^        # 向单元格(视频名)添加(该视频的)超链接
    ) O4 Q/ u7 @) J        title_data = 'HYPERLINK("'+item["videolink"]+'";"'+item["title"]+'")'  # 设置超链接/ Q( e3 j3 a+ G* W1 E" F) ~
            sheet.col(0).width = int(256 * len(title_data) * 3/5)   # 设置列宽1 q3 a4 w* N' T  d0 a
            sheet.write(i, 0, xlwt.Formula(title_data), xstyle)0 V6 ^0 D- S. Y. o# I! }- |
            name_data = 'HYPERLINK("' + item["uplink"] + '";"' + item["upname"] + '")'  # 设置超链接% S: F1 x' I: H
            sheet.col(1).width = int(256 * len(title_data) * 3 / 10)* ]- }: o7 A9 i% ?6 h. Z- Y
            sheet.write(i, 1, xlwt.Formula(name_data), xstyle)# I* t( s; c/ p9 i0 t4 }: j: w; d6 A6 ?
            sheet.write(i, 2, item['rank'], xstyle)
    9 T$ s# O5 G& L; I) n) F        sheet.write(i, 3, item['hot'], xstyle)
    , Q' l" {$ G8 m: Q2 a1 P: N1 `        sheet.write(i, 4, item['play'], xstyle)# m- {& ?' y; A2 C
            sheet.write(i, 5, item['comment'], xstyle)4 d; B$ F  \7 `
            i += 1/ e2 U! X* }9 T# Y' T1 _  O
        # 如果文件存在,则将其删除7 @/ o5 [7 F  }- c
        if os.path.exists('D:/Test/b站热门视频信息.xls'):
    , D* h9 c; }! v9 b        os.remove('D:/Test/b站热门视频信息.xls')3 j! }# j; D# O5 n9 \5 S2 d
        workbook.save('D:/Test/b站热门视频信息.xls')( O8 Q2 z( O" I; E; U/ P! Z
        print('写入excel成功')( _0 j' C& l9 h% K" b8 H3 ]
        print("文件位置:D:/Test/b站热门视频信息.xls")
    & T6 m) M( G6 Y% e( T! g' Z9 h0 J& T9 Z

    ; \. |, ?2 s# u# q# M4.在入口main中调用上面两个函数. ]+ a) ]# a5 x+ u& m# F( C  n7 G
    完整代码如下:, o/ i; J- A: |, B: I4 l
    import requests
    6 \% _5 t$ F. z  Y4 qfrom lxml import html2 [- O# p, U' V. v' V& D3 ^
    import xlwt
    / n% k1 d; e: t/ I' oimport os
    4 k8 F# ^- o5 ~7 s, d2 M6 x# D6 \; t2 ^! _) i8 ]3 ?
    # 爬取b站热门视频信息
    6 f. q! C3 ~9 j; @- D, ?def spider(video_list):% R6 e$ \# Y& }0 L
        url = 'https://www.bilibili.com/ranking?spm_id_from=333.851.b_7072696d61727950616765546162.3'/ `& e+ {: t/ }* g4 S
        html_data = requests.get(url).text
    4 p" M: Y: X! i# y# v    selector = html.fromstring(html_data)1 Q  r& b; z5 H. n( ?+ @' M
        infolist = selector.xpath('//li[@class="rank-item"]')
    8 \1 o1 U+ h! l& O3 N# h4 h/ p    for item in infolist:# ~( B& j( {( V- X$ Q3 `/ `  K
            rank = "".join(item.xpath('./div[@class="num"]/text()'))7 y/ l: L% H2 S9 m, h/ F/ m
            videolink = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/@href'))5 j$ \# z* Q- r0 a. u
            title = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/text()'))) L3 _2 X( @6 h# h6 w" L8 E
            playinfo = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/span/text()')).split("万")+ @$ C/ z. @  ]2 M9 o
            play = playinfo[0] + "万"+ J; g5 Q# Z% q* u* {: k! P
            comment = playinfo[1]9 K8 n) A' Z9 S+ f# x& T0 ~
            if comment.isdigit() == False:
    4 m6 h$ c+ [0 X- ?2 B8 n8 I            comment += "万"
    " ~3 e8 v+ Y9 c( Q- [        upname = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/span/text()'))3 F6 @. j0 b7 k' l2 T% m  @9 l- [
            uplink = "http:" + "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/@href'))/ o8 C& J3 \+ N/ q: t( C
            hot = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="pts"]/div/text()'))
    8 ?" |* \3 I" p4 k, R) F; w        video_list.append({
    2 k& V! z, n. L1 ^& Z$ p$ k  a            'rank': rank,6 Q. e  P2 [9 a4 W% E# m5 |9 c
                'videolink': videolink,
    4 }  e) ?4 h( V  W1 b# q7 R7 u2 V            'title': title,
    8 c# X( n  p' ~7 K            'play': play,- g' I  c7 Y" l' H$ G
                'comment': comment,% E; _7 y) H. f
                'upname': upname,
    + {% V7 P" H  B0 V; P7 Q# [- \            'uplink': uplink,; F% G# f4 I# k
                 'hot': hot  Q# e* q+ X! O8 Y
            })8 S- p) [0 w. z+ e- @7 \. T
        return video_list, a( B+ `. f( `' h2 Z( |* y, q
    5 k% Y! v/ Y, C  k0 h
    # 将爬取到的数据写入Excel表格! L# R) O! H- ]/ C9 _$ w
    def write_Excel(video_list):
    3 n% W. Y, K1 q0 {2 @/ r/ B    print("将b站热门视频信息导入到Excel表格:")7 P1 ~2 i/ R& j5 i2 C9 |: @& c
        workbook = xlwt.Workbook()  # 定义workbook* `$ H9 a2 B% L' ?1 V! I
        sheet = workbook.add_sheet('b站热门视频')  # 添加sheet6 Z! i! ]! ^, l, U$ f
        xstyle = xlwt.XFStyle()  # 实例化表格样式对象" U! W5 {7 x# f" S$ i5 E( s
        xstyle.alignment.horz = 0x02  # 字体居中0 D: B9 `4 |; s2 F9 H' l8 D2 Y
        xstyle.alignment.vert = 0x01  # 字体居中
    - `% a. H6 k) I& N    head = ['视频名', 'up主','排名', '热度','播放量','评论数']  # 表头
    1 x" q8 @% l' D: K' N/ k+ |    for h in range(len(head)):5 `/ k/ V7 V& {
            sheet.write(0, h, head[h],xstyle)  # 把表头写到Excel里面去
    8 ?3 G% |/ _$ T9 G5 u$ f    i = 1
    : X: o0 Z( }1 D+ Y) S. P. g    for item in video_list:
    1 f3 X& k  A& Y! Y  u0 {        # 向单元格(视频名)添加(该视频的)超链接
    3 K7 b" L3 E( H9 g9 \: W        title_data = 'HYPERLINK("'+item["videolink"]+'";"'+item["title"]+'")'  # 设置超链接7 d  Q- g5 Y  y1 a2 ]' P1 i4 v+ H
            sheet.col(0).width = int(256 * len(title_data) * 3/5)   # 设置列宽0 L* A# S/ ~( k) U' R9 v- `
            sheet.write(i, 0, xlwt.Formula(title_data), xstyle)
    6 |1 n7 H* |6 Q' q        name_data = 'HYPERLINK("' + item["uplink"] + '";"' + item["upname"] + '")'  # 设置超链接
    * ~2 v9 k4 p# [8 G. ^5 ]. P        sheet.col(1).width = int(256 * len(title_data) * 3 / 10)9 H3 `8 l) f+ [
            sheet.write(i, 1, xlwt.Formula(name_data), xstyle)8 Q  K. a- [# j# ?0 d9 ^/ z( n" I
            sheet.write(i, 2, item['rank'], xstyle)# R1 L) H* z( a' M! V- X
            sheet.write(i, 3, item['hot'], xstyle)% Z/ D5 n$ Z9 t, U( ?
            sheet.write(i, 4, item['play'], xstyle)5 v, w$ v. n' J& o
            sheet.write(i, 5, item['comment'], xstyle)* A* e: R) F2 t3 I  U; b
            i += 1
    / B4 k9 U$ K  c/ E0 u    # 如果文件存在,则将其删除
    * ~5 S/ m% r- O' e- D6 M$ D    if os.path.exists('D:/Test/b站热门视频信息.xls'):
    ; p6 c) ]7 h; H. ]  R# {4 T: @        os.remove('D:/Test/b站热门视频信息.xls')6 V; `. T" T8 g5 l* I3 n3 l9 G9 g
        workbook.save('D:/Test/b站热门视频信息.xls')
    / d  x0 Q  D' n: S0 X  k1 \    print('写入excel成功')
    ) C, M7 v6 p# a- f6 b    print("文件位置:D:/Test/b站热门视频信息.xls")3 T/ S3 ]  D' V3 }$ f3 @& y0 E

    * V- M& i5 D) e% _if __name__ == '__main__':* ]. z( \# x& m( X2 M* w0 W" ]
        video_list = []9 n' N' y- {; v3 D( H  }
        write_Excel(spider(video_list))
    " `, a$ [3 D9 [9 j# z" R) |+ a9 W; a
    5 P" y, {) q$ s0 y1 A3 Z4 ^- P: E; q6 a/ ?1 g' ^

    ! _' `. ]) t3 B% J
      ~+ M, b5 {7 ^. J8 P( g- z) G! p( M
    * t9 E' j' w1 x; V* [$ ~. 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-9-1 18:44 , Processed in 0.301803 second(s), 54 queries .

    回顶部