Python爬一下抖音上小姐姐的视频~

简介: image.png在简书也码了1W多字了,发现还是爬虫类的文章看的人多。算法工程师现在都啥价位了,你们还在看爬虫→_→介绍这次爬的是当下大火的APP--抖音,批量下载一个用户发布的所有视频。
img_b58e0d15bf67b3ee44157d17596a608e.png
image.png

在简书也码了1W多字了,发现还是爬虫类的文章看的人多。
算法工程师现在都啥价位了,你们还在看爬虫→_→

介绍

这次爬的是当下大火的APP--抖音,批量下载一个用户发布的所有视频。
各位也应该知道,抖音只有移动端,官网打开除了给你个APP下载二维码啥也没有,所以相比爬PC网站,还是遇到了更多的问题,也花了更多的时间,不过好在基本实现了,除了一点咱在后面说。

思路梳理

  • 其实如果看了其他博主爬抖音的教程就发现,大部分都是通过fildder手机抓包来获取接口地址等信息,其实不用那么麻烦,我们通过分享选择链接形式就可以获取到信息:
    img_500b4deafa6dd5230ada2091e7b8e14b.png
    image.png
  • 然后电脑访问这个链接,就可以打开页面了,不过很快我们就会发现一个问题,电脑访问这个地址发布视频是空的:


    img_561771b82c50268ea0bd6c81d87b219a.png
    image.png
  • 谷歌Chrome浏览器有一个模拟手机访问的功能,我们选在iPhone X模式来访问页面,果然看到发布的视频了:


    img_f2947c3d89e743801fec26e26604de52.png
    image.png
  • 我们接下来看下后台请求,不多,很快就找到我们需要的视频信息了,也能直接打开观看视频,到这感觉已经成功了一大半了:


    img_cf8bac3169113ecbb0da918c4abe4f90.png
    image.png
  • 但很快我们有发现了新问题,可以看到莉哥总共发布了93个作品,但我们实际获取到但链接只有19个。其实我们用过抖音,包括微博这些应用的都知道,很多信息他们不是一次加载完的,当你拖动页面的时候才会继续加载。所以我们尝试上拉页面,就会发现后台又多了一个请求,返回了新加载的视频信息。
    https://www.amemv.com/aweme/v1/aweme/post/?user_id=57720812347&count=21&max_cursor=0&aid=1128&_signature=KRLTTRAdclaWZCKrElzZVykS01&dytk=4830f6e279a5f53872aab9e9dc112d33
    https://www.amemv.com/aweme/v1/aweme/post/?user_id=57720812347&count=21&max_cursor=1530363175000&aid=1128&_signature=KRLTTRAdclaWZCKrElzZVykS01&dytk=4830f6e279a5f53872aab9e9dc112d33
    两个地址除了max_cursor其他都一样,其实就是上一条返回的json数据中的max_cursor就是下个链接中的max_cursor,然后has_more等于1的时候表示还未全部加载,这样逻辑就清楚了,我们只要先判断has_more是否等于1,等于1的时候我们将max_cursor的值传入下一个链接继续访问获取视频地址,直到has_more等于0为止。
    img_6a10b243e272f94ca971d3fec6013a9d.png
    image.png
  • 这样所有视频地址都有了,就开始下载吧!!


    img_9bfb146f763e370af1e95d19f09b8403.png
    image.png

代码部分

# -*- coding: utf-8 -*-
#date : 2018-07-29
#author : Awesome_Tang
#version : Python 2.7.9


from selenium import webdriver
from bs4 import BeautifulSoup
import json
import requests
import sys
import time
import os
import uuid
from contextlib import closing
from requests.packages.urllib3.exceptions import InsecureRequestWarning
requests.packages.urllib3.disable_warnings(InsecureRequestWarning)

