QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3823|回复: 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表格; Q: x! e4 g  J7 J) l' N' n
    效果图:
    / m0 B" i. {$ w  |; N 1.png
    " G: k1 |# f1 Z9 z; \+ K- e) b& K1.工先利其事必先利器,首先我们得下载相应的库:
    3 s8 j; P- h  H; B0 bpip install requests4 x5 }# w9 i  }; w  Y% {+ W
    pip install lxml
      D$ V3 G. v2 Q1 ^pip install xlwt
    . R2 Q2 U) ]2 n: @+ ]0 ^) J9 U7 m1 o+ ]/ f" ]# W
    , F, b# u) j% P0 c9 p! A' t  T
    requests 向网页发送请求3 f) M- e+ P+ @$ P; p
    lxml 处理xml文件(xpath)
    + r9 K- Q9 m/ Ixlwt 对Excel做写入操作$ x2 }, ?3 H9 j! Q/ r5 K+ L+ Z
    2.爬取b站热门视频的信息:
    " r/ \: u& I9 e2 l2 H  打开b站热门视频页面:
    % M- \( r$ F- I7 G" Y 2.png
      \# }3 d* a) X$ r5 I4 I# G& {# T, d  按f12进入开发者选项,然后点击选中你要获取的页面信息,即可找到该信息在该HTML文件中的什么位置(这对我们用xpath获取元素属性和元素值很重要),例如:
    ) _$ n: x4 f+ y. s0 ?) c2 J. m+ ` 3.png 4 v5 q$ Q+ `& ^( }" S! ^! ]
    代码如下:& Z6 o: ^: ^# {, w( X
    # 爬取b站热门视频信息
    1 O$ U6 h) l3 ^; ?3 o0 [def spider(video_list):
    $ c- z3 p# u& r8 m- ^    url = 'https://www.bilibili.com/ranking?spm_id_from=333.851.b_7072696d61727950616765546162.3'9 \" @! G8 d0 L) z) d& u
        html_data = requests.get(url).text! B" i0 p) K; l
        selector = html.fromstring(html_data)
    & S4 g. P8 N  {, s+ G    infolist = selector.xpath('//li[@class="rank-item"]')
    7 o2 w3 }9 c* e    for item in infolist:& p! n: j; H5 K* [* N, Q
            rank = "".join(item.xpath('./div[@class="num"]/text()'))
    ; f2 X: {0 t& V& K0 [# U; ^        videolink = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/@href'))% j' Z0 c. n0 {6 }, T$ m; Q9 c, X
            title = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/text()')): ]0 }2 R- K+ u" g- {6 {
            playinfo = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/span/text()')).split("万")" Y+ r4 H( u1 P, w9 J
            play = playinfo[0] + "万"4 w. ^. G! [: S" C
            comment = playinfo[1]( V- G3 G" ?+ R0 g2 Q! I
            if comment.isdigit() == False:, @# v7 C# W' v6 Z2 v
                comment += "万"' I! a+ \* x3 T- l+ S2 k$ V1 K
            upname = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/span/text()'))
    5 x+ Q5 |$ j8 N+ e8 T' N* o        uplink = "http:" + "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/@href'))" w( \$ k% V( a
            hot = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="pts"]/div/text()'))
    3 X# y- z6 b$ I' o* D$ K        video_list.append({2 u) z. y) e" d, b; v; M- y
                'rank': rank,4 j9 u& }) Y4 R% |. U8 r5 _
                'videolink': videolink,9 [$ J9 p0 E: F. w8 {2 e
                'title': title,- e5 J2 M. W) x* Q; m+ H* s. R
                'play': play,/ v& O# n+ e( c3 O$ g; U4 `
                'comment': comment,8 m' X' l$ T* B$ Q6 r5 H
                'upname': upname,: G7 m& X) V. h) q: b5 u
                'uplink': uplink,
    2 v3 i* Z0 s8 n3 W; ?             'hot': hot
    $ T: P0 O2 R5 I; k4 l4 L9 h& n; a        })
    $ F; z: D) A- }1 q    return video_list
      |' c+ H8 f4 o% T& J1 e: d5 ]# k& W

    0 h5 Q1 @$ n* x/ b3 w3.将我们拿到的信息集合(video_list)写入到Excel表格中:: ]7 l7 d- g' j
      xlwt的基本使用方法:
    * ?% i1 d# O0 n4 J2 Yimport xlwt7 _& Z" ~7 ]9 p$ n" [) S) Z
    # 创建一个workbook (并设置编码)  |+ O# {4 X5 s3 K0 H1 [
    workbook = xlwt.Workbook(encoding = 'utf-8')
    , o$ ^: Q3 u8 p; g& S% `4 `% [# 创建一个worksheet
    ! T; `5 g% e) g3 E% b1 Y: e% y! w1 vworksheet = workbook.add_sheet('My Worksheet')
    : V; M, c) E+ H' p0 e! D( V' s$ S4 j, _3 b
    # 写入excel0 ^7 m, @+ a. W+ u/ R- Z/ f
    # 参数对应 行, 列, 值,(格式)6 S( d* \0 q! p9 }( f0 s2 u
    worksheet.write(1,0, label = 'this is test')# @; j4 l" A  w3 n# o
    # 保存" T2 ]/ d3 {) R! Q, P
    #参数为你保存该Excel文件的路径, S2 V% j* q- e0 S0 f; i$ _
    workbook.save('Excel_test.xls')9 [4 o  W, W0 O5 W* ?
    6 O, s) P; w8 `  F$ c; k
    : `" N; }5 E+ ?- q
      如果我们想要点击视频名或者up的名字可以跳转,那么我们就要使用Excel表格的HYPERLINK方法:
    " A. B0 K% S, A4 M5 ^HYPERLINK(“http://www.baidu.com” ; “百度”)
    9 U( g/ T& \) L0 x% I/ L2 T- a; l) e百度为显示在单元格的信息,而前面的链接为跳转链接。9 w5 j8 L7 n7 V
    xlwt.Formula()方法需要传入一个字符串s,s=‘HYPERLINK(“http://www.baidu.com” ; “百度”)’。
    6 L% G4 ^' h& I+ G2 U6 _5 }代码如下:
    " |5 h" ~( `! H' _. N/ f  T# 将爬取到的数据写入Excel表格
    1 b' v+ D& [( l! [+ h  N: Zdef write_Excel(video_list):
    - b& f; K% Z" _6 Y    print("将b站热门视频信息导入到Excel表格:")5 [; d5 u( i* E; C" w) I
        workbook = xlwt.Workbook()  # 定义workbook+ U" O6 i/ p- H: r  W8 p
        sheet = workbook.add_sheet('b站热门视频')  # 添加sheet
    ) H6 n# u2 w! t$ \0 Q    xstyle = xlwt.XFStyle()  # 实例化表格样式对象
    3 K* t% \# N6 e* X    xstyle.alignment.horz = 0x02  # 字体居中+ `/ r9 X) g, y
        xstyle.alignment.vert = 0x01  # 字体居中
      c, u$ \0 V7 ^$ i9 O7 P    head = ['视频名', 'up主','排名', '热度','播放量','评论数']  # 表头
    / }: O" ?2 v) I  d& y    for h in range(len(head)):$ K& X6 x# ]# Z& b) v" l
            sheet.write(0, h, head[h],xstyle)  # 把表头写到Excel里面去2 |& P# J$ j2 z) u
        i = 1
    / o, J8 K7 e: [    for item in video_list:
    3 {. G7 c1 \9 P1 s% w        # 向单元格(视频名)添加(该视频的)超链接5 L% U/ ^9 E. `1 I/ S8 ?) G2 ?
            title_data = 'HYPERLINK("'+item["videolink"]+'";"'+item["title"]+'")'  # 设置超链接
    2 }( c' I$ H$ q/ D        sheet.col(0).width = int(256 * len(title_data) * 3/5)   # 设置列宽$ q# e3 a- y( j; {5 T
            sheet.write(i, 0, xlwt.Formula(title_data), xstyle)8 y  D3 [  u7 R4 p6 J9 v: p
            name_data = 'HYPERLINK("' + item["uplink"] + '";"' + item["upname"] + '")'  # 设置超链接: a+ C/ G) S; M5 s
            sheet.col(1).width = int(256 * len(title_data) * 3 / 10)
    ' A" b% F: I; W& q& o4 h        sheet.write(i, 1, xlwt.Formula(name_data), xstyle)
    - P( \5 k4 @$ e        sheet.write(i, 2, item['rank'], xstyle)' p/ v+ I2 F, _) i; U
            sheet.write(i, 3, item['hot'], xstyle)& d0 }  M! j8 q4 D8 B9 _- O6 L
            sheet.write(i, 4, item['play'], xstyle)
    1 }0 M- a# C% v! p+ j7 U        sheet.write(i, 5, item['comment'], xstyle)
    8 Y& W4 C, V. T) ?        i += 1
    ( `  ]& M5 s- g9 L    # 如果文件存在,则将其删除8 j! o3 ^3 }2 c; A, [+ k' t
        if os.path.exists('D:/Test/b站热门视频信息.xls'):
    ' h9 \) n0 v- g5 b        os.remove('D:/Test/b站热门视频信息.xls')0 X; J1 L0 c  }2 B, ?
        workbook.save('D:/Test/b站热门视频信息.xls'). k, z  Q; z0 W6 U- y4 ^# P5 M
        print('写入excel成功')
      o2 O3 W* l* s    print("文件位置:D:/Test/b站热门视频信息.xls")
    5 t3 Z9 d6 J( h3 E, m8 L6 W% K" h( [8 |5 q$ P: _" D
    " P2 e6 Z6 ?& B5 U1 y, j
    4.在入口main中调用上面两个函数" ]! Z/ [4 `1 \8 C+ D
    完整代码如下:
    1 B! V8 E# ?6 }0 Y0 Simport requests1 A# z& e6 j; b' h
    from lxml import html
    $ @6 y" q. |& G" I% s- t7 Zimport xlwt
    $ t8 d3 D4 ?, a" q  cimport os" q: t; k8 C0 D* n$ u6 F

    4 E: B& K5 ]: ~" P# 爬取b站热门视频信息: j- j) t1 N; J
    def spider(video_list):. ^5 J2 b$ X' y' ?" f- a
        url = 'https://www.bilibili.com/ranking?spm_id_from=333.851.b_7072696d61727950616765546162.3'
    : `; R% k" F- D: D. ^9 {5 b    html_data = requests.get(url).text
    ( _/ ]4 l8 r( @0 G8 N; e* g    selector = html.fromstring(html_data)" u6 }* @3 [$ i# @
        infolist = selector.xpath('//li[@class="rank-item"]'): F1 v' B8 Y- d# K/ e2 T, D+ c, O/ J
        for item in infolist:8 t: I' |9 r6 A+ M9 T! c: v# Y0 i2 O
            rank = "".join(item.xpath('./div[@class="num"]/text()'))
    ! h( Z, Q( M- y/ {        videolink = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/@href'))0 Q( B- \' Z; I+ a
            title = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/text()'))
    3 ?' i* ^; P. L        playinfo = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/span/text()')).split("万")
    ! @0 J2 }1 w( D* n0 z5 U" {! j        play = playinfo[0] + "万"7 j: m% @( B" t2 h  ?) s4 E% a/ l) p
            comment = playinfo[1]( X) X8 M- q3 X! L' s
            if comment.isdigit() == False:( J6 o2 W/ h6 J( x7 Y7 {
                comment += "万"
    4 h0 ^/ k0 d7 A        upname = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/span/text()'))
    * E6 ]- n0 F1 r1 n        uplink = "http:" + "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/@href'))+ i  }% f5 {$ l$ e' \! w
            hot = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="pts"]/div/text()'))
    / f( I0 ]/ g+ v9 j- \, |& F! T2 `        video_list.append({- `# u0 s* A6 s/ O$ P8 [0 m
                'rank': rank,
    , S6 _7 w) H/ w, E7 w5 X            'videolink': videolink,7 i5 J' G, G+ s- F
                'title': title,  p* Q, G! R- @% c& Y+ N
                'play': play,/ y$ K2 b% ]/ u. d; H# [  K
                'comment': comment,5 l# M+ G) t* \& k, f( J4 w1 |
                'upname': upname,
    5 r% b3 g; ]9 v5 V6 F1 I            'uplink': uplink,6 K& u0 p4 I# K" _0 K
                 'hot': hot9 [. N4 Q2 G* {' M0 X- X3 z' z0 ?
            })' l( m/ H/ u- G6 ^  J
        return video_list
    * F( L5 Z- j* U% G1 C
    ! V! e6 a4 Y: z* Z8 y4 M# 将爬取到的数据写入Excel表格
    , B8 @6 ~# n9 J/ i5 {def write_Excel(video_list):1 A9 W. U" H% X  J5 \9 u' D
        print("将b站热门视频信息导入到Excel表格:")
    ! a' |4 F+ X( l4 q& [6 S2 p  R    workbook = xlwt.Workbook()  # 定义workbook' s# e% B9 F2 `! I: p, x0 [
        sheet = workbook.add_sheet('b站热门视频')  # 添加sheet
    # a8 f. V* P" ]& A/ c" q: e    xstyle = xlwt.XFStyle()  # 实例化表格样式对象  F, o$ ~0 Y7 u0 K/ E6 ]& u: f
        xstyle.alignment.horz = 0x02  # 字体居中
    4 n, V* S: k" `$ C    xstyle.alignment.vert = 0x01  # 字体居中
      Q, i' q+ A; Y/ ?& d' p    head = ['视频名', 'up主','排名', '热度','播放量','评论数']  # 表头7 p% S4 W! m# M. h4 p, w
        for h in range(len(head)):! N' X" Q# K3 ~) k8 N
            sheet.write(0, h, head[h],xstyle)  # 把表头写到Excel里面去5 l+ I5 U. C! V* q% [' u
        i = 1+ B5 Q# o4 T( j* @
        for item in video_list:
    8 ]0 {# _$ P* Q        # 向单元格(视频名)添加(该视频的)超链接
    : s. `: d% @, j2 h3 _# c        title_data = 'HYPERLINK("'+item["videolink"]+'";"'+item["title"]+'")'  # 设置超链接2 U0 U$ ^& v, M1 s
            sheet.col(0).width = int(256 * len(title_data) * 3/5)   # 设置列宽
    5 L- L* b% `" j5 B9 F" H        sheet.write(i, 0, xlwt.Formula(title_data), xstyle)5 h, g! r* x( [5 a: f2 D
            name_data = 'HYPERLINK("' + item["uplink"] + '";"' + item["upname"] + '")'  # 设置超链接
    8 c3 _) q) [: A. j$ O        sheet.col(1).width = int(256 * len(title_data) * 3 / 10)
    , k. T- B5 w7 U+ n( o' G        sheet.write(i, 1, xlwt.Formula(name_data), xstyle)1 d# A" k* Z. W6 P/ i
            sheet.write(i, 2, item['rank'], xstyle)3 {4 a; ]& `+ k9 j) e8 p7 z
            sheet.write(i, 3, item['hot'], xstyle)" N% _# q) G  T6 _
            sheet.write(i, 4, item['play'], xstyle)
    # @# K7 X  o6 A3 v3 B, h        sheet.write(i, 5, item['comment'], xstyle)
    8 ^3 Q7 P, `; h3 h* {- V        i += 1
    , K  H5 U3 T$ M3 p- |  u    # 如果文件存在,则将其删除" B" x! `7 E3 R0 w6 P
        if os.path.exists('D:/Test/b站热门视频信息.xls'):
    ) X  p, P! [% A: Z$ @        os.remove('D:/Test/b站热门视频信息.xls')$ p5 R* L" F) u- }4 v
        workbook.save('D:/Test/b站热门视频信息.xls')
    - g: _: G4 i0 h    print('写入excel成功')- R0 X2 v5 l+ Y) A# }* @
        print("文件位置:D:/Test/b站热门视频信息.xls")' w( a( d8 c0 U0 S" N

    * ?* S& _: Z5 ^6 D5 j6 l& Bif __name__ == '__main__':7 o1 `; o* @$ G* @5 J
        video_list = []" m0 y0 ~6 @; r  l7 @0 `
        write_Excel(spider(video_list))
    : x$ Y) {. N, v% v: V* p3 R" T+ Z6 u' c0 y  k3 O
    4 q; `* t+ T+ P- M' H  t& T

    - b2 u9 m' h# v5 m8 a7 J3 B: ^8 |
    * v$ ~. p) o4 e0 [8 z
    6 w: g$ K/ {* M4 r- `% N$ V5 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-19 14:24 , Processed in 1.686934 second(s), 53 queries .

    回顶部