本文绍如何利用python爬虫下载bilibili番剧弹幕。


准备:

  1. python3环境
  2. 需要安装BeautifulSoup,selenium包
  3. phantomjs

原理:

  1. 通过aid下载bilibili番剧弹幕
  2. 通过aid获取cid,如: http://www.bilibili.com/widget/getPageList?aid=9654289
  3. 下载弹幕地址:http://comment.bilibili.com/cid.xml

代码:

# -*- coding: utf-8 -*-

import requests
import json
import urllib.request
import zlib
import os
import re
from bs4 import BeautifulSoup
from urllib.parse import quote
from selenium import webdriver
headers = { 'Accept':'*/*',
'Accept-Encoding':'gzip, deflate, sdch, br',
'Accept-Language':'zh-CN,zh;q=0.8',
'Access-Control-Request-Headers':'content-encoding, content-type, x-za-batch-size, x-za-log-version, x-za-platform, x-za-product',
'Access-Control-Request-Method':'POST',
'Cache-Control':'no-cache',
'Connection':'keep-alive',
'Host':'bilibili-web-analytics.bilibili.com',
'Origin':'https://www.bilibili.com',
'Pragma':'no-cache',
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36'
}
for key, value in enumerate(headers):
webdriver.DesiredCapabilities.PHANTOMJS['phantomjs.page.customHeaders.{}'.format(key)] = value
driver = webdriver.PhantomJS(executable_path='./phantomjs-2.1.1-windows/bin/phantomjs.exe') def geAidByKeyword(Keyword):
print('正在搜索,请等待......')
search_url="http://search.bilibili.com/bangumi?keyword="+Keyword
search_url=quote(search_url,safe='/:?=')
search_html = urllib.request.urlopen(search_url)
search_bsObj = BeautifulSoup(search_html,'html.parser')
search_linkList = search_bsObj.findAll("a",{"class":"title"})
count=len(search_linkList)
print('已找到%s个' %count)
i=0
for item in search_linkList:
print('%s:%s' % (i,search_linkList[i]['title']))
i=i+1
# 选择
select=input('请选择你要下载的编号:')
select=int(select)
# print(select)
search_link=search_linkList[select]['href']
if search_link=='':
print('输入无效字符')
return False
# 进入
# print(search_link)
search_link="http:"+search_link
select_link_html = urllib.request.urlopen(search_link)
select_link_bsObj = BeautifulSoup(select_link_html,'html.parser')
select_link_list=select_link_bsObj.findAll("li",{"data-newest-ep-id":re.compile("[0-9]+")})
data_season_id=select_link_list[0]['data-season-id']
data_newest_ep_id=select_link_list[0]['data-newest-ep-id']
new_aid_url="http://bangumi.bilibili.com/anime/%s/play#%s" % (data_season_id,data_newest_ep_id)
getNewAid(new_aid_url)
# print(data_season_id) def getNewAid(url):
driver.get(url)
html = driver.page_source
bsObj = BeautifulSoup(html,'html.parser')
aid_list=bsObj.findAll("a",{"class":"v-av-link"})
aid=aid_list[0].get_text()
aid=aid[2:]
checkAndDown(aid) def checkAndDown(aid):
title=getAnimeName(aid)
check=input('你要下载的是%s,是否要下载(1:是;0:否):' %title)
print(check)
if int(check)==1:
getPageList(aid)
else:
return False def getAnimeName(aid):
# print(aid)
html = urllib.request.urlopen("http://www.bilibili.com/video/av%s" %aid)
bsObj = BeautifulSoup(html,'html.parser')
try:
title=bsObj.find("title").get_text()
except Exception as e:
print('获取失败,aid=%s' %aid)
return False return title def getPageList(aid):
url="http://www.bilibili.com/widget/getPageList"
params = {
'aid':aid
}
re = requests.get(url,params)
cidDic=json.loads(re.text)
animeName=getAnimeName(aid)
for cidItem in cidDic:
cidItem['animeName']=animeName
downloadDanmu(cidItem) def downloadDanmu(cidItem):
cid=cidItem['cid']
animeName=cidItem['animeName']
pagename=cidItem['pagename']
comment_url="http://comment.bilibili.com/%s.xml" %cid
comment_page_zip=urllib.request.urlopen(comment_url).read()
comment=zlib.decompressobj(-zlib.MAX_WBITS).decompress(comment_page_zip)
if os.path.exists('%s' % animeName)==False:
os.makedirs('%s' % animeName)
fout=open('%s/%s.xml' % (animeName,pagename),'wb')
fout.write(comment)
fout.close()
print('%s %s下载完成' % (animeName,pagename)) def main():
# aid=input('请输入aid:')
# getPageList(aid)
keyword=input('请输入番剧的关键字:')
geAidByKeyword(keyword) if __name__ == '__main__':
main()