class douyin_spider(object):
    """docstring for douyin_spider"""
    def __init__(self,user_id,_signature,dytk):
        print '*******DouYin_spider******'
        print 'Author :     Awesome_Tang'
        print 'Date   :       2018-07-29'
        print 'Version:        Python2.7'
        print '**************************'
        print ''
        self.userid = user_id
        self.headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.146 Safari/537.36'}
        mobile_emulation = {'deviceName': 'iPhone X'}
        # chrome浏览器模拟iPhone X进行页面访问
        options = webdriver.ChromeOptions()
        options.add_experimental_option("mobileEmulation", mobile_emulation)
        self.browser = webdriver.Chrome(chrome_options=options)
        self._signature= _signature
        self.dytk= dytk
        self.url = 'https://www.amemv.com/aweme/v1/aweme/post/?user_id=%s&count=32&max_cursor=0&aid=1128&_signature=%s&dytk=%s'%(self.userid,self._signature,self.dytk)

    
    def handle_url(self):
        url_list = [self.url,]
        self.browser.get(self.url)
        web_data = self.browser.page_source
        soup = BeautifulSoup(web_data, 'lxml')
        web_data = soup.pre.string
        web_data = json.loads(str(web_data))
        if web_data['status_code'] == 0:
            while web_data['has_more'] == 1:
                # 最大加载32条视频信息,has_more等于1表示还未全部加载完
                max_cursor = web_data['max_cursor']
                # 获取时间戳
                url = 'https://www.amemv.com/aweme/v1/aweme/post/?user_id=%s&count=32&max_cursor=%s&aid=1128&_signature=%s&dytk=%s'%(self.userid,max_cursor,self._signature,self.dytk)
                url_list.append(url)
                self.browser.get(url)
                web_data = self.browser.page_source
                soup = BeautifulSoup(web_data, 'lxml')
                web_data = soup.pre.string
                web_data = json.loads(str(web_data))
            else:
                max_cursor = web_data['max_cursor']
                # 获取时间戳
                url = 'https://www.amemv.com/aweme/v1/aweme/post/?user_id=%s&count=32&max_cursor=%s&aid=1128&_signature=%s&dytk=%s'%(self.userid,max_cursor,self._signature,self.dytk)
                url_list.append(url)
        else:
            url_list = []
        return url_list

    def get_download_url(self,url_list):
        download_url = []
        title_list = []
        if len(url_list)> 0:
            for url in url_list:
                self.browser.get(url)
                web_data = self.browser.page_source
                soup = BeautifulSoup(web_data, 'lxml')
                web_data = soup.pre.string
                web_data = json.loads(str(web_data))
                if web_data['status_code'] == 0:
                    for i in range(len(web_data['aweme_list'])):
                        download_url.append(web_data['aweme_list'][i]['video']['play_addr']['url_list'][0])
                        title_list.append(web_data['aweme_list'][i]['share_info']['share_desc'].encode('utf-8'))
            return download_url,title_list
    
    def videodownloader(self,url,title):
        size = 0
        path = title+'.mp4'
        with closing(requests.get(url, headers = self.headers ,stream=True, verify=False)) as response:
            chunk_size = 1024
            content_size = int(response.headers['content-length'])
            if response.status_code == 200:
                print '%s is downloading...'%title
                sys.stdout.write('[File Size]: %0.2f MB\n' % (content_size/chunk_size/1024))
                with open(path, 'wb') as f:
                    for data in response.iter_content(chunk_size=chunk_size):
                        f.write(data)
                        size += len(data)
                        f.flush()
                        sys.stdout.write('[Progress]: %0.2f%%' % float(size/content_size*100) + '\r')
                        sys.stdout.flush()
            else:
                print response.status_code
    
    def run(self):
        url = 'https://www.amemv.com/aweme/v1/aweme/post/?user_id=%s&count=32&max_cursor=0&aid=1128&_signature=%s&dytk=%s'%(self.userid,self._signature,self.dytk)
        url_list = self.handle_url()
        download_url,title_list = self.get_download_url(url_list)
        for i in range(len(download_url)):          
            url = download_url[i]
            title = title_list[i]
            self.videodownloader(url,title)
                
if __name__ == '__main__':
    # 创建对象
    # 传入三个参数,user_id,_signature,dytk
    douyin_spider = douyin_spider('95870186531','RFE1JhAbHxD7J8TA9HCumURRNT','539f2c59bb57577983b3818b7a7f32ef')
    douyin_spider.run()
    print '******DouYin_spider@Awesome_Tang、******'



