Python爬虫之爬取哔哩哔哩热门视频排行榜

一、bs4解析

import requests
from bs4 import BeautifulSoup
import datetime
if __name__=='__main__':
    url = 'https://www.bilibili.com/v/popular/rank/all'
    headers = {
       //设置自己浏览器的请求头
    }
    page_text=requests.get(url=url,headers=headers).text
    soup=BeautifulSoup(page_text,'lxml')
    li_list=soup.select('.rank-list > li')
    with open('bZhanRank_bs4.txt','w',encoding='utf-8') as fp:
        fp.write('当前爬取热榜的时间为:'+str(datetime.datetime.now())+'\n\n')
        for li in li_list:
            #解析视频排行
            li_rank=li.find('div',class_='num').string
            li_rank='视频排行为:'+li_rank+','
            #解析视频标题
            li_title=li.find('div',class_='info').a.string.strip()
            li_title='视频标题为:'+li_title+','
            #解析视频播放量
            li_viewCount=li.select('.detail>span')[0].text.strip()
            li_viewCount='视频播放量为:'+li_viewCount+', '
            #解析弹幕数量
            li_danmuCount = li.select('.detail>span')[1].text.strip()
            li_danmuCount='视频弹幕数量为:'+li_danmuCount+', '
            #解析视频作者
            li_upName=li.find('span',class_='data-box up-name').text.strip()
            li_upName='视频up主:'+li_upName+', '
            #解析综合评分
            li_zongheScore=li.find('div',class_='pts').div.string
            li_zongheScore='视频综合得分为:'+li_zongheScore
            fp.write(li_rank+li_title+li_viewCount+li_danmuCount+li_upName+li_zongheScore+'\n')

爬取结果如下:

二、xpath解析

import requests
from lxml import etree
import datetime
if __name__ == "__main__":
    #设置请求头
    headers = {
       //设置自己浏览器的请求头
    }
    #设置url
    url = 'https://www.bilibili.com/v/popular/rank/all'
    #爬取主页面的源码文件
    page_text = requests.get(url=url,headers=headers).content.decode('utf-8')
    #使用etree对象进行实例化
    tree = etree.HTML(page_text)
    #爬取各视频的标签所在位置
    li_list = tree.xpath('//ul[@class="rank-list"]/li')
    #对爬取到的内容进行存储
    with open('./bZhanRank.txt', 'w', encoding='utf-8') as fp:
        #记录爬取数据的时间
        fp.write('时间:'+str(datetime.datetime.now())+'\n\n')
        # 使用循环结构,提取各标签中的所需信息
        for li in li_list:
            #读取视频排名
            li_rank=li.xpath('.//div[@class="num"]/text()')
            #[0]使用索引从列表中拿出字符串
            li_rank='视频排行:'+li_rank[0]+'\n'
            #读取视频标题
            li_title = li.xpath('.//a/text()')
            li_title='视频标题:'+li_title[0]+'\n'
            #读取视频播放量
            li_viewCount=li.xpath('.//div[@class="detail"]/span[1]/text()')
            #.strip()去掉字符串中多余的空格
            li_viewCount='视频播放量:'+li_viewCount[0].strip()+'\n'
            #读取视频弹幕数量
            li_barrageCount = li.xpath('.//div[@class="detail"]/span[2]/text()')
            li_barrageCount='视频弹幕数量:'+li_barrageCount[0].strip()+'\n'
            #读取视频up主昵称
            li_upName=li.xpath('.//span[@class="data-box up-name"]//text()')
            li_upName='视频up主:'+li_upName[0].strip()+'\n'
            #读取视频的综合评分
            li_score=li.xpath('.//div[@class="pts"]/div/text()')
            li_score='视频综合评分:'+li_score[0]+'\n\n'
            #存储文件
            fp.write(li_rank+li_title+li_viewCount+li_barrageCount+li_upName+li_score)
            print(li_rank+'爬取成功!!!!')

爬取结果如下:

三、xpath解析(二值化处理后展示图片)