Python爬虫下载Bilibili番剧弹幕的更多相关文章

  1. python爬虫下载文件

    python爬虫下载文件 下载东西和访问网页差不多,这里以下载我以前做的一个安卓小游戏为例 地址为:http://hjwachhy.site/game/only_v1.1.1.apk 首先下载到内存 ...

  2. Python 批量下载BiliBili视频 打包成软件

    文章目录 很多人学习python,不知道从何学起.很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手.很多已经做案例的人,却不知道如何去学习更加高深的知识.那么针对这三类人,我给大家 ...

  3. Python爬虫爬取美剧网站

    一直有爱看美剧的习惯,一方面锻炼一下英语听力,一方面打发一下时间.之前是能在视频网站上面在线看的,可是自从广电总局的限制令之后,进口的美剧英剧等貌似就不在像以前一样同步更新了.但是,作为一个宅diao ...

  4. bilibili番剧评分爬虫

    python选修课学习中练手写的,主要就是查询bilibili提供得api # -*- coding:utf-8 -*- import requests import json import csv ...

  5. Python爬虫下载美女图片(不同网站不同方法)

    声明:以下代码,Python版本3.6完美运行 一.思路介绍 不同的图片网站设有不同的反爬虫机制,根据具体网站采取对应的方法 1. 浏览器浏览分析地址变化规律 2. Python测试类获取网页内容,从 ...

  6. Python爬虫下载酷狗音乐

    目录 1.Python下载酷狗音乐 1.1.前期准备 1.2.分析 1.2.1.第一步 1.2.2.第二步 1.2.3.第三步 1.2.4.第四步 1.3.代码实现 1.4.运行结果 1.Python ...

  7. python 爬虫 下载图片

    import os#导入操作系统模块from urllib.request import urlretrieve#下载url对应的文件from urllib.request import urlope ...

  8. python 爬虫--下载图片,下载音乐

    #下载图片 imgUrl='http://www.pptbz.com/pptpic/UploadFiles_6909/201211/2012111719294197.jpg' r=requests.g ...

  9. python 爬虫下载英语听力新闻(npr news)为mp3格式

    想通过听实时新闻来提高英语听力,学了那么多年的英语,不能落下啊,不然白费背了那么多年的单词. npr news是美国国家公共电台,发音纯正,音频每日更新,以美国为主,世界新闻为辅,比如最近我国武汉发生 ...

随机推荐

  1. Loadrunner上传文件与下载文件脚本

    Loadrunner上传文件与下载文件脚本 一. 上传脚本 Action() { int uploadImgStatus = 0; //获取上传产品图ID web_reg_save_param_ex( ...

  2. CodeForces - 999D Equalize the Remainders (模拟+set)

    You are given an array consisting of nn integers a1,a2,…,ana1,a2,…,an , and a positive integer mm . ...

  3. 解析oracle对select加锁的方法以及锁的查询 转

    转自 https://www.jb51.net/article/37587.htm 本篇文章是对oracle对select加锁的方法以及锁的查询进行了详细的分析介绍,需要的朋友参考下 解析oracle ...

  4. css让不同大小的图片适应div的大小,且不变形。

    做成背景图片 单个 .imgdiv { width: 100px; // 你要的正方形 height: 100px; // 你要的正方形 background-image: url(/your/ima ...

  5. 编程开发之--Oracle数据库--存储过程和存储函数(2)

    上一小结我们简单介绍了存储过程和存储函数,对存储过程和存储函数有了一个基本的了解,接下来介绍在java程序中如何调用我们创建的存储过程和存储函数 1.在应用程序中调用我们的存储过程 创建一个简单的Ja ...

  6. MySQL无法启动重启竟是因为改了Linux主机名

    MySQL无法重启.无法关闭.无法启动.无法使用,如果是因为修改了主机名,可以这样解决:关闭掉所有mysql进程,然后在启动一些mysql! 有时候,只要执行如下MySQL初始化命令即可解决:/usr ...

  7. es6之扩展运算符 三个点(...)

    对象的扩展运算符理解对象的扩展运算符其实很简单,只要记住一句话就可以: 对象中的扩展运算符(...)用于取出参数对象中的所有可遍历属性,拷贝到当前对象之中 let bar = { a: 1, b: 2 ...

  8. php之微型博客的创建

    一,微型博客的开发思路 微型博客的创建,确定无疑我们会用到PHP和mysql之间的增添删改查,首先来看一下思维导图: 搭建好计算机里的apache php 和mysql的联动功能,打开phpmyadm ...

  9. 快速认识LinkIt 7697开发板

    LinkIt 7697是一款多功能且价格亲民的开发板,可用来连接网络或你的各项装置,同时提供Wi-Fi及蓝芽两种联机功能.此开发板采用MediaTek MT7697芯片,比起其他类似的Wi-Fi/蓝芽 ...

  10. vue 项目中px转rem转换问题(postcss-px2rem)

    1.安装postcss-px2rem npm install postcss-px2rem --save npm install postcss-px2rem --save 2.配置px2rem 在配 ...