菜鸟弟弟从零开始的爬取Bilibili弹幕的Python爬虫教程-哔哩哔哩 - ( ゜- ゜)つロ 干杯~

从零开始的爬取Bilibili弹幕的Python爬虫教程

或许可以作为一个爬虫小白的练手的demo?

还是先看看什么是爬虫吧!(还有Bilibili!

网络爬虫:
网络爬虫(又称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。另外一些不常使用的名字还有蚂蚁、自动索引、模拟程序或者蠕虫。-----百度百科

B站:
哔哩哔哩(Nasdaq:BILI ;英文名称:bilibili,简称B站)现为中国年轻世代高度聚集的文化社区和视频平台 ,该网站于2009年6月26日创建,被粉丝们亲切的称为“B站”。2018年3月28日,哔哩哔哩在美国纳斯达克上市 。
B站早期是一个ACG(动画、漫画、游戏)内容创作与分享的视频网站 。经过十年多的发展,围绕用户、创作者和内容,构建了一个源源不断产生优质内容的生态系统 ,B站已经涵盖7000多个兴趣圈层的多元文化社区 。
2019年4月22日,针对“后台源码泄露”一事,B站做出回应:经内部紧急核查,确认该部分代码属于较老的历史版本;5月29日,哔哩哔哩发布通知称,因弹幕系统技术升级,5月29日起至6月6日网站暂时关闭弹幕功能。
截至2019年第三季度,B站月均活跃用户达1.28亿,移动端月活用户达1.14亿 ;18至35岁用户占比达78%。
2020年1月9日,胡润研究院发布《2019胡润中国500强民营企业》,哔哩哔哩位列第180位。

爬虫的背景

随着网络的迅速发展,万维网成为大量信息的载体,如何有效地提取并利用这些信息成为一个巨大的挑战。搜索引擎(Search Engine),例如传统的通用搜索引擎AltaVista,Yahoo!和Google等,作为一个辅助人们检索信息的工具成为用户访问万维网的入口和指南。但是,这些通用性搜索引擎也存在着一定的局限性,如:
(1)不同领域、不同背景的用户往往具有不同的检索目的和需求,通过搜索引擎所返回的结果包含大量用户不关心的网页。
(2)通用搜索引擎的目标是尽可能大的网络覆盖率,有限的搜索引擎服务器资源与无限的网络数据资源之间的矛盾将进一步加深。
(3)万维网数据形式的丰富和网络技术的不断发展,图片、数据库、音频、视频多媒体等不同数据大量出现,通用搜索引擎往往对这些信息含量密集且具有一定结构的数据无能为力,不能很好地发现和获取。
(4)通用搜索引擎大多提供基于关键字的检索,难以支持根据语义信息提出的查询。
为了解决上述问题,定向抓取相关网页资源的聚焦爬虫应运而生。聚焦爬虫是一个自动下载网页的程序,它根据既定的抓取目标,有选择的访问万维网上的网页与相关的链接,获取所需要的信息。与通用爬虫(general purpose web crawler)不同,聚焦爬虫并不追求大的覆盖,而将目标定为抓取与某一特定主题内容相关的网页,为面向主题的用户查询准备数据资源。
1 聚焦爬虫工作原理以及关键技术概述
网络爬虫是一个自动提取网页的程序,它为搜索引擎从万维网上下载网页,是搜索引擎的重要组成。传统爬虫从一个或若干初始网页的URL开始,获得初始网页上的URL,在抓取网页的过程中,不断从当前页面上抽取新的URL放入队列,直到满足系统的一定停止条件。聚焦爬虫的工作流程较为复杂,需要根据一定的网页分析算法过滤与主题无关的链接,保留有用的链接并将其放入等待抓取的URL队列。然后,它将根据一定的搜索策略从队列中选择下一步要抓取的网页URL,并重复上述过程,直到达到系统的某一条件时停止。另外,所有被爬虫抓取的网页将会被系统存贮,进行一定的分析、过滤,并建立索引,以便之后的查询和检索;对于聚焦爬虫来说,这一过程所得到的分析结果还可能对以后的抓取过程给出反馈和指导。
相对于通用网络爬虫,聚焦爬虫还需要解决三个主要问题:
(1) 对抓取目标的描述或定义;
(2) 对网页或数据的分析与过滤;
(3) 对URL的搜索策略。
----(百度百科)

该说正事了!

①第一步:这样这样
②第二部:那样那样
③第三步:run起来了
④第四步:完工

皮一下很开心kkkkkk

来看真正的过程。
或许网络上的各种爬虫会用到许多不同的第三方库,但离不开的还是requests库和re库->正则表达式。
此外这里还要用到json库。

import json
import re  #正则表达式
import requests	#用来获取源码得到请求响应的 response

开始就要模拟浏览器的请求,伪装成在使用浏览器浏览网页的亚子。

# 下载页面
def downloadPage(url):
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36'
    }	#配置请求头,User-Agent:浏览器代理(把自己伪装成浏览器请求)
    res = requests.get(url=url, headers=headers)
    return res  #返回响应

可是弹幕都在哪呢?

目前网上很多爬虫是静态页面的爬虫,类似爬取小说的内容这类,不过现在一大部分是动态的爬虫,比如我们要做的B站弹幕的爬取,而B站的网页打开后又会产生超级多眼花缭乱的request和response。
在这里插入图片描述不过问题不大,包含着弹幕的response就是这个带着像是FPS游戏里准星一样的response!
在这里插入图片描述
把它打开康康?
在这里插入图片描述
虽然这里有很多乱七八糟的东西,不过不用在意太多,我们瞄准第一行的URL!把ta复制,然后在浏览器里访问一下。是这个xml文件没错了!(看看非酋们的弹幕?
在这里插入图片描述
可是B站怎么获取到的弹幕呢?这时再来看另一个response
在这里插入图片描述
在这里插入图片描述
就在包含着弹幕的response的上面不远处就有一个pagelist开头的部分这里的aid号码和av号是对应的!
而从他的Preview中可以发现,里面的cid号码和包含弹幕的文件里的oid信息也是一样的!
综上可以得出,这个过程类似于,请求->pagelist巴拉巴拉->aid->cid->oid->弹幕。

开始肝代码

首先的任务就是获取cid,如下

def get_cid(av):
    av = av.strip('av')
    url = f'https://api.bilibili.com/x/player/pagelist?aid={av}&jsonp=jsonp'	#根据av号获取cid,aid号码和av号相同,所以可以直接使用
    res = downloadPage(url)
    res_text = res.text	#获取源码!
    res_dict = json.loads(res_text)
    cid = res_dict['data'][0]['cid']
    return cid

这之后就要根据cid请求弹幕

# 根据cid请求弹幕
def get_dan_mu(cid):
    url = f'https://api.bilibili.com/x/v1/dm/list.so?oid={cid}'
    res = downloadPage(url)
    res_xml = res.content.decode('utf-8') #因为是中文所以需要设置编码格式防止乱码
    pattern = re.compile('<d.*?>(.*?)</d>') #这里用到了正则表达式,来获取我们需要的那一部分内容
    dan_mu_list = pattern.findall(res_xml)
    return dan_mu_list #返回弹幕列表

最后就是要把弹幕写进我们的文件里!这个就很简单了

# 把弹幕写入到文件中
def save_to_file(dan_mu_list, filename):
	#filename是保存文件的名称,dan_mu_list就是弹幕列表嘛
    with open(filename, mode='w', encoding='utf-8') as f:
        for one_dan_mu in dan_mu_list:
            f.write(one_dan_mu)
            f.write('\n') #写入的时候别忘记了回车

主函数

def main(av):
    # 根据视频av号获得cid
    cid = get_cid(av)
    # 根据cid爬取弹幕
    dan_mu_list = get_dan_mu(cid)
    # 把弹幕写入到文件中
    save_to_file(dan_mu_list, f'{av}.txt')

if __name__ == '__main__':
    av = 'avxxxxxxxxx' #"xxxxxxxxx"就是你想要收集弹幕的视频的av号
    dan_mu_spider(av)

源代码合并起来就是下面这样,总的来说还是非常好理解的,参考了不少CSDN大佬和B站的爬虫入门视频,Computer Science实在是高深,继续努力吧

import json
import re
import requests

# 下载页面
def download_page(url):
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36'
    }
    res = requests.get(url=url, headers=headers)
    return res

def get_cid(av):
    av = av.strip('av')
    url = f'https://api.bilibili.com/x/player/pagelist?aid={av}&jsonp=jsonp'
    res = download_page(url)
    res_text = res.text
    res_dict = json.loads(res_text)
    cid = res_dict['data'][0]['cid']
    return cid

# 根据cid请求弹幕
def get_dan_mu(cid):
    url = f'https://api.bilibili.com/x/v1/dm/list.so?oid={cid}'
    res = download_page(url)
    res_xml = res.content.decode('utf-8')
    pattern = re.compile('<d.*?>(.*?)</d>')
    dan_mu_list = pattern.findall(res_xml)
    return dan_mu_list

# 把弹幕写入到文件中
def save_to_file(dan_mu_list, filename):
    with open(filename, mode='w', encoding='utf-8') as f:
        for one_dan_mu in dan_mu_list:
            f.write(one_dan_mu)
            f.write('\n')

# 弹幕爬虫主流程
def main(av):
    # 根据视频av号获得cid
    cid = get_cid(av)
    # 根据cid爬取弹幕
    dan_mu_list = get_dan_mu(cid)
    # 把弹幕写入到文件中
    save_to_file(dan_mu_list, f'{av}.txt')

if __name__ == '__main__':
    av = 'av77794648'
    main(av)

最后结果就是这样的
在这里插入图片描述
爬虫成功!奇怪的知识增加了!考虑之后再出一个生成词云的教程。
在这里插入图片描述
有喜欢的可以加个关注或者B站加个关注吧,本菜鸟陆续会上传一些自制的编程的视频,哈哈哈哈哈就是不知道这么多大佬看不看得上啦!做的不好的还请不要喷
在这里插入图片描述
最后说一下,如果实在是求速度的,可以直接使用Python的you-get库爬取弹幕、下载视频,而且应用的范围也非常广,特别方便。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章