#!usr/bin/env python3
#-*- coding: UTF-8 -*-
# 爬取微博短视频
__auth__='lz'import requests, json
from urllib.parse import urlencode
from urllib.parse import quote,unquote
import re
import time
import osbase_url = 'https://m.weibo.cn/api/container/getIndex?'header = {"User - Agent": "Mozilla / 5.0(Windows NT 10.0;Win64;x64) AppleWebKit / 537.36(KHTML, likeGecko) Chrome / 68.0.3440.106Safari / 537.36","X - Requested - With": "XMLHttpRequest","Accept": "application/json, text/plain, */*",
}def get_homeInfo(name):hurl = base_url + 'containerid=100103type%3D1%26q%3D'+ quote(name) +'&page_type=searchall'try:hresp = requests.get(hurl, header)if(hresp.status_code==200):return hresp.json()except requests.ConnectionError as e:print("连接错误:" + e.args)# 请求页面
def get_page(uid, luicode, lfid, q, containerid, sinceid):# 如果不是非常清楚字典和确定 url 编码,不要使用字典方式构造 url 参数,# 建议直接用字符串构造# 构造好后,一步步删去非必要参数# 确定好后,在把一些变化的参数,换成变量params = 'uid=2674747062&t=0&luicode=' + str(luicode) + '&lfid=' + str(lfid) + 'type=3&q='+ str(q) +'&t=0&type=uid&value=' + str(uid) + '&containerid=' + str(containerid)if(sinceid != 1):params += '&since_id=' + str(sinceid)
# 构建请求头,不然会被禁# 注意 quote 不要对 (= & 等) url编码,不然和原来的请求 url 不一致,会返回没有内容url = base_url + quote(params, "\/\:\=\&\?\#\+\!\$\,\;\'\@\(\)\*\[\]")try:resp = requests.get(url, header)if(resp.status_code==200):# 获取到的是 json 格式数据,直接用 json 方法解析并返回 json 对象return resp.json()except requests.ConnectionError as e:print("连接错误:" + e.args)# 解析json数据
def parse_page_get_name2url(resp_json_obj):# 对着所在 key 右键,选择 copy property path# data.cards[""0""].card_group[""0""].mblog.page_info.media_info.stream_urlname2url = []length = len(resp_json_obj['data']['cards'])for index in range(0, length):# 推荐这种取值方式,json 对象在 python 中其实是字典(dict)类型。# 此中方式取值方便,但假如键有误,则会抛异常try:page_info = resp_json_obj['data']['cards'][index]['mblog']['page_info']# 此中方式取值繁琐,但能避免抛异常# data = obj_json.get('data', None)# cards = data.get('cards', None)# card_groups = cards[0].get('card_group', None)# mblog = card_groups[0].get('mblog', None)# page_info = mblog['page_info']media_name = page_info['content2']media_url = page_info['media_info']['stream_url_hd']# 追加到数组中name2url.append({media_name: media_url})except:passcontinuereturn name2url# 新建文件保存目录
def mkdir(path):# 去除首位空格path=path.strip()# 去除尾部 \ 符号path=path.rstrip("\\")# 判断路径是否存在# 存在     True# 不存在   FalseisExists=os.path.exists(path)# 判断结果if not isExists:# 如果不存在则创建目录# 创建目录操作函数os.makedirs(path)print(path+' 创建成功')return Trueelse:# 如果目录存在则不创建,并提示目录已存在print(path+' 目录已存在')return False# 下载视频
def download_video(path, filename, url):resp = requests.get(url)time.sleep(3)with open(path + filename + '.mp4', 'wb') as file:file.write(resp.content)print(filename, '下载完成')# 获取栏目containerid
def getContained(url):res = requests.get(url, header)res_json = res.json()# 处理个别博主无‘视频’栏目的情况,从‘微博’栏目获取try:container = res_json['data']['tabsInfo']['tabs'][2]['containerid']except:container = res_json['data']['tabsInfo']['tabs'][1]['containerid']return containerdef last_files(file_dir):file_names = []for root, dirs, files in os.walk(file_dir):# print('root_dir:', root)  # 当前目录路径# print('sub_dirs:', dirs)  # 当前路径下所有子目录# print('files:', files)  # 当前路径下所有非目录子文件file_names.extend(files)return set(file_names)def recursiveGetPage(uid, back, lfid, q, containerid, since_id, pageNo, count):obj_json = get_page(uid, back, lfid, q, containerid, since_id)since_id = obj_json['data']['cardlistInfo']['since_id']total = obj_json['data']['cardlistInfo']['total']pageSize = len(obj_json['data']['cards'])name2urls = parse_page_get_name2url(obj_json)if(len(name2urls) != pageSize):count += pageSize - len(name2urls)print('正在下载第 %d 页,当前页共 %d 条记录 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>' %(pageNo, pageSize))for name2url in name2urls:for (name, url) in name2url.items():try:# 去掉特殊符号filename_temp = re.sub(u"([^\u4e00-\u9fa5\u0030-\u0039\u0041-\u005a\u0061-\u007a])", "", name)# # 从文件中读取上次下载的记录# with open(lastRecordPath, 'r') as f:#     data = f.read()# if(filename_temp == data):#     print('下载终止!')#     return;if filename_temp + '.mp4' in allfile:print(filename_temp + '.mp4 文件已存在,下载终止!')returndownload_video(path, filename_temp, url)count += 1if(count > total):print('===================== %s 的全部微博视频已下载完成!保存目录: %s=====================' %(q, path))return 'Done'print('已下载 {:.2f} %    第{}页 | {}/{}'.format(count/total * 100, pageNo, count, total))print('---------------------------------------------------------------')except:print('%s 下载失败!' %(name))passcontinueprint('第 %d 页下载完成 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>' %(pageNo))pageNo += 1return recursiveGetPage(uid, back, lfid, q, containerid, since_id, pageNo, count)if __name__ =='__main__':q = '陈翔六点半'rootPath = 'D:\\weibovideo\\' + q + '\\'path = rootPath + time.strftime('%Y%m%d%H%M%S',time.localtime(time.time())) + '\\'mkdir(path)# 获取已下载文件的文件名并去重allfile = last_files(rootPath)hres = get_homeInfo(q)lfid = hres['data']['scheme'].split('lfid=')[1].split('_-_')[0]uid = hres['data']['cards'][0]['card_group'][0]['user']['id']profile_url = hres['data']['cards'][0]['card_group'][0]['user']['profile_url']back = profile_url.split('&luicode=')[1]url2 = base_url + 'uid={0}&luicode={1}&type=uid&value={2}'.format(uid, back, uid)containerid = getContained(url2)# 递归函数recursiveGetPage(uid, back, lfid, q, containerid, 1, 1, 0)

