使用python爬虫,批量爬取抖音app视频(requests+Fiddler+appium)

 抖音很火,楼主使用python随机爬取抖音视频,并且无水印下载,人家都说天下没有爬不到的数据,so,楼主决定试试水,纯属技术爱好,分享给大家。。

1.楼主首先使用Fiddler4来抓取手机抖音app这个包,具体配置的操作,网上有很多教程供大家参考。

上面得出抖音的视频的url,这些url均能在网页中打开,楼主数了数,这些url的前缀有些不同,一共有这4种类型:

v1-dy.ixigua.com,v3-dy.ixigua.com,v6-dy.ixigua.com,v9-dy.ixigua.com

楼主查看这四种类型得知,v6-dy.ixigua.com 这个前缀后面的参数其中有一个是Expires(中文含义过期的意思)

Expires=1536737310,这个是时间戳,标记的是过期的时间如下图所示,过了15:28分30秒,则表示url不能使用,楼主算了一下,url有效期是一个小时。

看到这些url,楼主不能手动一个一个粘贴,so楼主需要在+Fiddler4中(在Fiddler4使用script代码网上有大量详细教程)使用如下代码,自动保存到一个txt文档中。

        //保存到本地添加开始

        //这是抖音的地址||"v1-dy.ixigua.com"||"v3-dy.ixigua.com"||"v6-dy.ixigua.com"||"v9-dy.ixigua.com"||

        if (oSession.fullUrl.Contains("v1-dy.ixigua.com")||

            oSession.fullUrl.Contains("v3-dy.ixigua.com")||

            oSession.fullUrl.Contains("v6-dy.ixigua.com")||

            oSession.fullUrl.Contains("v9-dy.ixigua.com")){

            var fso;

            var file;

            fso = new ActiveXObject("Scripting.FileSystemObject");

            //文件保存路径,可自定义

            file = fso.OpenTextFile("H:\\Request.txt",8 ,true);

            //file.writeLine("Request-url:" + oSession.url);

            file.writeLine("http://"+oSession.url)

            //file.writeLine("Request-host:" + oSession.host);

            //file.writeLine("Request-header:" + "\n" + oSession.oRequest.headers);

            //file.writeLine("Request-body:" + oSession.GetRequestBodyAsString());

            //file.writeLine("\n");

            file.close();

        }       

        //保存到本地添加结束

把上边的代码插入到如下图所示的地方即可。

 2.上面的url是楼主手动点击一个个刷新抖音app出现的,so楼主使用appium来自动刷新抖音app,自动获得url,自动保存到txt文档中。

 首先需要在appium中得到抖音这个app包的一些用的信息,如下图所示

楼主使用的是红米手机,至于appium怎么安装配置,大家可参考网上相关教程,appium客户端连接上手机(需要数据线连接)后,在控制台打印出log日志文件,在日志文件中找到这四个参数即可,然后保存

到appium客户端中即可,就能在appium客户端中操作抖音app。

{

"platformName": "Android",

"deviceName": "Redmi Note5",

"appPackage": "com.ss.android.ugc.aweme",

"appActivity": ".main.MainActivity"

}

appPackage这一项com.ss.android.ugc.aweme 则表示抖音短视频。

楼主使用如下代码来实现无限刷新抖音app,前提是需要手机连着数据线连在电脑上并且开启appium客户端的服务和打开Fiddler4抓包(配置好环境手机)。

from   appium   import   webdriver

from   time   import  sleep    

##以下代码可以操控手机app

class Action():

    def__init__(self):

        # 初始化配置,设置Desired Capabilities参数self.desired_caps = {

            "platformName":"Android",

            "deviceName":"Mi_Note_3",

            "appPackage":"com.ss.android.ugc.aweme",

            "appActivity":".main.MainActivity"        }

        # 指定Appium Serverself.server ='http://localhost:4723/wd/hub'# 新建一个Sessionself.driver = webdriver.Remote(self.server, self.desired_caps)

        # 设置滑动初始坐标和滑动距离self.start_x = 500        self.start_y = 1500        self.distance = 1300def comments(self):

        sleep(3)

        # app开启之后点击一次屏幕,确保页面的展示self.driver.tap([(500, 1200)], 500)

    def  scroll(self):

        # 无限滑动while True:

            # 模拟滑动            self.driver.swipe(self.start_x, self.start_y, self.start_x,

            self.start_y - self.distance)

            # 设置延时等待sleep(5)

    def   main(self):

        self.comments()

        self.scroll()

if  __name__  ==  '__main__':

    action = Action()

    action.main()

楼主运行次代码就能在Fiddler4中得到无限量的url。

