QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 4420|回复: 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表格, m- `8 W2 D1 E0 O- m9 M3 X3 \
    效果图:; K1 ]) {  X. Z) ^! @: h
    1.png 5 I$ }, g+ l: z4 J5 c
    1.工先利其事必先利器,首先我们得下载相应的库:
    0 @/ S5 q5 H; k2 K# D9 K2 wpip install requests- k8 e. l: P  D  A
    pip install lxml% ?, s1 G) D* |# G* M6 [3 l" B
    pip install xlwt
    " m" x( P7 ~- y+ W* p
    ; k0 k$ k$ M' o, s/ T% T" l6 n, M5 |7 E
    requests 向网页发送请求
    9 {* t1 I' _. K7 L& {lxml 处理xml文件(xpath)
    6 D$ l3 q/ F5 ixlwt 对Excel做写入操作
    ; v* j9 i4 q" N' V! Y/ o9 t6 r2.爬取b站热门视频的信息:
    " W9 H2 j$ T$ R! n# S6 ?  打开b站热门视频页面:  K* `5 q# N0 ?* d4 ?: U
    2.png 6 `* S/ h1 q# J7 w" s/ M" v, v! z: a
      按f12进入开发者选项,然后点击选中你要获取的页面信息,即可找到该信息在该HTML文件中的什么位置(这对我们用xpath获取元素属性和元素值很重要),例如:# c3 U9 n+ Z( b$ f
    3.png 5 |3 e( W# w4 _) I5 J8 F. c$ m& T
    代码如下:
    0 X# N& z6 C0 m. B" \! g3 {% }# 爬取b站热门视频信息
    ' t4 p9 `$ g" z: }2 ]def spider(video_list):
    ! F9 E/ X3 {' T    url = 'https://www.bilibili.com/ranking?spm_id_from=333.851.b_7072696d61727950616765546162.3'
    ) I* x* `4 a/ D% c1 [6 b5 o$ [5 }    html_data = requests.get(url).text" d5 Q9 z) O3 _: ?" U
        selector = html.fromstring(html_data)
    6 P) C2 C+ t! w% V    infolist = selector.xpath('//li[@class="rank-item"]')
    - T7 j+ G0 x- z( [    for item in infolist:
    * G5 a+ L( |) q7 ~$ H        rank = "".join(item.xpath('./div[@class="num"]/text()'))
      O3 d4 X  z+ r, B0 m# Q1 v7 d        videolink = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/@href'))
    , j+ k0 o7 f  x8 s/ B, Z6 [        title = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/text()'))
    : K$ U6 `7 Y; B6 Y6 A, {        playinfo = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/span/text()')).split("万")
    6 D- h. [) I1 W* X9 r# y, B! ~        play = playinfo[0] + "万". h5 }7 k' s1 `. X# Y# H
            comment = playinfo[1]
    . N) P% z% X+ G" V5 N/ R        if comment.isdigit() == False:8 Z4 A1 e( m& F& i5 H# p
                comment += "万"
    , a# N1 G" S' M        upname = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/span/text()'))
    8 s1 @4 ~! V/ C        uplink = "http:" + "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/@href'))
    3 @/ Q7 U( p9 ~        hot = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="pts"]/div/text()'))
    0 y/ @/ X# _- p' g        video_list.append({
    ; L+ @; x; n) T* E            'rank': rank,2 g2 T! s5 t5 _$ V$ H' i
                'videolink': videolink,/ y; j5 h" W* Q& {' n' c( B" [" N
                'title': title,
    ( h0 R" U! A# u            'play': play,
    / v3 `: Y5 }) x# G! m2 L            'comment': comment,: h2 }- _+ _* N
                'upname': upname,
    # Y5 `0 y1 f; V& C            'uplink': uplink,- h- ~5 s' z; `
                 'hot': hot
      W9 U8 y  H8 t2 b" j" m; K        })
    4 n; Z4 f' J, \& V/ y$ M7 i3 [    return video_list2 ~8 ]1 A2 C8 ~1 ~0 Q3 ~8 j( ?& `

    + m4 h, `9 M# V$ B

    $ |+ d; I5 }3 G8 {: Q6 Y3.将我们拿到的信息集合(video_list)写入到Excel表格中:
    % @" w& R" W; O, e+ Y7 @  xlwt的基本使用方法:. @" ]; V# ^8 F0 A' U4 A
    import xlwt- E2 p5 E9 }- E! P1 _% S
    # 创建一个workbook (并设置编码)/ _2 c8 {7 I# K% A" d' @0 Y! Q
    workbook = xlwt.Workbook(encoding = 'utf-8')4 p1 z/ k- \! w8 _8 O
    # 创建一个worksheet& G4 e5 X3 t) z8 {. o* C( V0 o
    worksheet = workbook.add_sheet('My Worksheet')
    & x8 m: Z) U$ y. x  R& {8 l+ X5 I# W8 j& r0 l) f4 M
    # 写入excel
    ' L4 e- o6 W8 Z+ p. d# 参数对应 行, 列, 值,(格式)
    " {( I0 j. f4 z- T% `8 h  z, ]) S" iworksheet.write(1,0, label = 'this is test')
    2 I* Y/ S( C- P2 s6 @# 保存
    4 }2 W8 W9 {( s+ d8 M( ~: Q#参数为你保存该Excel文件的路径" i  @" y: n1 [# q: n$ L/ C) f
    workbook.save('Excel_test.xls')
    ' m" k8 l, c0 d2 y
    , e4 f5 B3 ~. ^. Y8 h8 B/ O: h: c" I$ `% }
      如果我们想要点击视频名或者up的名字可以跳转,那么我们就要使用Excel表格的HYPERLINK方法:
    # I! x8 h) ]6 ]6 L. p$ a/ {1 M/ ?: BHYPERLINK(“http://www.baidu.com” ; “百度”)
    : }! {+ v5 X1 q" X1 E百度为显示在单元格的信息,而前面的链接为跳转链接。& ?. r7 _0 D6 O" Y. d. h9 ^
    xlwt.Formula()方法需要传入一个字符串s,s=‘HYPERLINK(“http://www.baidu.com” ; “百度”)’。4 U  Y3 y9 k8 R1 o3 Q
    代码如下:/ Y) k$ o. p& Z9 G, k( ]3 d9 [
    # 将爬取到的数据写入Excel表格7 {# c# b8 _+ I& k0 N  W4 ^% u
    def write_Excel(video_list):
    4 r( w) U) v" U& T4 [, R    print("将b站热门视频信息导入到Excel表格:")
    6 x' {5 b  F, W1 o) j    workbook = xlwt.Workbook()  # 定义workbook8 W' S$ ~, D# r+ X* U0 F
        sheet = workbook.add_sheet('b站热门视频')  # 添加sheet! S6 V4 L+ m+ l8 y* n
        xstyle = xlwt.XFStyle()  # 实例化表格样式对象% U% `  r1 v; u2 r1 d
        xstyle.alignment.horz = 0x02  # 字体居中
    " i+ [; j* O! Y    xstyle.alignment.vert = 0x01  # 字体居中  i5 \3 Z; b) ]3 x0 b: v
        head = ['视频名', 'up主','排名', '热度','播放量','评论数']  # 表头) e6 Q* ]# x/ ?* q  D8 j
        for h in range(len(head)):
    . a- n1 H' O5 \* Y5 f        sheet.write(0, h, head[h],xstyle)  # 把表头写到Excel里面去/ T& A  ^' S3 b- i) t) M& |( q
        i = 1
    7 {% M' M, E2 s3 m0 l9 [% T    for item in video_list:
    ( V/ w( e4 d; i4 A; D( I        # 向单元格(视频名)添加(该视频的)超链接  L/ F! [5 A' T- M" u1 i
            title_data = 'HYPERLINK("'+item["videolink"]+'";"'+item["title"]+'")'  # 设置超链接
    6 e& k' V4 k, @  y' |0 M        sheet.col(0).width = int(256 * len(title_data) * 3/5)   # 设置列宽- @- V* ]0 L7 M! \5 I# M& c* Q0 N
            sheet.write(i, 0, xlwt.Formula(title_data), xstyle)
    * h! S: t" g% }        name_data = 'HYPERLINK("' + item["uplink"] + '";"' + item["upname"] + '")'  # 设置超链接6 F" s; K, E3 x" b5 u+ ~
            sheet.col(1).width = int(256 * len(title_data) * 3 / 10)
    2 P  b8 |5 E; i- J  a, N        sheet.write(i, 1, xlwt.Formula(name_data), xstyle)
    9 i' Q9 m- f1 c- e2 c        sheet.write(i, 2, item['rank'], xstyle)
    ; h2 ^5 l5 h9 b- s/ G+ K& k        sheet.write(i, 3, item['hot'], xstyle)
    * f2 O1 E: }3 o        sheet.write(i, 4, item['play'], xstyle)/ m8 S8 g) e- A' H/ h0 w
            sheet.write(i, 5, item['comment'], xstyle)# c! @3 l7 K& n
            i += 1
    . b3 S" x0 B8 U* x# T( j+ P- I    # 如果文件存在,则将其删除
    * V' ]4 i4 x# c0 |    if os.path.exists('D:/Test/b站热门视频信息.xls'):. F8 v. Q& a+ b7 ^! S6 \7 R3 s
            os.remove('D:/Test/b站热门视频信息.xls')
    ' k2 E  M$ {. E4 ^2 m    workbook.save('D:/Test/b站热门视频信息.xls')" a& u8 N; ?. N7 Z
        print('写入excel成功')
    ) E4 ^+ d9 B: z. J5 U/ o    print("文件位置:D:/Test/b站热门视频信息.xls")4 _5 J1 b! Q- ]  E7 i* H
    7 P4 f  K! V9 U! @0 w7 Z. U
    * u/ c% H6 D5 |- i" b5 {4 e
    4.在入口main中调用上面两个函数* }: {$ F8 G- g" {
    完整代码如下:4 L5 Z9 I6 t% X2 g1 t
    import requests5 {4 G7 {6 ~" |1 {$ C7 z5 b- W8 a
    from lxml import html
    & V6 t+ S8 a7 Y! u" n) Oimport xlwt
    ) l' A* i% E! o5 wimport os
    / }2 L* ^! q, l0 `( P, i7 h9 H. d6 g3 ?, ~! V( \
    # 爬取b站热门视频信息
    ! R  W0 C  y0 X; g. xdef spider(video_list):  b! T0 s: _$ B
        url = 'https://www.bilibili.com/ranking?spm_id_from=333.851.b_7072696d61727950616765546162.3'
    3 K: ~5 P6 P, }# m  D    html_data = requests.get(url).text
    7 n3 ]) |( _7 n6 i    selector = html.fromstring(html_data), `/ o8 \  ?0 i* K' P& \, K
        infolist = selector.xpath('//li[@class="rank-item"]')
    - H7 }" f* K5 L7 _1 v. r    for item in infolist:* H5 u# x/ \4 s% N& C% g0 N' Y' q
            rank = "".join(item.xpath('./div[@class="num"]/text()'))/ a( j1 O" I' U' l
            videolink = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/@href'))! v+ z6 @' T; g0 F' `3 M+ P4 r
            title = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/text()'))$ A& D  O. l" y6 [
            playinfo = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/span/text()')).split("万")- J5 C) f( H0 A, U
            play = playinfo[0] + "万"
    ; V% l, [( c' ^1 [- s        comment = playinfo[1]
    , d  v1 o1 e7 y" s        if comment.isdigit() == False:1 x. h6 P& n7 x2 Y. v/ @% J
                comment += "万"; M* n  a& ^6 n
            upname = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/span/text()'))' q" t3 Y" V4 ]5 U) u
            uplink = "http:" + "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/@href'))( R$ i1 J$ J3 k# Q
            hot = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="pts"]/div/text()'))
    * Q3 M- h/ Q- v# m9 j) W' D' E: o        video_list.append({9 ?) ~0 I. I/ j( Q' m9 k
                'rank': rank,' B/ Q3 g" {- \
                'videolink': videolink,' x  |4 [' p* w) r- c
                'title': title,3 K; s: G  K, e/ T
                'play': play,% w1 H6 E' F9 A7 B1 ^
                'comment': comment,6 o& E5 W' C3 ^7 c% D1 f
                'upname': upname,% Y. K2 h, b( R! o
                'uplink': uplink,
    , A- Y! F& S/ S* x             'hot': hot; C5 L' }! G( {6 ^
            })
    / K7 S2 _  q! d! n% g    return video_list
    ! T% i0 [) i$ G2 m9 I  S
    9 `) x# o' b* ]$ \2 D, \# 将爬取到的数据写入Excel表格. {2 l# \+ V2 c0 E
    def write_Excel(video_list):, E# }/ z  C1 X5 r
        print("将b站热门视频信息导入到Excel表格:"), D' @" k' z1 p
        workbook = xlwt.Workbook()  # 定义workbook! e& V6 j, f$ Y$ {0 ^, m' T
        sheet = workbook.add_sheet('b站热门视频')  # 添加sheet8 x8 U/ i3 d6 n, V# h# i
        xstyle = xlwt.XFStyle()  # 实例化表格样式对象
    ( u2 U& d, A5 h1 D3 Z3 y: b    xstyle.alignment.horz = 0x02  # 字体居中3 @, X7 C/ V) m" |. P: A4 n
        xstyle.alignment.vert = 0x01  # 字体居中( b+ j. q1 b8 K1 F' {
        head = ['视频名', 'up主','排名', '热度','播放量','评论数']  # 表头7 k7 H3 ]8 ~0 p! M+ o3 e1 N
        for h in range(len(head)):
    9 W/ d, G$ W" G, u# g        sheet.write(0, h, head[h],xstyle)  # 把表头写到Excel里面去4 o3 _6 P5 O, o( v
        i = 1& n& \- K, r# Q2 d) Z
        for item in video_list:+ Q3 w# w) I7 O, F4 B& D
            # 向单元格(视频名)添加(该视频的)超链接9 h* m9 j! S& F: z8 l, x$ E
            title_data = 'HYPERLINK("'+item["videolink"]+'";"'+item["title"]+'")'  # 设置超链接
    ; i# c* H! ]- r+ P- W4 i        sheet.col(0).width = int(256 * len(title_data) * 3/5)   # 设置列宽
    : V+ E4 K$ O2 v/ n        sheet.write(i, 0, xlwt.Formula(title_data), xstyle)+ |% `" O+ M* m4 U# I( z. e- ]
            name_data = 'HYPERLINK("' + item["uplink"] + '";"' + item["upname"] + '")'  # 设置超链接4 {5 L6 M& n/ {+ m6 [
            sheet.col(1).width = int(256 * len(title_data) * 3 / 10)
    ' w0 q9 }9 z# `* ~        sheet.write(i, 1, xlwt.Formula(name_data), xstyle)2 V( D: i6 R, w& w. T8 j
            sheet.write(i, 2, item['rank'], xstyle)
    # w$ e3 p! @' R- s2 y        sheet.write(i, 3, item['hot'], xstyle)4 X* W- o6 Z" M% i- n$ z
            sheet.write(i, 4, item['play'], xstyle)) ]$ m+ i6 e/ e1 K3 A
            sheet.write(i, 5, item['comment'], xstyle)1 y! I+ W1 u' z4 {4 K1 S
            i += 1
    9 C2 }5 s. V2 p! W( y$ e    # 如果文件存在,则将其删除
    ; a) V, c+ j; M3 _% n# O4 L& u    if os.path.exists('D:/Test/b站热门视频信息.xls'):' O3 P* Z$ h2 l* ^
            os.remove('D:/Test/b站热门视频信息.xls')8 q1 B8 i) m: X) |0 u/ c* x) ?
        workbook.save('D:/Test/b站热门视频信息.xls')9 s; b- T- _; z
        print('写入excel成功')* t. y. u- M5 Y2 z7 c
        print("文件位置:D:/Test/b站热门视频信息.xls")
    / X: M# T; P1 f; t
    % m( i' c* h6 _, ~& aif __name__ == '__main__':+ G4 L# u$ c9 h7 S; i$ \
        video_list = []
    9 t6 T/ ?6 Z: ]  ^5 y3 ]: ~    write_Excel(spider(video_list))
    " A2 V2 r/ G- j/ `7 P8 t' k, m# ^7 B) z/ k% K- v
    * _: r! w6 G! A* t0 u! ~9 P

    # q. u3 ^2 k3 x2 n& @; f5 K6 f, n+ h7 v2 ?- A
    6 Y3 J; K1 Z5 a" g" A! g* w1 j
    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-4-21 10:08 , Processed in 0.410210 second(s), 54 queries .

    回顶部