QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3824|回复: 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表格
    5 D( ]3 E- D9 b# R* |/ b效果图:$ i9 |8 h8 v) a' Z( V! ^
    1.png
    + T9 K* `: C! |. L) r- U3 c1.工先利其事必先利器,首先我们得下载相应的库:$ @1 d8 B4 g) W3 O
    pip install requests
    0 j4 ?+ ^$ G$ E7 Lpip install lxml
      M5 M$ R" N$ b; }) Gpip install xlwt
    ; U" Q6 i4 T4 y1 u4 }/ h
    # E% ?1 [6 C# o: a* `) V9 T) A+ A: T$ T" P" d  M* m
    requests 向网页发送请求
    2 E# A) F9 Z& O: x" [, vlxml 处理xml文件(xpath)- s9 Q. q! S+ W5 o
    xlwt 对Excel做写入操作1 ^* t) A& X" [1 F! A1 l
    2.爬取b站热门视频的信息:2 s) f7 {6 ~  u) ]) p
      打开b站热门视频页面:. P5 N0 K( p4 J( U1 ~+ }3 S& l
    2.png
    7 C- b& b9 N4 U1 r! U: h  按f12进入开发者选项,然后点击选中你要获取的页面信息,即可找到该信息在该HTML文件中的什么位置(这对我们用xpath获取元素属性和元素值很重要),例如:
    0 K( d) j$ N8 I 3.png 2 Y1 H3 @' L& j
    代码如下:
    ! m2 w/ _* p9 P& @5 f# 爬取b站热门视频信息
    3 f- E# H& l* z8 M6 U4 udef spider(video_list):
    4 O; o( ~. o9 u  i8 ]( t+ q9 G$ u4 w    url = 'https://www.bilibili.com/ranking?spm_id_from=333.851.b_7072696d61727950616765546162.3'
    . r2 @: E# f% @/ [4 V- u! P    html_data = requests.get(url).text9 D3 H+ i$ R  G, J8 o4 X
        selector = html.fromstring(html_data)
    3 M% D/ v% F, ~* `    infolist = selector.xpath('//li[@class="rank-item"]')
    - E4 m& ?# O" ~2 {/ B$ |    for item in infolist:
    " K7 K- o0 `/ J6 X9 @( Y        rank = "".join(item.xpath('./div[@class="num"]/text()'))
    . R8 ?7 j3 Z; V6 j0 i5 T        videolink = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/@href'))
    % a6 Z' B: }. n        title = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/text()'))
    - X8 R# V$ t) c3 [6 l' L, a( C7 g        playinfo = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/span/text()')).split("万")
    7 c# k) G6 A5 U7 _  \2 y% C        play = playinfo[0] + "万"
    8 J  t" @5 O4 U5 H; G2 z( X        comment = playinfo[1]$ ]( C# o# D! q: l  O
            if comment.isdigit() == False:1 [8 Q9 c" v% u/ s
                comment += "万"  A$ G  @" f  y( c; Y4 u+ C$ T
            upname = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/span/text()'))
    7 {  L" e8 d3 k2 [, s: d        uplink = "http:" + "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/@href'))  C$ c# j4 {- p- e+ E
            hot = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="pts"]/div/text()')). ~* \9 f0 n- v9 Y' ]# e
            video_list.append({
    $ z" c4 w: o' w! ~; P2 {5 F            'rank': rank,# u/ k7 N& Q4 e( R* A
                'videolink': videolink,8 }7 |% q* }* o
                'title': title,# e  @1 k0 @' @; E
                'play': play,
    # y1 I9 I8 x# n  A0 j. S            'comment': comment,0 S/ E- c' {, b# W; F
                'upname': upname,
    ) X6 L. @2 f  G) P% \  C            'uplink': uplink,
    7 S+ R( D) s) R9 M+ r& G             'hot': hot
    ! P6 b9 ?( T6 \' k. f* e" n        })6 i2 S; S/ z+ a9 d8 U- t2 u7 N& R7 N
        return video_list
    ! {! |0 z, j4 T* h$ ^/ C; I
    2 t$ k  P9 A) k7 H/ b8 p# S4 H! r: N

    ! x+ @" N2 c) R0 a! V6 ^  ]3.将我们拿到的信息集合(video_list)写入到Excel表格中:! R1 Y4 n" i# j) b9 J2 c
      xlwt的基本使用方法:
    1 \. v: a* n9 s  e7 W7 fimport xlwt
    2 {) p$ f" G$ `9 J; V9 p# 创建一个workbook (并设置编码); L- _) R5 R9 H" _, b
    workbook = xlwt.Workbook(encoding = 'utf-8')0 l4 w7 X, D# L* B* G' A. ^9 P
    # 创建一个worksheet3 M9 V2 Z1 M7 o
    worksheet = workbook.add_sheet('My Worksheet'); k4 T, ]; [0 i+ t
    9 P* x  \2 V# _) C
    # 写入excel
    : @6 x7 O+ ?( \3 V: P& }3 H# 参数对应 行, 列, 值,(格式)
    - ^# ?# s* v/ y6 ?) Rworksheet.write(1,0, label = 'this is test')5 J3 [- i3 V% o* m
    # 保存! M( Y; `+ W* c9 l, C3 q
    #参数为你保存该Excel文件的路径: W- ?% Z0 h; T, r! R3 x, I
    workbook.save('Excel_test.xls')8 q6 m+ X% Q/ a: o5 n7 d

    ; D0 C! s2 ^9 U0 K4 X" p" `  c% n4 ~) Y4 V% N
      如果我们想要点击视频名或者up的名字可以跳转,那么我们就要使用Excel表格的HYPERLINK方法:
    ' v; X" R- n5 QHYPERLINK(“http://www.baidu.com” ; “百度”), d& @! p' \1 K( ]5 D8 Z
    百度为显示在单元格的信息,而前面的链接为跳转链接。
    : \' L* r3 `- e# j# z7 X1 }1 H7 Xxlwt.Formula()方法需要传入一个字符串s,s=‘HYPERLINK(“http://www.baidu.com” ; “百度”)’。
    7 F6 S8 n% v2 U" C1 k* Z" V: L7 C2 u代码如下:
    5 L  X- F1 Q" W$ u# 将爬取到的数据写入Excel表格
    4 ~; z# S) \* ~4 r" C: xdef write_Excel(video_list):! p' x1 ~# K; T' D  m3 E8 A! a( ]
        print("将b站热门视频信息导入到Excel表格:")0 N; e/ o/ m/ a: Z+ O7 F
        workbook = xlwt.Workbook()  # 定义workbook  _/ N0 p) u& |) {
        sheet = workbook.add_sheet('b站热门视频')  # 添加sheet0 m  t: e0 e# R& P, f  S
        xstyle = xlwt.XFStyle()  # 实例化表格样式对象
    4 o& y2 z! @! A    xstyle.alignment.horz = 0x02  # 字体居中
    ) X) v0 ?! S8 V9 h! J0 |) ^    xstyle.alignment.vert = 0x01  # 字体居中
    - r- @4 q1 F( \" o    head = ['视频名', 'up主','排名', '热度','播放量','评论数']  # 表头4 W0 E  K* r& l1 s
        for h in range(len(head)):
    - D2 R! Q  y9 |- N        sheet.write(0, h, head[h],xstyle)  # 把表头写到Excel里面去/ Z6 x, N; I0 V# `' F0 K
        i = 1
    ' @$ d" W' O1 H! c% I' o; Z    for item in video_list:
    1 h6 Y# A) a( ~! u& `7 |% M        # 向单元格(视频名)添加(该视频的)超链接7 Z4 \3 P" m$ w; Y( A3 ?4 K/ y
            title_data = 'HYPERLINK("'+item["videolink"]+'";"'+item["title"]+'")'  # 设置超链接
    ; z* c: u" L: @2 H, D+ f        sheet.col(0).width = int(256 * len(title_data) * 3/5)   # 设置列宽
    6 i5 o! v. v$ x) H# i+ F( p        sheet.write(i, 0, xlwt.Formula(title_data), xstyle)+ |/ @- ~) j- \, \# f
            name_data = 'HYPERLINK("' + item["uplink"] + '";"' + item["upname"] + '")'  # 设置超链接8 p1 r9 N3 F' r# O* \
            sheet.col(1).width = int(256 * len(title_data) * 3 / 10), Q: ?. z3 J% ?* q* d
            sheet.write(i, 1, xlwt.Formula(name_data), xstyle)
    % x, Y; F* B' H5 k0 i5 u' Y% m5 e7 S        sheet.write(i, 2, item['rank'], xstyle)
    . H" ?/ k6 c* U6 \; @& }  ]        sheet.write(i, 3, item['hot'], xstyle)
    3 {+ @6 q+ [% \5 S% c        sheet.write(i, 4, item['play'], xstyle)
    3 J+ a5 y# P& q8 a& _9 n        sheet.write(i, 5, item['comment'], xstyle)3 C. O9 |* s+ f2 X6 A
            i += 1' [" o- z# J, x
        # 如果文件存在,则将其删除5 d# {% p; \3 j
        if os.path.exists('D:/Test/b站热门视频信息.xls'):$ C8 C0 x) F* R6 l' d7 p
            os.remove('D:/Test/b站热门视频信息.xls')2 R5 c1 _$ A1 K# {
        workbook.save('D:/Test/b站热门视频信息.xls')
    , [8 E/ r& G5 x( E* M; t1 E    print('写入excel成功')
    - \8 N2 X% a* [9 y5 i. w) j7 e    print("文件位置:D:/Test/b站热门视频信息.xls")* O9 ?! d3 `; j1 h
    % E- U, p" a! `. n

    7 H) f, ^- y0 I9 j/ n4.在入口main中调用上面两个函数
    7 D% F9 g# ^; E- i' K- o/ [. i完整代码如下:
      p& q/ i& ~! X. |/ t3 `) ]$ fimport requests
    " F8 S) P! y3 K2 ]( t4 Sfrom lxml import html
    ! O. v- L0 @: J) cimport xlwt* X* M2 S" [, L5 z2 y
    import os
    3 b9 B8 F& I/ q' D* j1 {! ^" o. l! L! M7 q3 K% V$ X
    # 爬取b站热门视频信息2 I& \* U* T: J, F( j; F# B$ y
    def spider(video_list):7 n- W, ^+ y( N0 n
        url = 'https://www.bilibili.com/ranking?spm_id_from=333.851.b_7072696d61727950616765546162.3'# k7 b- q3 z! P' E( p5 \4 y
        html_data = requests.get(url).text: Y" h4 o! c& W# H  j
        selector = html.fromstring(html_data)
    , e7 |2 C0 P( t! U% {( M    infolist = selector.xpath('//li[@class="rank-item"]')! m& ~$ I  E8 L- x3 A; ?9 }
        for item in infolist:5 r  G- @' O7 P. X' f. I% \. \
            rank = "".join(item.xpath('./div[@class="num"]/text()'))
    . ?* \3 U$ }5 k5 K7 i9 S' A        videolink = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/@href'))% P3 J: U/ W7 y/ N* v
            title = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/text()'))* O' ?  e3 Q4 C
            playinfo = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/span/text()')).split("万")2 g2 K! j0 }! s& k$ }
            play = playinfo[0] + "万"9 t8 C7 m3 E  |9 n
            comment = playinfo[1]
    % I' x$ }7 c) C. s& v, m        if comment.isdigit() == False:: A& l  ]" ^0 a' {
                comment += "万"
    ' t( d$ i* e  _# J        upname = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/span/text()'))
    ) Z9 V' b, D" O4 B        uplink = "http:" + "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/@href'))
    9 L# T/ a! M1 R* o/ j0 K% T, d6 w        hot = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="pts"]/div/text()'))$ O, g! Y" T( c# G, G/ {
            video_list.append({
    , h% K6 U# l& S  R            'rank': rank,. g& ?* Z8 W* u8 Z* ]
                'videolink': videolink,
    : T; r. b* r0 k5 [3 x. ^            'title': title,1 x# y/ s/ e2 |  O) B1 Z- i
                'play': play,1 `, y& t' x0 {- g: r, A6 d
                'comment': comment,- o/ ]0 l- c) H4 t" S
                'upname': upname,
    & L* a7 i; U! _0 X            'uplink': uplink,' b5 g( C0 }9 n  w  Y
                 'hot': hot
    8 H( S- h2 Q2 o        })
    ; b) m2 B9 ~$ R2 i/ b3 Q' X4 ~    return video_list9 R+ I! O' p! L; G3 R# A

    ( O9 w, v8 y2 B: V6 g# 将爬取到的数据写入Excel表格5 c% M! T; X) [) N) P' N7 \
    def write_Excel(video_list):
    0 l; u+ Y3 Z0 T% A, w) g: C    print("将b站热门视频信息导入到Excel表格:")
    6 {/ F2 t- g. `0 [    workbook = xlwt.Workbook()  # 定义workbook
    $ h3 W  U* \3 K1 |    sheet = workbook.add_sheet('b站热门视频')  # 添加sheet
    ' u+ u7 [4 h* r3 C. n    xstyle = xlwt.XFStyle()  # 实例化表格样式对象; P, z: b6 J$ G2 r4 D" u
        xstyle.alignment.horz = 0x02  # 字体居中& m5 T, r, k( y) X
        xstyle.alignment.vert = 0x01  # 字体居中8 ?8 H# M- L8 u
        head = ['视频名', 'up主','排名', '热度','播放量','评论数']  # 表头
    ! `. D$ r' X% M3 L8 }    for h in range(len(head)):1 N7 Q$ d; f6 R6 S5 ]
            sheet.write(0, h, head[h],xstyle)  # 把表头写到Excel里面去
    ( q. e+ V% @/ P  u2 U    i = 1* w+ T. @4 M3 z  C$ I3 G; ~" S: K
        for item in video_list:
    . N0 N  P6 X. M) ?4 Z        # 向单元格(视频名)添加(该视频的)超链接2 {' e" L# H) p" |: N' L
            title_data = 'HYPERLINK("'+item["videolink"]+'";"'+item["title"]+'")'  # 设置超链接% g+ T8 E8 l& ~5 e" r; Y
            sheet.col(0).width = int(256 * len(title_data) * 3/5)   # 设置列宽& U/ l% p* a! c9 Z) C* O; u' {) a
            sheet.write(i, 0, xlwt.Formula(title_data), xstyle)
    9 v5 V& g* @% y( z2 T        name_data = 'HYPERLINK("' + item["uplink"] + '";"' + item["upname"] + '")'  # 设置超链接, t. p! [- y5 g4 O
            sheet.col(1).width = int(256 * len(title_data) * 3 / 10)+ }: \+ y7 }* p! e
            sheet.write(i, 1, xlwt.Formula(name_data), xstyle)
    # x5 X# `! s6 I: D0 S  w        sheet.write(i, 2, item['rank'], xstyle)
    $ q, E6 \& R! O3 c% y  O5 f        sheet.write(i, 3, item['hot'], xstyle)
    ' h2 H2 P5 q  P% L, `- @4 M, j        sheet.write(i, 4, item['play'], xstyle)' Y5 a" F2 Z$ h; k
            sheet.write(i, 5, item['comment'], xstyle)
      x  y2 \: a6 I5 i- o% Q        i += 15 B9 U1 f0 s2 g9 D7 @$ S
        # 如果文件存在,则将其删除
    ; \' B( u" o* I9 W, p8 P- a8 E    if os.path.exists('D:/Test/b站热门视频信息.xls'):  `6 B! {! j# Y2 Z6 |$ u$ @) x( h2 a
            os.remove('D:/Test/b站热门视频信息.xls')! S$ G$ A( k: Z1 i: A2 N' H
        workbook.save('D:/Test/b站热门视频信息.xls')
    : `4 |$ G% ?! \6 p5 d    print('写入excel成功')
    & K+ F5 l2 G' B# z6 I6 t1 u    print("文件位置:D:/Test/b站热门视频信息.xls")
    ' n3 C5 J) _& i; W9 M3 r2 D. R6 f. \
    1 T# P2 i8 w0 @if __name__ == '__main__':1 H4 Q& c0 S. l! p
        video_list = []
    1 u. w: m+ ^8 W    write_Excel(spider(video_list))
    0 P! `; b3 p  i8 M9 [8 V- @( U# d! E- O7 j

    ; U1 {5 ^: p3 |% E; G& a0 W
    # n- _! W; B; \9 m% \1 F% V+ b$ ]6 o# J8 `; L( W1 R
    . m, C( g' O+ w" p. G( G- R# N
    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, 2025-8-20 00:19 , Processed in 0.491033 second(s), 54 queries .

    回顶部