QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 4412|回复: 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表格/ |; D. |+ D/ Q3 W, J# T5 r9 I
    效果图:$ E* A  v4 [) e( s7 y3 E" }
    1.png + s; R8 Y% O" y4 b. t& T7 s
    1.工先利其事必先利器,首先我们得下载相应的库:3 n( T, ^. o" Y
    pip install requests* w9 n6 U- p# v
    pip install lxml
    * B0 f( }- B& g' h% apip install xlwt
    : M5 @5 n3 M, X3 H: S8 N% g
    ' Q) @2 b7 y$ C& T! z. p6 z+ y, C" N/ I! y0 ^2 N, Y
    requests 向网页发送请求* Y8 n. m' {- q0 S, O
    lxml 处理xml文件(xpath)- h- f9 m) b$ c0 @9 l/ f
    xlwt 对Excel做写入操作
    0 @3 @2 M( N" p! E, `1 r/ g0 p2.爬取b站热门视频的信息:* N5 J0 G5 J0 M9 p& m* I
      打开b站热门视频页面:
    " ?! S, I; {) U2 T& }. ]' T 2.png ( s% \" j2 Z! H5 S( M
      按f12进入开发者选项,然后点击选中你要获取的页面信息,即可找到该信息在该HTML文件中的什么位置(这对我们用xpath获取元素属性和元素值很重要),例如:
    , E5 b; Y; F9 y& F0 i7 Q  k$ v 3.png 6 }; h* N- g6 t+ }8 a
    代码如下:
    " d! q' G6 [- B0 T. _% P& M# 爬取b站热门视频信息
    - y' B$ L4 J8 d3 Zdef spider(video_list):$ `0 r: G4 h' Q. J
        url = 'https://www.bilibili.com/ranking?spm_id_from=333.851.b_7072696d61727950616765546162.3'
    - S/ V! C" {9 P+ W, m) P( r    html_data = requests.get(url).text$ i1 f5 r, C) X( M- H/ h
        selector = html.fromstring(html_data)9 C/ E. `$ \7 z! g7 {
        infolist = selector.xpath('//li[@class="rank-item"]')
    " I2 P! }' w8 v1 U! c# u+ D    for item in infolist:0 I# i! H9 E! B$ _. r1 c* E
            rank = "".join(item.xpath('./div[@class="num"]/text()'))* P4 I2 l) n$ t: X8 y6 S
            videolink = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/@href'))* m' o) E! g0 Z1 [; f
            title = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/text()'))
    ! E# w) @' @' L7 t1 H6 ~8 {        playinfo = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/span/text()')).split("万")! V* O; j9 u/ I, d; q* U. x/ Q
            play = playinfo[0] + "万"" P7 G/ Z, i1 ~& k; \$ E  k1 o
            comment = playinfo[1]# k' h" a, R. V
            if comment.isdigit() == False:
    ; p) W. V1 b" V( I            comment += "万"
    $ N2 s" q5 @+ L8 A9 V        upname = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/span/text()'))
    . B% B3 L8 E7 x2 y        uplink = "http:" + "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/@href'))1 m, q; S/ B9 {# N, n, o4 |( Z
            hot = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="pts"]/div/text()'))" u( [8 m- z9 J
            video_list.append({
    $ D& R  j& N: y3 ^4 s7 f) E            'rank': rank,
    ) j* q. n  Q1 y6 x            'videolink': videolink,$ S" F6 K/ i% _5 Z% b' A7 \
                'title': title,, h2 w" u+ e7 Y+ h
                'play': play,
    8 J. X8 ]! g! o            'comment': comment,# J: e& F" A* L% ^& X6 H
                'upname': upname,
    . {$ t) r1 H" u+ M3 V  \            'uplink': uplink,) D& }/ L$ f/ J  r- g  J, H
                 'hot': hot
    4 `, J! U, x" y& z, s        })
      L! ~3 a% c3 b& n$ X2 o/ C! c    return video_list
    7 E  E1 ?3 f, U/ y. F9 r7 c  ]& R1 H5 d6 u" T4 f7 P

    % p, B9 `; A, f' D, Q$ j! q$ h3.将我们拿到的信息集合(video_list)写入到Excel表格中:8 [  |' _1 @: ^! h
      xlwt的基本使用方法:3 v1 [' V1 L5 i0 b9 ]
    import xlwt' p  P1 I- x* P1 s  i- B6 R
    # 创建一个workbook (并设置编码)5 i7 |2 }& K2 V7 ]' c
    workbook = xlwt.Workbook(encoding = 'utf-8')
    6 @8 I9 q% v& V) ~" _8 d+ I: ^, G# 创建一个worksheet1 [7 ?# g' v& n) A& D, P; Y
    worksheet = workbook.add_sheet('My Worksheet')1 ^9 q! H& j3 n5 s& m1 g7 W' x! I
    6 v9 w* r0 ]5 p+ r3 L" n
    # 写入excel
    . H' _8 H  Z- ~( c+ h/ e# 参数对应 行, 列, 值,(格式)
      M* i# U- A: J1 V1 V! r9 Kworksheet.write(1,0, label = 'this is test')2 _6 _# p% G/ i" |
    # 保存
    0 b( r4 c# Y: ?! T& x4 T#参数为你保存该Excel文件的路径3 k6 ~6 t5 l4 P  z0 J
    workbook.save('Excel_test.xls')
    % Q' \/ k7 O  t9 n: M+ s2 A! S0 R+ x

    4 k, v) P) {8 c# U' d% V  如果我们想要点击视频名或者up的名字可以跳转,那么我们就要使用Excel表格的HYPERLINK方法:* `/ e! U4 H/ U9 j. Z1 ]
    HYPERLINK(“http://www.baidu.com” ; “百度”)
    " j, x7 K! `) S) M+ p* l6 r4 W百度为显示在单元格的信息,而前面的链接为跳转链接。
    # e0 J1 m  ^  Y! j/ Cxlwt.Formula()方法需要传入一个字符串s,s=‘HYPERLINK(“http://www.baidu.com” ; “百度”)’。
    , }5 T* Q1 [( I7 i3 ]/ t代码如下:
    " |% m& V3 u- V# 将爬取到的数据写入Excel表格. T/ D: e: V* q2 f! @( Q7 W
    def write_Excel(video_list):
    + s) R/ q3 }  L& D6 g/ {, {    print("将b站热门视频信息导入到Excel表格:"). a# P5 H3 O# Y, a. ^1 \
        workbook = xlwt.Workbook()  # 定义workbook
    2 R/ j# u% E8 C% ?/ ^8 M! h    sheet = workbook.add_sheet('b站热门视频')  # 添加sheet
    , s; ~9 K( ^! E; e: k- n    xstyle = xlwt.XFStyle()  # 实例化表格样式对象- _4 e/ ~, {* g
        xstyle.alignment.horz = 0x02  # 字体居中+ H7 K+ K1 V9 @. U/ ?, n$ F, n
        xstyle.alignment.vert = 0x01  # 字体居中
    $ u' o) a" e1 p4 |( T    head = ['视频名', 'up主','排名', '热度','播放量','评论数']  # 表头
    0 q- M: E6 @# @) p) }5 v, B4 f" a    for h in range(len(head)):
    ! }+ ~9 U- t# _  ]        sheet.write(0, h, head[h],xstyle)  # 把表头写到Excel里面去
    : j- b* a/ |5 X/ e    i = 1/ j$ }  V9 L+ z( V3 {
        for item in video_list:& [+ w" u% f4 F) S' v4 \  D9 ?
            # 向单元格(视频名)添加(该视频的)超链接
    3 S) H0 C7 K6 ^- Q        title_data = 'HYPERLINK("'+item["videolink"]+'";"'+item["title"]+'")'  # 设置超链接; c9 i, H% p8 w
            sheet.col(0).width = int(256 * len(title_data) * 3/5)   # 设置列宽
    ) q- E  `9 X  N% |9 n8 F        sheet.write(i, 0, xlwt.Formula(title_data), xstyle)
    ) w; G0 v! `9 f. k* u4 p# V; ?2 N        name_data = 'HYPERLINK("' + item["uplink"] + '";"' + item["upname"] + '")'  # 设置超链接
    9 `& O+ f6 u% j4 u# w        sheet.col(1).width = int(256 * len(title_data) * 3 / 10)
    ( O; V4 x. W+ U& [        sheet.write(i, 1, xlwt.Formula(name_data), xstyle)
    , P: z- A$ K5 m* N# Q4 t* x# ]        sheet.write(i, 2, item['rank'], xstyle)" v0 i' Z* [" A% h$ K
            sheet.write(i, 3, item['hot'], xstyle)# }4 C1 N  h" m4 m, l" H
            sheet.write(i, 4, item['play'], xstyle)3 J; O/ c6 j# g, ?' U# ]& g
            sheet.write(i, 5, item['comment'], xstyle)8 L7 E" I% |; G" R8 |. |! O
            i += 1
    % t' x1 T! k7 j, x    # 如果文件存在,则将其删除
    / ?3 ~( {4 f- W    if os.path.exists('D:/Test/b站热门视频信息.xls'):
    ) I. F2 Y% {, Y: M        os.remove('D:/Test/b站热门视频信息.xls'). \* F; e* b, {! p* F
        workbook.save('D:/Test/b站热门视频信息.xls')
    ! v& R8 G( M( O9 F9 H7 U    print('写入excel成功')( q! [1 O4 E' s! Y0 A+ a; r$ |
        print("文件位置:D:/Test/b站热门视频信息.xls")
    ( z" N! K! D9 h3 F1 a% C& ~5 L; n$ b8 H% h+ j% m# ^% T
    ! g+ u5 _; t9 b, u8 Z6 T; F9 P% Q
    4.在入口main中调用上面两个函数9 r3 v! e- b2 G* v' P3 t6 T
    完整代码如下:# Q  c, M, C4 F& V6 g* e2 D
    import requests/ f! e2 B( N+ o2 z) `- Q
    from lxml import html
    2 u) D% ]) [" \4 W& D2 t5 b5 [import xlwt
    % q- G- {* N7 q- }import os
    5 B/ F0 O1 t& Z7 Q  N& g1 n/ S& E5 K3 r7 E+ h1 B* U+ s
    # 爬取b站热门视频信息
    ; V1 v& V; d) w/ E8 `* H! y$ mdef spider(video_list):
    % u2 |3 |6 }$ V- B4 f( C    url = 'https://www.bilibili.com/ranking?spm_id_from=333.851.b_7072696d61727950616765546162.3': i" }6 |1 D! E$ P' ~4 i; U
        html_data = requests.get(url).text
    ; f/ y3 Y9 \/ r- M; n/ T: Q+ ]    selector = html.fromstring(html_data)2 u3 E9 U+ \9 n* F2 }! f; j3 A6 |/ _% t
        infolist = selector.xpath('//li[@class="rank-item"]')1 S1 z( t: v9 g  L3 u' C' A3 Q+ w
        for item in infolist:
    7 N$ o1 s2 |" e, F# ^" L; L        rank = "".join(item.xpath('./div[@class="num"]/text()'))
      ~/ T) i% n0 _/ W( |& u& m* Q1 l        videolink = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/@href'))
    4 O( r5 z$ o. K7 ~0 L9 P; Y        title = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/a/text()'))
    * h; p* Z* X& X        playinfo = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/span/text()')).split("万")
    , N5 _8 z% D8 h        play = playinfo[0] + "万"4 O4 k5 S6 y) {$ w; i- J8 |/ G2 P4 L
            comment = playinfo[1]
    / I$ w% z  _/ I1 A! `        if comment.isdigit() == False:
    2 O2 d+ i4 H* p' d            comment += "万"& v  d5 A. P3 ?* D% N
            upname = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/span/text()'))7 k3 f/ M) }: x# W" {( i
            uplink = "http:" + "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/@href'))
    6 T! c- l% o" U0 ^. }+ S) y        hot = "".join(item.xpath('./div[@class="content"]/div[@class="info"]/div[@class="pts"]/div/text()'))
    ; a& `/ \8 Z8 [        video_list.append({, s5 Q$ `, y  D: O$ Y
                'rank': rank,
    2 J) m# E9 x8 R! S: b& P            'videolink': videolink,! T' t5 V' o* Q2 b/ _, K$ Q/ w1 u
                'title': title,' ]) l1 @3 O- @" y, M) S
                'play': play,
    ) a; N. q5 u, M% Y, E# z; d2 \2 i            'comment': comment,
    % K4 {" W; \. r' O            'upname': upname,
    0 T# \; E1 {6 O# Z# s            'uplink': uplink,8 e0 U3 R! R" K; a
                 'hot': hot( z* C8 S) o, _3 e3 t
            })" a) i8 P6 f$ Z1 X: A
        return video_list
    ; p2 U0 D7 {. Y8 y- U
    ' u, \( k! a8 {$ v! N# 将爬取到的数据写入Excel表格
    7 s# H  b7 G# Rdef write_Excel(video_list):9 L1 v. B' w$ E, E: A! G
        print("将b站热门视频信息导入到Excel表格:")
    * p7 D9 h3 ]! s4 S3 p' G    workbook = xlwt.Workbook()  # 定义workbook' @' d. N2 X5 W4 L
        sheet = workbook.add_sheet('b站热门视频')  # 添加sheet
    % n; y  l  t6 F4 v8 @  O) `) I* C    xstyle = xlwt.XFStyle()  # 实例化表格样式对象
    / Q" V2 ?6 g/ B" F5 F& E, ]! v    xstyle.alignment.horz = 0x02  # 字体居中
    3 ^& w+ d& [5 P, j, d    xstyle.alignment.vert = 0x01  # 字体居中
    1 n8 N2 y) h# O' f6 \    head = ['视频名', 'up主','排名', '热度','播放量','评论数']  # 表头# L# c" t( E. g8 X. Y+ G0 P- t
        for h in range(len(head)):9 G% `1 B% N# C, T& F
            sheet.write(0, h, head[h],xstyle)  # 把表头写到Excel里面去3 }- H, W  l: Q0 M5 s
        i = 1
    + r+ s% g* G* K' ]& }3 E    for item in video_list:
    1 ^' W) C' o1 r0 e* G$ j& M        # 向单元格(视频名)添加(该视频的)超链接
    ( u* M1 B0 ~4 o" u$ M% {1 |        title_data = 'HYPERLINK("'+item["videolink"]+'";"'+item["title"]+'")'  # 设置超链接- a; V1 ?+ O) C5 j; s4 [% F
            sheet.col(0).width = int(256 * len(title_data) * 3/5)   # 设置列宽  Z/ E2 F: q( X7 R
            sheet.write(i, 0, xlwt.Formula(title_data), xstyle)
    1 i7 N' Z+ X4 T& S        name_data = 'HYPERLINK("' + item["uplink"] + '";"' + item["upname"] + '")'  # 设置超链接8 S( T4 v5 O. W: @  [
            sheet.col(1).width = int(256 * len(title_data) * 3 / 10)5 q4 f" E. X& j0 O
            sheet.write(i, 1, xlwt.Formula(name_data), xstyle)0 K0 |4 R" {6 R6 O6 O$ t0 {! ^
            sheet.write(i, 2, item['rank'], xstyle)
    8 x# s1 q, Y- H8 k4 v        sheet.write(i, 3, item['hot'], xstyle)
    7 C# i3 `- |/ ]7 V, F" R        sheet.write(i, 4, item['play'], xstyle)
    6 R+ U0 r6 D* M6 }        sheet.write(i, 5, item['comment'], xstyle)  p" E1 V; j* f
            i += 1
    9 `+ A+ Z- Q! z    # 如果文件存在,则将其删除: e: r9 P. Y8 v- L# \9 b
        if os.path.exists('D:/Test/b站热门视频信息.xls'):( r  D, o1 n  A" L0 Z3 y
            os.remove('D:/Test/b站热门视频信息.xls')5 _. ~+ ^" Q* Z1 s! x+ _! `
        workbook.save('D:/Test/b站热门视频信息.xls')2 k: s) Y3 t3 Y8 X1 r) L' [
        print('写入excel成功')
    6 K2 {$ w( }; x& ~7 q/ D    print("文件位置:D:/Test/b站热门视频信息.xls")
    * W6 s7 c$ w2 v8 V; q7 P- O
    - @/ V2 C. ^2 g! b3 g3 ]if __name__ == '__main__':6 m6 ^0 v( W% S) Q% Q
        video_list = []
    ; ?# @# N. C" v6 k1 N    write_Excel(spider(video_list))
    8 s  @8 t: N2 \$ H- A: X+ R
    ( F/ m! K# G0 t4 {" b* L5 p# A' L% y+ ?; i
    4 F. d$ h& Y' w9 f# b4 N

    + ]" H- |6 W% k  j9 o* [& |7 q: Z/ c1 Y, E% A) c
    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-18 08:38 , Processed in 0.365239 second(s), 54 queries .

    回顶部