#----------第三方库导入----------
import requests#爬取网页源代码
from lxml import etree#使用xpath进行数据解析
import datetime#添加爬取数据的时刻
from PIL import Image#用于打开和重加载图片
from cv2 import cv2#对图片进行二值化处理
from io import BytesIO#对图片进行格式转换
import re#对源代码进行正则处理
#----------函数----------
def dJpg(url,title):
    """
    输入url 然后对b站webp格式的图片 进行格式转换为jpeg后 进行保存
    :param url:(url)
    :return:(null+保存图片文件)
    """
    headers = {
            //设置自己浏览器的请求头
        }
    resp = requests.get(url, headers=headers)
    byte_stream = BytesIO(resp.content)
    im = Image.open(byte_stream)
    if im.mode == "RGBA":
        im.load()
        background = Image.new("RGB", im.size, (255, 255, 255))
        background.paste(im, mask=im.split()[3])
    im.save(title+'.jpg', 'JPEG')
def handle_image(img_path):
    """
    对RGB三通道图片进行二值化处理
    :param img_path:(图片路径)
    :return:(返回处理后的图片)
    """
    # 读取图片
    img = cv2.imread(img_path)
    # 将图片转化成灰度图
    gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
    # 将灰度图转化成二值图,像素值超过127的都会被重新赋值成255
    ret, binary = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
    return binary

#----------程序主入口----------
if __name__ == "__main__":
    #-----变量存放-----
    list_rank = []  # 存放视频标题的列表
    list_pic_url = []  # 存放图片网址的列表

    #-----数据解析(除图片外)-----

    #设置请求头
    headers = {
        'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36 SLBrowser/7.0.0.2261 SLBChan/10'
    }
    #设置url
    url = 'https://www.bilibili.com/v/popular/rank/all'
    #爬取主页面的源码文件
    page_text = requests.get(url=url,headers=headers).content.decode('utf-8')
    #使用etree对象进行实例化
    tree = etree.HTML(page_text)
    #爬取各视频的标签所在位置
    li_list = tree.xpath('//ul[@class="rank-list"]/li')

    #-----数据解析(图片)-----

    # 由于无法对图片的网址进行标签定位,现对源代码进行正则处理
    others_ex = r'"others".*?"tid"(.*?)]'
    list_others = re.findall(others_ex, page_text, re.S)
    # 使用循环替换掉源代码中others部分
    for l in list_others:
        page_text = page_text.replace(l, '')
    pic_ex = r'"copyright":.*?,"pic":"(.*?)","title":".*?"'
    list_pic = re.findall(pic_ex, page_text, re.S)
    # 获取图片url组成部分的索引
    index = list_pic[0].rfind('u002F')
    #对爬取到的url关键字进行拼接组成一个完整的url
    for i in list_pic:
        pic_url = 'http://i1.hdslb.com/bfs/archive/' + i[index + 5:] + '@228w_140h_1c.webp'
        list_pic_url.append(pic_url)

    #-----数据保存-----
    #对爬取到的内容进行存储
    with open('./bZhanRank2.txt', 'w', encoding='utf-8') as fp:
        #记录爬取数据的时间
        fp.write('b站视频排行榜,'+'时间:'+str(datetime.datetime.now())+'\n')
        fp.write('作者:MB\n')
        fp.write('*'*10+'以下为排行榜内容'+'*'*10+'\n\n')

        # 使用循环结构,提取各标签中的所需信息
        for i in range(len(li_list)):
            #读取视频排名
            li_rank=li_list[i].xpath('.//div[@class="num"]/text()')
            pic_title=li_rank#将不含中文的视频排行作为图片名称进行赋值
            #[0]使用索引从列表中拿出字符串
            li_rank='视频排行:'+li_rank[0]+'\n'
            #读取视频标题
            li_title =li_list[i].xpath('.//a/text()')
            li_title='视频标题:'+li_title[0]+'\n'
            #读取视频播放量
            li_viewCount=li_list[i].xpath('.//div[@class="detail"]/span[1]/text()')
            #.strip()去掉字符串中多余的空格
            li_viewCount='视频播放量:'+li_viewCount[0].strip()+'\n'
            #读取视频弹幕数量
            li_barrageCount = li_list[i].xpath('.//div[@class="detail"]/span[2]/text()')
            li_barrageCount='视频弹幕数量:'+li_barrageCount[0].strip()+'\n'
            #读取视频up主昵称
            li_upName=li_list[i].xpath('.//span[@class="data-box up-name"]//text()')
            li_upName='视频up主:'+li_upName[0].strip()+'\n'
            #读取视频的综合评分
            li_score=li_list[i].xpath('.//div[@class="pts"]/div/text()')
            li_score='视频综合评分:'+li_score[0]+'\n\n'
            # 存储视频信息(除图片外)
            fp.write(li_rank + li_title + li_viewCount + li_barrageCount + li_upName + li_score)

            #使用函数处理图片的url并且保存为jpeg格式
            dJpg(list_pic_url[i], str(pic_title))
            #使用函数对jpeg格式的饿图片进行二值化处理
            img = handle_image(str(pic_title) + '.jpg')

            # 强制设置图片大小(为防止记事本的行列大小溢出)
            img = cv2.resize(img, (120, 40))
            height, width = img.shape
            for row in range(0, height):
                for col in range(0, width):
                    # 像素值为0即黑色,那么将字符‘1'写入到txt文件
                    if img[row][col] == 0:
                        ch = '1'
                        fp.write(ch)
                    # 否则写入空格
                    else:
                        fp.write(' ')
                fp.write('*\n')
            fp.write('\n\n\n')
            print(li_rank + '爬取成功!!!!')