问题

  • 开始说了,目前还存在一个问题,我们看接口地址可以发现,目前需要5个参数分别是:
    user_id, max_cursor,count,_signature, dytk
    前面三个都没问题,而且我看有的博主5/6月份都文章都还只需要前三个参数,_signature, dytk是两个加密之后的参数,不知道咋加密的,而且selenium似乎也没有获取后台请求地址的方法,返回的视频地址也没有在页面进行渲染,所以现在还需要点击分享链接之后手动填入_signature, dytk两个值,有点冒傻气~

skr~skr~~

目录
相关文章
|
1月前
|
计算机视觉 Python
Python实用记录(一):如何将不同类型视频按关键帧提取并保存图片,实现图片裁剪功能
这篇文章介绍了如何使用Python和OpenCV库从不同格式的视频文件中按关键帧提取图片,并展示了图片裁剪的方法。
77 0
|
3天前
|
存储 数据可视化 数据挖掘
Python数据分析项目:抖音短视频达人粉丝增长趋势
Python数据分析项目:抖音短视频达人粉丝增长趋势
|
8天前
|
数据采集 JSON 数据格式
深入解析:使用Python爬取Bilibili视频
本文介绍了如何使用Python编写脚本自动化下载Bilibili视频。通过requests等库获取视频和音频URL,使用ffmpeg合并音视频文件,最终实现高效下载。注意遵守网站爬虫政策和法律法规。
84 4
|
1月前
|
机器学习/深度学习 编解码 Python
python将照片集变成视频
`shigen`是一位坚持更新文章的博客作者,记录成长历程,分享认知见解,留住生活感动。他利用Python库`Pillow`和`MoviePy`开发了一个工具,能够批量处理照片并生成高质量视频。该工具支持多种分辨率、自定义播放时间和照片方向,并能自动调整照片比例以实现居中对齐。通过简单的代码实现了照片视频化的需求,适合强迫症患者使用。**与shigen一起,每天不一样!**个人IP:shigen。
45 9
python将照片集变成视频
|
1月前
|
数据安全/隐私保护 流计算 开发者
python知识点100篇系列(18)-解析m3u8文件的下载视频
【10月更文挑战第6天】m3u8是苹果公司推出的一种视频播放标准,采用UTF-8编码,主要用于记录视频的网络地址。HLS(Http Live Streaming)是苹果公司提出的一种基于HTTP的流媒体传输协议,通过m3u8索引文件按序访问ts文件,实现音视频播放。本文介绍了如何通过浏览器找到m3u8文件,解析m3u8文件获取ts文件地址,下载ts文件并解密(如有必要),最后使用ffmpeg合并ts文件为mp4文件。
|
2月前
|
编解码 Python
Python如何给视频添加音频和字幕
Python如何给视频添加音频和字幕
|
2月前
|
编解码 Python Windows
python有没有包 可以检测 这个视频是否可以播放
python有没有包 可以检测 这个视频是否可以播放
|
2月前
|
前端开发 JavaScript 关系型数据库
基于Python+Vue开发的反诈视频宣传管理系统
基于Python+Vue开发的反诈视频宣传管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Python编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Python的反诈宣传管理系统项目,大学生可以在实践中学习和提升自己的能力,为以后的职业发展打下坚实基础。
35 4
|
3月前
|
存储 数据可视化 Python
使用python moviepy提取视频中的音频,同时对音频数据进行数据可视化分析
使用python moviepy提取视频中的音频,同时对音频数据进行数据可视化分析
148 0
|
3月前
|
机器学习/深度学习 人工智能 自然语言处理
【深度学习】python之人工智能应用篇——视频生成技术
视频生成技术是一种基于深度学习和机器学习的先进技术,它使得计算机能够根据给定的文本、图像、视频等单模态或多模态数据,自动生成符合描述的、高保真的视频内容。这种技术主要依赖于深度学习模型,如生成对抗网络(GAN)、自回归模型(Auto-regressive Model)、扩散模型(Diffusion Model)等。其中,GAN由两个神经网络组成:一个生成器用于生成逼真的图像或视频,另一个判别器用于判断生成的图像或视频是否真实。通过不断的对抗学习,生成器和判别器共同优化,以产生更高质量的视频。
96 2
下一篇
无影云桌面