明升亚洲新世纪娱乐: 申博在线娱乐登入Python网络爬虫实战(五)批量下载B站收藏夹视频

本文来源:http://www.yu833.com/www_cnmo_com/

申博在线娱乐登入,  据报道,集团内部文件称,此次裁员将通过提前退休和自愿离职的方式进行。  各级组织人事部门坚持从关心爱护干部、促进干部健康成长出发,让“红红脸、出出汗”成为常态。  而说到广汽研究院,之前一直鲜有媒体进行过详细报道,似乎对大家这块领域神秘感十足。“我局认为该经纪机构没有解决问题的态度,故我局对该公司进行了相关调查,发现鼎盛兴业房地产经纪有限公司未设立租赁代理专用账户违反了《北京市房屋租赁管理若干规定》的相关规定,现已将该违规情况反映给我局执法部门,建议对该经纪机构进行行政处罚。

当时我们都以为李晓雷就是房主。  项女士定睛一看,这名女子可不是入住的客人,而是近期多次溜进宾馆客房洗澡的“蹭澡女”。“我们相信随着东北地区经济企稳向好,经济增长促进就业稳定的效果将更加明显,东北地区就业形势将会稳中向好。  合资被外资视为抢夺中国市场平台  中国商用车领域有如此之多的引进与合资行为,那么中国品牌商用车的市场地位如何?中国商用车产业是否还有发展自主权?这些问题从不同角度看,会得出有所差异的答案。

  进展  一汽-大众奥迪经销商谈判团队到佛山  最新消息显示,一汽-大众奥迪经销商已经组建谈判团队,于11月21日在佛山约谈奥迪董事。房地产建设和投资滞后于销售反弹、增速也较为温和,短期内其增长势头或可再持续一段时间。  在上个赛季,八一与福建两队就曾爆发冲突,并导致邹雨宸、泰勒等多名参与冲突的球员被篮协停赛。  搭建平台给青年人才最好的土壤  一个平均年龄仅26岁的16人研究团队,其从事的光伏逆变器方向的多项研究成果成为国际首创,这是山东大学电气工程学院教授高峰和他的团队近年来创造的佳绩。

我们除了爬取文本信息,有的时候还需要爬媒体信息,比如视频图片音乐等。就拿B站来说,我的收藏夹内的视频可能随时会失效,所以把它们下载到本地是非常保险的一件事。

1

对于这种大量列表型的数据,可以猜测B站收藏夹的请求中,详细的收藏详细可能会是异步加载的,因为这部分数据可能比较庞大。

我们来分析一下网络请求。

可以看到对收藏夹的请求是指定URL加收藏夹的id号,我们爬取的前提是这个收藏夹是公共收藏夹,不然是无法访问的。

2

再来看他的返回,明显没有收藏视频的信息,所以可以判断收藏视频的信息是通过api接口异步加载的。

3

详细查看一下其他的请求,你会发现这样一条。

4

可以看到这里返回了json数据,内容就是我们收藏夹中的视频,但是这里这有20个,再来看请求的URL。

申博在线娱乐登入/api_bilibili_com/medialist/gateway/base/spaceDetail?media_id=88854277&pn=1&ps=20&keyword=&order=mtime&type=0&tid=0&jsonp=jsonp

media_id是收藏夹的id号,pn是代表哪一分页,ps是当前分页中视频数量。

那么我们就可以调用这个api来拿到所有收藏的视频了。

我们的视频分页当然不可能只有一页,所以我们可以遍历pn递增。

i = 1 
while 1 :
    url = '/api_bilibili_com/medialist/gateway/base/spaceDetail?media_id=88854277&pn='+ str(i) +'&ps=20&keyword=&order=mtime&type=0&tid=0&jsonp=jsonp'
    html = requests.get(url)
    i = i + 1
    print(html.text)

这样就能拿到一个收藏夹下所有视频了,当i超过收藏夹页数时,直接异常退出即可。

接下来我们需要解析出每一个视频的id。

根据之前说的json解析,我们很容易就能用

res['data']['medias']

来获得所有的视频,然后再根据下标解析出每一个视频。

res = json.loads(html.text)
len_video = len(res['data']['medias'])
for id in range(0,len_video):
    create_thread(res['data']['medias'][id])

这样我们就可以获取当前页视频数量,然后创建线程进行下载了,因为下载是一个非常占IO的事情,如果你单线程执行,下载一个视频再下载另一个,这样会很慢,我们可以给每一个视频创建一个线程来提高速度。

def create_thread(res):
    thread = myThread(res['id'],res['title'],res['id'])
    thread.start()

创建线程的线程号是视频的id号,线程名是视频名。


class myThread(threading.Thread):  # 继承父类threading.Thread
    def __init__(self, threadID, name, counter):
        threading.Thread.__init__(self)
        self.threadID = threadID
        self.name = name
        self.counter = counter
    def run(self):
        download_video(self.threadID)

线程类如上,里面有两个函数,__init__是默认的线程初始化函数,里面就是我们创建线程时传入的id和name。第二个函数是线程执行时的run方法,也就是我们定义线程的具体要做的事,里面只有一个download_video方法。

# 下载视频
def download_video(av_id):
    os.system('you-get -o d:/vedio/ /www_bilibili_com/video/av'+str(av_id))

在下载函数中,我们可以调用you-get来帮助我们解析下载视频(不要问为什么调you-get,自己解析太麻烦了)。

这样我们就完成了。

12

下载完成后:

21

源码地址: 申博在线娱乐登入/github_com/CasterWx/VideoDown

posted @ 2019-09-28 10:38  申博在线娱乐登入AntzUhl  阅读(...)  评论(...申博在线娱乐登入编辑  收藏
申博开户 www.666msa.com 太阳城申博登入 老虎机微信支付充值 申博开户送28元 申博手机客户端下载
申博官网登录登入 申博官网下载中心直营网 申博电子游戏手机能玩吗 申博会员登入 菲律宾太阳城申博 申博在线娱乐登入
申博娱乐现金网 申博登录不了 申博太阳城138官网直营 申博太阳城官方现金直营网 申博太阳城电脑客户端下载 菲律宾申博娱乐直营网