在记事本进行显示结果之前需要对记事本的格式进行下列更改以获得更好的视觉效果:

爬取结果如下:(图片展示,是下载网页中的的封面图片(webp格式),首先对其进行格式转换为jpg格式,然后对其进行二值化处理(对于像素值大于127的像素点直接赋值为0,对于像素值大于127的像素点直接赋值为1)。然后遍历所有的像素点,对于像素值为0的像素点(即为黑色),写入“1”,对于像素值为1的像素点(即为白色),写入“空格”,实现简单的图片模拟显示。)



水平线上和水平线下的图片并非一个时间点进行爬取。

上述图片为了均衡文字显示与图像显示之间的关系,所以图片大小强制设定为较小的尺寸,图片显示并不清晰。要让图片显示清晰,可以不考虑文字显现效果,将图片的尺寸设置较大并且更改记事本中的字体大小(以防串行),可以进行图片较为清晰的展示,如下图所示。

四、分析过程

(1)获取url——获取b站视频排行榜的网址

(2)获取请求头——(右击—检查),打开开发者工具,点击Network,随便选择一个数据包,复制其中的请求头即可

(3)网页分析——点击开发者工具左上角的抓手工具,选中页面中视频,发现每个不同的视频都存放在不同的li标签中

(4)网页分析——选中页面中视频的标题,发现标题内容存放在一个a标签的文本内容中,剩下的视频信息寻找方式同上述。

(5)网页分析——在查看到视频播放量信息时,发现其存放在span标签下,含有空格,在编写代码时,使用strip()方法进行去除空格

(6)调试代码——调试代码时,爬取的图片url的列表为空

(7)排错——检查图片url存放标签位置,发现位置正确

(8)排错——爬取信息为空,可能网页为减轻加载负担,使用的是JavaScript异步加载,在开发者工具中,点击XHR,在数据包中寻找存放图片url的数据包,发现并不存在

(9)排错——(右键—查看网页源代码),在源代码中搜索图片的url,发现所有图片的url全部存放在网页源代码的最后面,可以考虑使用正则表达式进行解析

(10)排错——使用正则解析的过程中,返现others列表,此列表为部分视频下方的视频推荐,需进行删除,否则影响正则表达式进行解析

