QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 4470|回复: 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表格
    ) g6 o0 z7 Y4 p& B( E, Y效果图:
    3 {# S1 r& z6 W- v# s( o 1.png ; {+ s) |& ?. B
    1.工先利其事必先利器,首先我们得下载相应的库:3 D# U+ g  y6 r+ I. s' S, I
    pip install requests
    . l# T, k1 X' h$ T$ X4 @' h* Wpip install lxml  e; J% o& _+ L4 K
    pip install xlwt
    ) B# K% V- X3 U; I+ E
    - i1 a$ w. z4 L) Y8 E
    ; N/ M& l$ q+ p7 R2 I6 xrequests 向网页发送请求
    & R* x4 t- ]% ]/ }5 elxml 处理xml文件(xpath)5 C) R" a- [% Z
    xlwt 对Excel做写入操作
    8 v: @5 X* \' c2.爬取b站热门视频的信息:
    - Q# s% x9 c0 k9 E2 g. Z  打开b站热门视频页面:$ V, N  X7 l9 k+ P, h' w+ i9 Z  c
    2.png
    8 R' n  {8 P7 A% e& H  按f12进入开发者选项,然后点击选中你要获取的页面信息,即可找到该信息在该HTML文件中的什么位置(这对我们用xpath获取元素属性和元素值很重要),例如:
    6 J2 ]7 A0 o5 A: e 3.png % V. d3 M/ K; \% K9 d6 E$ _
    代码如下:1 r: V% }  V: G
    # 爬取b站热门视频信息( y: @! I7 _% d2 ^9 I
    def spider(video_list):
    ) [0 @) }0 q- ]& A3 S    url = 'https://www.bilibili.com/ranking?spm_id_from=333.851.b_7072696d61727950616765546162.3'
    , l" N' e$ L( k: l" O. u6 A# J    html_data = requests.get(url).text4 y2 ~3 N# P3 W" e* Y
        selector = html.fromstring(html_data)( U' c6 r, s1 y( f0 b0 F7 l: q
        infolist = selector.xpath('//li[@class="rank-item"]')
    ) Q$ h- k, s" t0 s) k    for item in infolist:
    5 }% S$ P& n$ u        rank = "".join(item.xpath('./div[@class="num"]/text()'))
    4 e$ S" {- e+ p0 L        videolink = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/@href'))8 p8 q. c2 U8 U, {9 h1 a/ c4 ^
            title = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/text()'))6 \2 I* p! a) B; v8 [% _
            playinfo = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/span/text()')).split("万")
    9 R& Z/ Z3 d) Q5 |$ _, ^! B        play = playinfo[0] + "万"- `6 P5 B6 |) a8 B2 X/ o
            comment = playinfo[1]( ]( k- l) D! F: G6 ?, |0 X- c
            if comment.isdigit() == False:& O6 L7 O6 r  a8 r* ~0 h2 b/ o; R
                comment += "万"
    4 y: G* v/ i2 [6 Z9 i/ k% c        upname = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/span/text()'))4 r: d- s: n) K, C
            uplink = "http:" + "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/@href'))* f2 }: l9 \% T
            hot = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="pts"]/div/text()'))+ ]% t" P: x) \% w
            video_list.append({
    % o" x7 s! p3 y. N% x7 j) r6 |            'rank': rank,3 [- R/ J/ U' C7 t
                'videolink': videolink,
    : r: A% [6 _, S+ m4 M& ~3 i5 T            'title': title,
    # p- f9 ?# ]4 ~: {  i3 j' A            'play': play,
    9 V, \4 `( p6 \7 D            'comment': comment,
    ( O& G5 y5 \5 @( b8 \            'upname': upname,2 `1 R- C  J! {$ e7 D
                'uplink': uplink,
    - N9 x7 k- j% J6 F4 L. A5 h             'hot': hot
    7 s6 [1 \2 j! F' b        })
    9 d/ |" M2 H) g8 o2 w% ~$ i    return video_list
    9 }5 C3 Q) }1 `; X1 ~% ~+ G5 H3 k7 V; L+ n, e* `4 P& B

    % B" R# v& @* [6 r( H5 E3.将我们拿到的信息集合(video_list)写入到Excel表格中:
      k" d# K, w( ]% Z9 \' Q  xlwt的基本使用方法:, x; K! V# Q  S# Q9 I' j: d
    import xlwt' c; z% K- r% L, a/ k2 o' S; O8 ?
    # 创建一个workbook (并设置编码)0 x" B9 }1 i) ?% T3 ]! C9 |
    workbook = xlwt.Workbook(encoding = 'utf-8')
    ) N  G& R. ]8 y' J" _' ?$ e+ s9 `# 创建一个worksheet
      o) ~) I9 E4 [! y. H5 Gworksheet = workbook.add_sheet('My Worksheet')/ v: [4 I% x: a. x7 q7 C. O; G; \

    9 x/ C& h/ I. a# w; w/ Q+ u; X# 写入excel3 A: D, R2 W+ ]/ R2 S. l
    # 参数对应 行, 列, 值,(格式)
    " }8 O( s  O* pworksheet.write(1,0, label = 'this is test')
    : m) |$ l. y) l4 J- q) B0 r: [# 保存
    . w9 ~8 V# \. U#参数为你保存该Excel文件的路径
    - T# Q- Q' a* Y, N& }! uworkbook.save('Excel_test.xls')  \; Q3 ^  y2 s; H+ ]/ u' ^
    $ I3 H7 v& o! I8 n) o$ y

    # v) S5 Y. L) ^  b  如果我们想要点击视频名或者up的名字可以跳转,那么我们就要使用Excel表格的HYPERLINK方法:
    , f6 I7 L, H9 I5 u) cHYPERLINK(“http://www.baidu.com” ; “百度”)1 ]; c3 z1 B0 b  ?$ J) ?
    百度为显示在单元格的信息,而前面的链接为跳转链接。
    4 t6 x3 {8 B8 `, _, @' p3 I+ D& U( v; M2 ixlwt.Formula()方法需要传入一个字符串s,s=‘HYPERLINK(“http://www.baidu.com” ; “百度”)’。3 G* X- J2 z9 U; b% |
    代码如下:
    ' u: K, y+ \/ u  F, i1 k# 将爬取到的数据写入Excel表格
    ' b3 ~. Y# o9 Qdef write_Excel(video_list):1 X' M$ o3 ?! V
        print("将b站热门视频信息导入到Excel表格:")
    9 m" f2 k7 x1 M/ U    workbook = xlwt.Workbook()  # 定义workbook
    ( Y+ j$ I7 C: @( O5 w' S6 j/ ^    sheet = workbook.add_sheet('b站热门视频')  # 添加sheet3 w$ F# ]0 Z' u3 M0 J+ o
        xstyle = xlwt.XFStyle()  # 实例化表格样式对象
    ! k3 X+ o" `4 Q4 [& `: @    xstyle.alignment.horz = 0x02  # 字体居中% U  _5 N3 F% S1 w. W
        xstyle.alignment.vert = 0x01  # 字体居中) i. n9 _" S/ L  y. b
        head = ['视频名', 'up主','排名', '热度','播放量','评论数']  # 表头
    : x! l  B% z+ ^' f' G  d& p    for h in range(len(head)):
    3 \# a3 H$ J9 x( P2 X0 K6 f; {        sheet.write(0, h, head[h],xstyle)  # 把表头写到Excel里面去" O+ Q9 R! G& B/ `$ e
        i = 15 p; y( l! w8 X. G& b
        for item in video_list:$ O* B! f" E) d: T0 c
            # 向单元格(视频名)添加(该视频的)超链接' c0 x* a, o9 ]$ f) S
            title_data = 'HYPERLINK("'+item["videolink"]+'";"'+item["title"]+'")'  # 设置超链接
    # e0 N- ?, s1 B5 b# f        sheet.col(0).width = int(256 * len(title_data) * 3/5)   # 设置列宽" N+ T/ i  w1 U9 Z
            sheet.write(i, 0, xlwt.Formula(title_data), xstyle)
    ) W3 Z* Z4 s2 H6 q) K        name_data = 'HYPERLINK("' + item["uplink"] + '";"' + item["upname"] + '")'  # 设置超链接
    9 i3 h* d/ u5 H1 p$ d7 H* P        sheet.col(1).width = int(256 * len(title_data) * 3 / 10)4 w+ p* m$ O: y% D" a( R& D9 x
            sheet.write(i, 1, xlwt.Formula(name_data), xstyle)9 @2 Q9 N. v3 f& X
            sheet.write(i, 2, item['rank'], xstyle)' k) d" Z. V+ Q9 r6 B
            sheet.write(i, 3, item['hot'], xstyle)6 r- `) J) `9 [% V( u
            sheet.write(i, 4, item['play'], xstyle)
    . _7 D, X3 [9 s! f+ Z        sheet.write(i, 5, item['comment'], xstyle)
    2 B; ]/ p) T/ v3 ?: i% H        i += 1
    3 P$ v7 g, H' s7 x- f7 `    # 如果文件存在,则将其删除
    4 l) J( z! A3 t- R& I" W) C    if os.path.exists('D:/Test/b站热门视频信息.xls'):
    : P# |" _! n' a5 @/ ]: ~) Q        os.remove('D:/Test/b站热门视频信息.xls')
    $ j, Y: w- C) `6 f0 X" T- k    workbook.save('D:/Test/b站热门视频信息.xls')6 n& O: k# B& G: J$ @- P7 ]
        print('写入excel成功')
    - B6 V% N  w* k8 k/ P( h$ I    print("文件位置:D:/Test/b站热门视频信息.xls")  c2 F# ~: g/ C- H% ~  P2 `$ l; l

    8 x' T1 Y/ U) t1 |
    % g6 @3 M2 s2 _; q9 R1 D6 P4.在入口main中调用上面两个函数
    1 a/ V' j* r2 N# ~! b完整代码如下:
    7 x" \" G2 I1 s0 yimport requests
    * H6 H- e; E) ^- J6 tfrom lxml import html
      _* h# q8 L% K2 Cimport xlwt
    ' ~, Z1 ~* q3 I: Z  x, cimport os, l* B# O; T8 H8 @$ @

    0 v9 L- A2 |- ?8 Z1 X) e2 h# 爬取b站热门视频信息2 }, {/ j' t: A
    def spider(video_list):! d. R+ c5 B# ?, m: [; Q8 m
        url = 'https://www.bilibili.com/ranking?spm_id_from=333.851.b_7072696d61727950616765546162.3'
    , L, @0 ^  F5 `2 j6 L5 f    html_data = requests.get(url).text' D! ]( V# ~: _0 b( n7 t
        selector = html.fromstring(html_data)
    ' `" B: I2 o$ M" ^3 h# {; E    infolist = selector.xpath('//li[@class="rank-item"]')0 b5 P0 |8 x$ u0 {3 k! A  Y
        for item in infolist:9 |: E6 d7 g) O
            rank = "".join(item.xpath('./div[@class="num"]/text()')); d- Z0 D- ~/ ]% y- _- h- z2 ?
            videolink = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/@href'))  ?+ |* l( K  |  r* d* ^
            title = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/text()'))
    ( I; O/ ]: j" c* G$ S$ P5 l        playinfo = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/span/text()')).split("万")2 ]& a$ ^( s8 l
            play = playinfo[0] + "万"( v- l  R2 {9 k& A
            comment = playinfo[1]
    ; g- j- w+ ~# r, p; C# j6 M        if comment.isdigit() == False:
    4 T" D% u! V4 ]% C4 H2 c  h! `- ^            comment += "万"
    ! F. p7 y3 E* y% n/ m" l+ m2 M        upname = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/span/text()'))  h- @5 i" w0 i, L
            uplink = "http:" + "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/@href'))
    4 k7 ?) l/ F9 v- a, o4 u( _6 e        hot = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="pts"]/div/text()'))" o- ^- A# f/ X4 K
            video_list.append({
    ) G6 Y9 r. r* s4 I) D$ o            'rank': rank,5 e" r, F( W. _& J
                'videolink': videolink,
    2 U9 K6 \1 t8 l. J  t            'title': title,
    : d. T, ]& A; [! b$ R0 E: M            'play': play,- ~( a, C, `, i2 U: H) \, G! \3 d
                'comment': comment,
    0 U* t5 T! K  a! t- X0 L% w" c- l" ]7 {$ T            'upname': upname,
    ' l% o* N: z- @: p* a+ F7 T            'uplink': uplink,
    + W: h( c& v+ s2 b             'hot': hot
    ' W6 ]# K' }. X2 o4 ^$ I+ b4 c7 ?        })7 C: m1 \+ a3 j' ?
        return video_list  g( C. f, O* a# W
    7 c! z) i* h& T
    # 将爬取到的数据写入Excel表格2 r1 f0 r( g8 t# d
    def write_Excel(video_list):
    * a' }  T# L& ^2 K3 D3 A6 e8 N: J    print("将b站热门视频信息导入到Excel表格:")1 U' h. p/ q( h3 ?$ k8 L8 j
        workbook = xlwt.Workbook()  # 定义workbook
    2 Q" e; ~( ^% i; t2 H3 f    sheet = workbook.add_sheet('b站热门视频')  # 添加sheet. C, b% a7 ^9 ?0 L3 |0 C
        xstyle = xlwt.XFStyle()  # 实例化表格样式对象+ j/ K/ a8 Z0 m5 n6 A
        xstyle.alignment.horz = 0x02  # 字体居中
    # |. \+ r; p3 p- K3 r    xstyle.alignment.vert = 0x01  # 字体居中
    ; g7 o- Y  v4 [  R9 Z4 ]4 j: F3 Y* K    head = ['视频名', 'up主','排名', '热度','播放量','评论数']  # 表头
    * U3 h9 v: w9 G, a7 p6 b9 h    for h in range(len(head)):. {6 m- ^- }3 q- {7 ^' T
            sheet.write(0, h, head[h],xstyle)  # 把表头写到Excel里面去
    4 t# ^) a4 @/ r2 A/ b) t    i = 1
    : P" |  s+ q. Z, _' X! H5 H    for item in video_list:" }; I* q5 o! P" ?( y$ c
            # 向单元格(视频名)添加(该视频的)超链接
    % l# h+ G2 Z% H2 x7 i        title_data = 'HYPERLINK("'+item["videolink"]+'";"'+item["title"]+'")'  # 设置超链接
    5 g' U9 L3 P: A7 e- d        sheet.col(0).width = int(256 * len(title_data) * 3/5)   # 设置列宽
    # D4 Q5 x9 e4 ]" Z) n# O        sheet.write(i, 0, xlwt.Formula(title_data), xstyle); ?/ V6 ~( H5 l& c* f! N$ n- q
            name_data = 'HYPERLINK("' + item["uplink"] + '";"' + item["upname"] + '")'  # 设置超链接
    % u, p- f. Q( A+ r+ z        sheet.col(1).width = int(256 * len(title_data) * 3 / 10): [, p. d+ m8 @5 L5 H+ M
            sheet.write(i, 1, xlwt.Formula(name_data), xstyle)8 J# K4 H9 k' _$ D. M& ^- D
            sheet.write(i, 2, item['rank'], xstyle). ?3 E' g" B9 M" \- w9 d! ~
            sheet.write(i, 3, item['hot'], xstyle)6 |! ~: Z: q# `6 d
            sheet.write(i, 4, item['play'], xstyle)
    - I% q5 l7 {# H) `# A7 M* N        sheet.write(i, 5, item['comment'], xstyle)
    * N: T; P( m( s. y& y8 M' f+ T1 D0 u        i += 19 V2 f. b  c+ n2 |& r) f3 D" g- S2 {
        # 如果文件存在,则将其删除+ y# j' j8 [" a2 \  D8 H, r
        if os.path.exists('D:/Test/b站热门视频信息.xls'):) ?9 a: F( b" Z, u
            os.remove('D:/Test/b站热门视频信息.xls')
    ; b1 Z9 v2 B7 H+ L6 D; X2 e    workbook.save('D:/Test/b站热门视频信息.xls')! F- w1 ~; x! L6 {! h" Y6 b
        print('写入excel成功')% u; `2 o, N2 L
        print("文件位置:D:/Test/b站热门视频信息.xls")# T" x  i) A: \+ m7 Q1 `! X1 _
    9 M! {& [5 s! t9 w
    if __name__ == '__main__':+ t0 {( Q0 B  C
        video_list = []
    . z/ h6 |8 F7 S: ]5 }$ q$ J    write_Excel(spider(video_list))
    , X" _& A8 d9 _; _  a5 b
    % W' [$ J$ `$ k5 k. }
    + z: ?6 r) j) q1 B; a3 z
      K# r  T  s) R2 c4 A9 S7 S6 _4 ^* x
    2 |& T; Z  d: p( G3 l
    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-2 04:45 , Processed in 0.496229 second(s), 53 queries .

    回顶部