3.楼主拿到url后,会发现有些url会重复,so楼主加入了去重的功能,为了好看楼主也加入了进度条花里花哨的功能,运行代码最终会下载下来。

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

import   requests

import sys

headers = {"User-Agent":"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.90 Safari/537.36" }##去重方法

def distinct_data():

    ##读取txt中文档的url列表datalist_blank=[]

    pathtxt  =  'H:/Request.txt'   

     with open(pathtxt) as f:

        f_data_list=f.readlines()   #d得到的是一个list类型forain f_data_list:

            datalist_blank.append(a.strip())#去掉\n strip去掉头尾默认空格或换行符# print(datalist)data_dict={}

    for   data   in datalist_blank:

        #print(type(data),data,'\n')

        #print(data.split('/'),'\n',data.split('/').index('m'),'\n')

        #url中以/为切分,在以m为切分 

        ##把m后面的值放进字典key的位置,利用字典特性去重

        if  int(data.split('/').index('m'))  ==  4 :

        #此处为v6开头的url

        #print(data,44,data.split('/')[5])data_key1=data.split("/")[5]

            data_dict[data_key1]=data

        elifint(data.split('/').index('m'))==6:

        #此处为v1或者v3或者v9开头的url

        #print(data,66,data.split('/')[7],type(data.split('/')[7]))data_key2=data.split("/")[7]

            data_dict[data_key2] =data

    #print(len(data_dict),data_dict)data_new=[]

    forx,yin data_dict.items():

        data_new.append(y)

    return data_newdef responsedouyin():

    data_url=distinct_data()

    # 使用request获取视频url的内容# stream=True作用是推迟下载响应体直到访问Response.content属性# 将视频写入文件夹num = 1forurlin data_url:

        res = requests.get(url,stream=True,headers=headers)

        #res = requests.get(url=url, stream=True, headers=headers)#定义视频存放的路径pathinfo ='H:/douyin-video/%d.mp4'% num#%d 用于整数输出  %s用于字符串输出# 实现下载进度条显示,这一步需要得到总视频大小total_size = int(res.headers['Content-Length'])

        #print('这是视频的总大小:',total_size)#设置流的起始值为0temp_size = 0

        ifres.status_code == 200:

            with open(pathinfo, 'wb') as file:

                #file.write(res.content)

                #print(pathinfo + '下载完成啦啦啦啦啦')

                num += 1

                #当流下载时,下面是优先推荐的获取内容方式,iter_content()函数就是得到文件的内容,指定chunk_size=1024,大小可以自己设置哟,设置的意思就是下载一点流写一点流到磁盘中

                f or  chunk  in  res.iter_content(chunk_size=1024):

                    if   chunk:

                        temp_size += len(chunk)

                        file.write(chunk)

                        file.flush() #刷新缓存#############下载进度条部分start###############done = int(50 * temp_size / total_size)

                        #print('百分比:',done)sys.stdout.write("\r[%s%s] %d % %"% ('█'* done,''* (50 - done), 100 * temp_size / total_size)+" 下载信息:"+pathinfo +"下载完成啦啦啦啦啦")

                        sys.stdout.flush()#刷新缓存#############下载进度条部分end###############print('\n')#每一条打印在屏幕上换行输出

if  __name__  ==  '__main__':

    responsedouyin()

运行代码,效果图如下

视频最终保存到文件夹中

github地址:https://github.com/Stevenguaishushu/douyin

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,033评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,725评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,473评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,846评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,848评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,691评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,053评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,700评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,856评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,676评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,787评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,430评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,034评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,990评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,218评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,174评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,526评论 2 343

推荐阅读更多精彩内容

  • 记录一下如何用python爬取app数据,本文以爬取抖音视频app为例。 编程工具:pycharm app抓包工具...
    朝畫夕拾阅读 6,667评论 0 3
  • 前言: Appium Python API全集,不知道哪个大神整理的,这里贴出来分享给大家。 1.contex...
    Roshan_阅读 1,962评论 0 5
  • 今天剪了个短发,然后就有人问我“你受什么刺激了?咋把头发剪了?”“失恋了?爱上渣男突然醒悟了?”“这是咋了呀,有烦...
    熊小懒阅读 411评论 2 2
  • 七绝•静夜思 林忠顺 多情未必霓虹夜,看遍凡花月最明。 隐步深山独影醉,无声落木叹风轻。 注:中华新韵•十一庚(平...
    林忠顺阅读 609评论 6 19
  • 今天表弟来我家玩了。 今天,表弟向奶奶问了好,之后我们一起看电视,看了一会儿电视之后觉得没意思,就在院...
    李浩宇爸爸阅读 467评论 0 0