python 爬取知乎回答下的微信8.0状态视频

微信 8.0 版本更新后,可以设置个人状态,状态里面可以添加火录制视频,很快状态视频就火了,可以看下知乎热榜有没有微信8.0状态沙雕又可爱的视频或图片?[1]。比如我也设置了一个:

于是我就想把这些视频下载下来,也玩一玩。本文讲述如何使用 Python 一键下载知乎某个回答下的所有视频。

思路:分析知乎回答页面 -> 定位视频 -> 寻找视频播放的 url -> 下载。其实就两步:找到 url,然后下载。

寻找 url

一个回答下面可能有多个视频,先分析一个视频,打开谷歌浏览器的开发者工具窗口,找到 network,勾选 preserve log、disable cache,选择 xhr,刷新,很容易找到如下图所示的接口:

从上图接口返回的数据就可以获取视频播放的 url、标题、格式等信息,这就够了,复制 play_url,放在浏览器上看一下,发现可以直接下载,说明那么这个 url 就是我们需要的。

接下来,写代码,获取接口返回的数据:

def get(url: str) -> list:
  """
  获取知乎视频的 url
  返回格式
  [{'url':'', 'title','format':'',},{}]
  """
  data = []
  headers = {
    "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 11_1_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36",
  }
  with requests.get(url, headers=headers, timeout=10) as rep:
    if rep.status_code == 200:
      ids = re.findall(r"www.zhihu.com/zvideo/(\d{1,})", rep.text)
      ids = list(set(ids)) # 去掉重复元素
    else:
      print(f"网络连接失败,状态码 { rep.status_code }")
      return []

  if not ids:
    print("视频获取失败,可能是这个页面没有视频")
    return []

  for id in ids:
    print(id)
    with requests.get(
      f"https://www.zhihu.com/api/v4/zvideos/{id}/card",
      headers=headers,
      timeout=10,
    ) as rep:
      if rep.status_code == 200:
        ret_data = rep.json()
        playlist = ret_data["video"]["playlist"]
        title = ret_data.get("title")
        temp = playlist.get("ld") or playlist.get("sd")
        if temp:
          sigle_video = {}
          sigle_video["url"] = temp.get("play_url")
          sigle_video["title"] = title
          sigle_video["format"] = temp.get("format")
          data.append(sigle_video)
      else:
        print(f"网络连接失败,状态码 { rep.status_code }")
        return []
  return data

下载视频

这个比较简单了,直接请求视频播放的 url,将流式的内容保存到文件中,最多再加个进度条的展示。部分视频获取的 title 为空,这时就使用时间戳来命名文件。

请看代码:

def download( file_url, file_name=None, file_type=None, save_path="download", headers=None, timeout=15,):
  """
  :param file_url: 下载资源链接
  :param file_name: 保存文件名,默认为当前日期时间
  :param file_type: 文件类型(扩展名)
  :param save_path: 保存路径,默认为download,后面不要"/"
  :param headers: http请求头
  """
  if file_name is None or file_name == "":
    file_name = str(datetime.now())

  if file_type is None:
    if "." in file_url:
      file_type = file_url.split(".")[-1]
    else:
      file_type = "uknown"

  file_name = file_name + "." + file_type

  if headers is None:
    headers = {
      "User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 9_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13B137 Safari/601.1"
    }

  if os.path.exists(save_path):
    pass
  else:
    os.mkdir(save_path)

  # 下载提示

  if os.path.exists(f"{save_path}/{file_name}"):
    print(f"\033[33m{file_name}已存在,不再下载!\033[0m")
    return True

  print(f"Downloading {file_name}")
  try:
    with requests.get(
      file_url, headers=headers, stream=True, timeout=timeout
    ) as rep:
      file_size = int(rep.headers["Content-Length"])
      if rep.status_code != 200:
        print("\033[31m下载失败\033[0m")
        return False
      label = "{:.2f}MB".format(file_size / (1024 * 1024))
      with click.progressbar(length=file_size, label=label) as progressbar:
        with open(f"{save_path}/{file_name}", "wb") as f:
          for chunk in rep.iter_content(chunk_size=1024):
            if chunk:
              f.write(chunk)
              progressbar.update(1024)
      print(f"\033[32m{file_name}下载成功\033[0m")
  except Exception as e:
    print("下载失败: ", e)
  return True

执行代码下载:

import os, sys
import re
import click
import requests
from datetime import datetime

def get(url: str) -> list:
  #见上文
  ...

def download( file_url, file_name=None, file_type=None, save_path="download", headers=None, timeout=15,):
  #见上文
  ...

if __name__ == "__main__":
  videos = get(sys.argv[1])
  for video in videos:
    download(file_url = video['url'],file_name= video['title'] ,file_type= video['format'],save_path='./download')

执行结果如下图所示:

最后的话

网站可能会发生变更,因此本文的代码可能随着时间变化而无法使用,请自行调节一些正则表达式和参数。爬取的思路是通用的,无非就是找到视频的流式数据,进行保存。思路有了,编写代码就是体力活了。

此外,如果你只是想要一些酷炫、搞笑、可爱的视频资源,玩一下微信 8.0 的状态,请在公众号「Python七号」回复「视频」,即可获取微信 8.0 的状态视频合集的下载链接:

回答来源

有没有微信8.0状态沙雕又可爱的视频或图片?: https://www.zhihu.com/question/441253090