Python爬取微博短视频相关推荐

  1. python爬取微博热门消息(三)—— 爬取微博热门信息的功能函数

    微博的热搜榜对于研究大众的流量有非常大的价值. 今天的教程就来说说如何爬取微博的热搜榜. 感兴趣的小伙伴可以 收藏 + 关注 哦! 另外,关于本项目的效果展示,以及教程,点击一下链接即可. pytho ...

  2. python爬取微博热搜写入数据库_python实现爬取微博热搜存入Mysql

    python爬取微博热搜存入Mysql最终的效果 使用的库 目标分析 一:得到数据 二:链接数据库 总代码 最终的效果 废话不多少,直接上图 这里可以清楚的看到,数据库里包含了日期,内容,和网站lin ...

  3. python爬取微博用户信息(六)—— 完整代码

    本节为爬取微博用户信息的完整代码,以及项目结构. 感兴趣的小伙伴可以收藏哦! 另外,关于本代码的效果展示,以及教程,点击以下链接即可. python爬取微博用户信息(一)-- 效果展示 python爬 ...

  4. python爬取微博用户信息(四)—— 爬取用户信息的功能函数

    这一节,将会将 MicroBlog.py 文件中的函数介绍一下. 感兴趣的小伙伴可以收藏哦! 另外,关于本代码的效果展示,以及教程,点击以下链接即可. python爬取微博用户信息(一)-- 效果展示 ...

  5. 看看你爱的他今天是什么‘颜色‘ -- Python爬取微博评论制作专属偶像词云

    简介:快来拿出你珍藏的pick star,用大家对他的爱重塑一个他吧.通过爬取微博评论,制作你的偶像图片词云,天天都是不重样的哦! 很多人学习python,不知道从何学起. 很多人学习python,掌 ...

  6. python爬取b站评论_学习笔记(1):写了个python爬取B站视频评论的程序

    学习笔记(1):写了个python爬取B站视频评论的程序 import requests import json import os table='fZodR9XQDSUm21yCkr6zBqiveY ...

  7. python爬取微博热搜榜

    python爬取微博热搜榜 最近应我大学室友得需求,做了一个简单的爬虫案例,先给大家看一下程序运行效果 接下来就是贴出代码了,在这里我会做一些简单说明,对如刚入门的同学可能会有所帮助,这里使用的是py ...

  8. python爬取微博热搜数据并保存!

    主要用到requests和bf4两个库将获得的信息保存在d://hotsearch.txt下importrequests;importbs4mylist=[]r=requests.get(ur- 很多 ...

  9. python爬取微博话题下面的帖子并存入excel文件

    此次写的是python爬取微博话题下面的帖子,示例代码以爬取#转发这个杨超越# https://s.weibo.com/weibo/%23%E8%BD%AC%E5%8F%91%E8%BF%99%E4% ...

最新文章

  1. 品牌管理案例——添加新品牌 删除品牌 根据条件筛选品牌
  2. c++------------提取文件中的信息
  3. linux实现自己的write函数,Linux 内核源码阅读 - write 系统调用的实现
  4. 解决mysql分页数据错乱问题
  5. python查找字符串数量_python如何实现从字符串中找出字符1的位置以及个数的示例...
  6. 异步编程之co——源码分析
  7. 高数篇(二)-- 傅里叶变换 VS 拉普拉斯变换
  8. 瞬态抑制二极管(Tvs)和快恢复/超快恢复二极管的学习
  9. 绕过AppLocker系列之控制面板的利用
  10. opencv拟合多边形
  11. 黑客登录界面科幻黑色主题网页模板表单验证代码
  12. Docker入门实战(三)-Docker容器镜像
  13. win10系统如何连接宽带连接服务器,win10怎么连宽带_win10系统如何连接宽带
  14. 一个 epoll 连接句柄定时管理器
  15. 【转载】文献与考古领域的人工智能应用 | 人工智能完成 “死亡文字” 西夏文的自动识别
  16. C++ 返回引用与返回值区别
  17. 一个网口接网线,另一个网口做转发,用网线连接另一个电脑
  18. Hive下查看表占用空间大小的方法
  19. JAVA打包软件exe4j使用教程
  20. CAN总线隔离中继器、CAN网桥的CAN滤波设置

热门文章

  1. 电影9 10大经典电影
  2. “差生”韩寒难以改变的人生戏码
  3. 数字拼音翻译成阿拉伯数字
  4. 《从菜鸟到大师》Python工程师之 Python语言基础 00
  5. 在word中对学位论文进行页码和页眉设置的方法
  6. 数据结构---线性表
  7. 分享个解决右键没有新建TXT文档的办法
  8. 你看这雪花如此的美丽
  9. 程序猿爆笑选集(2)
  10. 如何成为一个原画场景大师