到此这篇关于Python爬虫之爬取哔哩哔哩热门视频排行榜的文章就介绍到这了,更多相关Python爬取B站排行榜内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 用基于python的appium爬取b站直播消费记录

    基于python的Appium进行b站直播消费记录爬取 之前看文章说fiddler也可以进行爬取,但尝试了一下没成功,这次选择appium进行爬取.类似的,可以运用爬取微信朋友圈和抖音等手机app相关数据 正文 #环境配置参考 前期工作准备,需要安装python.jdk.PyCharm.Appium-windows-x.x.Appium_Python_Client.Android SDK,pycharm可以用anaconda的jupyter来替代 具体可以参考这篇博客,讲的算是很清楚啦 http

  • 使用python tkinter开发一个爬取B站直播弹幕工具的实现代码

    项目地址 https://github.com/jonssonyan... 开发工具 python 3.7.9 pycharm 2019.3.5 代码 import threading import time import tkinter.simpledialog from tkinter import END, simpledialog, messagebox import requests class Danmu(): def __init__(self, room_id): # 弹幕url

  • python 爬取B站原视频的实例代码

    B站原视频爬取,我就不多说直接上代码.直接运行就好. B站是把视频和音频分开.要把2个合并起来使用.这个需要分析才能看出来.然后就是登陆这块是比较难的. import os import re import argparse import subprocess import prettytable from DecryptLogin import login '''B站类''' class Bilibili(): def __init__(self, username, password, **

  • 使用python爬取B站千万级数据

    Python(发音:英[?pa?θ?n],美[?pa?θɑ:n]),是一种面向对象.直译式电脑编程语言,也是一种功能强大的通用型语言,已经具有近二十年的发展历史,成熟且稳定.它包含了一组完善而且容易理解的标准库,能够轻松完成很多常见的任务.它的语法非常简捷和清晰,与其它大多数程序设计语言不一样,它使用缩进来定义语句. Python支持命令式程序设计.面向对象程序设计.函数式编程.面向切面编程.泛型编程多种编程范式.与Scheme.Ruby.Perl.Tcl等动态语言一样,Python具备垃圾回收

  • Python如何爬取b站热门视频并导入Excel

    代码如下 #encoding:utf-8 import requests from lxml import etree import xlwt import os # 爬取b站热门视频信息 def spider(): video_list = [] url = "https://www.bilibili.com/ranking?spm_id_from=333.851.b_7072696d61727950616765546162.3" html = requests.get(url, h

  • Python爬虫自动化爬取b站实时弹幕实例方法

    最近央视新闻记者王冰冰以清除可爱和专业的新闻业务水平深受众多网友喜爱,b站也有很多up主剪辑了关于王冰冰的视频.我们都是知道b站是一个弹幕网站,那你知道如何爬取b站实时弹幕吗?本文以王冰冰视频弹幕为例,向大家介绍Python爬虫实现自动化爬取b站实时弹幕的过程. 1.导入需要的库 import jieba # 分词 from wordcloud import WordCloud # 词云 from PIL import Image # 图片处理 import numpy as np # 图片处理

  • python3写爬取B站视频弹幕功能

    需要准备的环境: 一个B站账号,需要先登录,否则不能查看历史弹幕记录 联网的电脑和顺手的浏览器,我用的Chrome Python3环境以及request模块,安装使用命令,换源比较快: pip3 install request -i http://pypi.douban.com/simple 爬取步骤: 登录后打开需要爬取的视频页面,打开开发者工具台,Chrome可以使用F12快捷键,选择network监听请求 点击查看历史弹幕,获取请求 其中rolldate后面的数字表示该视频对应的弹幕号,返

  • Python如何实现爬取B站视频

    5月3日晚,央视在<新闻联播>前播放了B站青年宣言片<后浪>,这是B站首次登陆央视黄金时段,今天在朋友圈陆续看到相关的视频.最早用B站的同学都知道,B站是和A站以异曲同工的鬼畜视频及动漫,进入到大众视野的非主流视频网站.哔哩哔哩现为国内领先的年轻人娱乐.文化社区,该网站于2009年6月26日创建,被粉丝们亲切的称为"B站". B站之所以火,是因为趣味与知识并存.它是一个重度宅腐二次元集结地.B站包含动漫.漫画.游戏,也有很多由繁到简.五花八门的视频,很多冷门的软

  • Python爬虫之爬取哔哩哔哩热门视频排行榜

    一.bs4解析 import requests from bs4 import BeautifulSoup import datetime if __name__=='__main__': url = 'https://www.bilibili.com/v/popular/rank/all' headers = { //设置自己浏览器的请求头 } page_text=requests.get(url=url,headers=headers).text soup=BeautifulSoup(pag

  • Python爬虫实例爬取网站搞笑段子

    众所周知,python是写爬虫的利器,今天作者用python写一个小爬虫爬下一个段子网站的众多段子. 目标段子网站为"http://ishuo.cn/",我们先分析其下段子的所在子页的url特点,可以轻易发现发现为"http://ishuo.cn/subject/"+数字, 经过测试发现,该网站的反扒机制薄弱,可以轻易地爬遍其所有站点. 现在利用python的re及urllib库将其所有段子扒下 import sys import re import urllib

  • Python爬虫实现爬取京东手机页面的图片(实例代码)

    实例如下所示: __author__ = 'Fred Zhao' import requests from bs4 import BeautifulSoup import os from urllib.request import urlretrieve class Picture(): def __init__(self): self.headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleW

  • python爬虫之爬取百度音乐的实现方法

    在上次的爬虫中,抓取的数据主要用到的是第三方的Beautifulsoup库,然后对每一个具体的数据在网页中的selecter来找到它,每一个类别便有一个select方法.对网页有过接触的都知道很多有用的数据都放在一个共同的父节点上,只是其子节点不同.在上次爬虫中,每一类数据都要从其父类(包括其父节点的父节点)上往下寻找ROI数据所在的子节点,这样就会使爬虫很臃肿,因为很多数据有相同的父节点,每次都要重复的找到这个父节点.这样的爬虫效率很低. 因此,笔者在上次的基础上,改进了一下爬取的策略,笔者以

  • Python爬虫实现爬取百度百科词条功能实例

    本文实例讲述了Python爬虫实现爬取百度百科词条功能.分享给大家供大家参考,具体如下: 爬虫是一个自动提取网页的程序,它为搜索引擎从万维网上下载网页,是搜索引擎的重要组成.爬虫从一个或若干初始网页的URL开始,获得初始网页上的URL,在抓取网页的过程中,不断从当前页面上抽取新的URL放入队列,直到满足系统的一定停止条件.爬虫的工作流程较为复杂,需要根据一定的网页分析算法过滤与主题无关的链接,保留有用的链接并将其放入等待抓取的URL队列.然后,它将根据一定的搜索策略从队列中选择下一步要抓取的网页

  • python 爬虫一键爬取 淘宝天猫宝贝页面主图颜色图和详情图的教程

    实例如下所示: import requests import re,sys,os import json import threading import pprint class spider: def __init__(self,sid,name): self.id = sid self.headers = { "Accept":"text/html,application/xhtml+xml,application/xml;", "Accept-Enc

  • Python爬虫将爬取的图片写入world文档的方法

    作为初学爬虫的我,无论是爬取文字还是图片,都可以游刃有余的做到,但是爬虫所爬取的内容往往不是单独的图片或者文字,于是我就想是否可以将图文保存至world文档里,一开始使用了如下方法保存图片: with open('123.doc','wb')as file: file.write(response.content) file.close() 结果就是,world文档里出现了一堆乱码,此法不同,我就开始另寻他法,找了很久也没有找到,只找到了关于Python操作world的方法. 于是我就开始了新的

  • Python爬虫实例——爬取美团美食数据

    1.分析美团美食网页的url参数构成 1)搜索要点 美团美食,地址:北京,搜索关键词:火锅 2)爬取的url https://bj.meituan.com/s/%E7%81%AB%E9%94%85/ 3)说明 url会有自动编码中文功能.所以火锅二字指的就是这一串我们不认识的代码%E7%81%AB%E9%94%85. 通过关键词城市的url构造,解析当前url中的bj=北京,/s/后面跟搜索关键词. 这样我们就可以了解到当前url的构造. 2.分析页面数据来源(F12开发者工具) 开启F12开发

  • Python爬虫之爬取淘女郎照片示例详解

    本篇目标 抓取淘宝MM的姓名,头像,年龄 抓取每一个MM的资料简介以及写真图片 把每一个MM的写真图片按照文件夹保存到本地 熟悉文件保存的过程 1.URL的格式 在这里我们用到的URL是 http://mm.taobao.com/json/request_top_list.htm?page=1,问号前面是基地址,后面的参数page是代表第几页,可以随意更换地址.点击开之后,会发现有一些淘宝MM的简介,并附有超链接链接到个人详情页面. 我们需要抓取本页面的头像地址,MM姓名,MM年龄,MM居住地,

  • Python 爬虫批量爬取网页图片保存到本地的实现代码

    其实和爬取普通数据本质一样,不过我们直接爬取数据会直接返回,爬取图片需要处理成二进制数据保存成图片格式(.jpg,.png等)的数据文本. 现在贴一个url=https://img.ivsky.com/img/tupian/t/201008/05/bianxingjingang-001.jpg 请复制上面的url直接在某个浏览器打开,你会看到如下内容: 这就是通过网页访问到的该网站的该图片,于是我们可以直接利用requests模块,进行这个图片的请求,于是这个网站便会返回给我们该图片的数据,我们

随机推荐