以上就是python 爬取知乎回答下的微信8.0状态视频的详细内容,更多关于python 爬取知乎视频的资料请关注我们其它相关文章!

(0)

相关推荐

  • Python爬虫进阶之爬取某视频并下载的实现

    这几天在家闲得无聊,意外的挖掘到了一个资源网站(你懂得),但是网速慢广告多下载不了种种原因让我突然萌生了爬虫的想法. 下面说说流程: 一.网站分析 首先进入网站,F12检查,本来以为这种低端网站很好爬取,是我太低估了web主.可以看到我刷新网页之后,出现了很多js文件,并且响应获取的代码与源代码不一样,这就不难猜到这个网站是动态加载页面. 目前我知道的动态网页爬取的方法只有这两种:1.从网页响应中找到JS脚本返回的JSON数据:2.使用Selenium对网页进行模拟访问.源代码问题好解决,重要的

  • Python爬取视频(其实是一篇福利)过程解析

    窗外下着小雨,作为单身程序员的我逛着逛着发现一篇好东西,来自知乎 你都用 Python 来做什么?的第一个高亮答案. 到上面去看了看,地址都是明文的,得,赶紧开始吧. 下载流式文件,requests库中请求的stream设为True就可以啦,文档在此. 先找一个视频地址试验一下: # -*- coding: utf-8 -*- import requests def download_file(url, path): with requests.get(url, stream=True) as

  • 详解使用python爬取抖音app视频(appium可以操控手机)

    记录一下如何用python爬取app数据,本文以爬取抖音视频app为例. 编程工具:pycharm app抓包工具:mitmproxy app自动化工具:appium 运行环境:windows10 思路: 假设已经配置好我们所需要的工具 1.使用mitmproxy对手机app抓包获取我们想要的内容 2.利用appium自动化测试工具,驱动app模拟人的动作(滑动.点击等) 3.将1和2相结合达到自动化爬虫的效果 一.mitmproxy/mitmdump抓包 确保已经安装好了mitmproxy,并

  • python爬取梨视频生活板块最热视频

    完整代码如下: import requests from lxml import etree import random import os from multiprocessing.dummy import Pool if not os.path.exists('./视频'): os.mkdir('./视频') urls=[] url='https://www.pearvideo.com/category_5' headers={'user-agent':'Mozilla/5.0 (Windo

  • python爬虫爬取某网站视频的示例代码

    把获取到的下载视频的url存放在数组中(也可写入文件中),通过调用迅雷接口,进行自动下载.(请先下载迅雷,并在其设置中心的下载管理中设置为一键下载) 实现代码如下: from bs4 import BeautifulSoup import requests import os,re,time import urllib3 from win32com.client import Dispatch class DownloadVideo: def __init__(self): self.r = r

  • Python爬取梨视频的示例

    爬取流程(美食区最热标签下的三个视频) 在首页获取视频的编号和名字 拼接成正确的url 保存视频 思路 1.从网页中获取视频的url 发现视频的url在id为"JprismPlayer"的div标签下的video标签src属性中,xpath解析网页 video_url = tree.xpath("//div[@id='JprismPlayer']/video/@src") 但得到的返回值为空,也就是说这个video标签在原网页中并不存在,很可能是动态加载出来的 2.

  • python爬虫线程池案例详解(梨视频短视频爬取)

    python爬虫-梨视频短视频爬取(线程池) 示例代码 import requests from lxml import etree import random from multiprocessing.dummy import Pool # 多进程要传的方法,多进程pool.map()传的第二个参数是一个迭代器对象 # 而传的get_video方法也要有一个迭代器参数 def get_video(dic): headers = { 'User-Agent':'Mozilla/5.0 (Wind

  • python爬取youtube视频的示例代码

      这几天正在追剧,原名<大秦帝国之天下>的<大秦赋>,看着看着又想把前几部刷一遍了,但第一部<裂变>自己没有高清资源,搜了一波发现youtube上有个48集版的高清资源,有删减就有删减吧,就想着写个脚本批量下载一下,记录一下过程,主要是youtube1080p及以上的分辨率做了音视频分离,下载后需要用ffmpeg做一次音视频融合.参考了pytube模块. 1.下载音视频数据 pytube可以通过pip安装 $pip install pytube from pytube

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

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

  • 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爬虫爬取ts碎片视频+验证码登录功能

    目标:爬取自己账号中购买的课程视频. 一.实现登录账号 这里采用的是手动输入验证码的方式,有能力的盆友也可以通过图像识别的方式自动填写验证码.登录后,采用session保持登录. 1.获取验证码地址 第一步:首先查看验证码对应的代码,可以从图中看到验证码图片的地址是:https://per.enetedu.com/Common/CreateImage?tmep_seq=1613623257608 颜色标红的部分tmep_seq=1613623257608,是为了解决浏览器缓存问题加的时间戳,因此

  • Python爬取某平台短视频的方法

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. 基本开发环境 Python 3.6 Pycharm 相关模块的使用 import os import requests 安装Python并添加到环境变量,pip安装需要的相关模块即可. 一.确定需求 爬取搞笑趣味栏目的视频内容. 二.网站数据分析 首先需要明确一点,好看视频网站加载方式是懒加载的方式,需要你下滑网页才会加载出新的内容 加载出来的内容里面有音频播放地址以及标题. 内容比较简单

随机推荐