1. 程式人生 > >Python爬蟲之如何爬取抖音小姐姐的視訊

Python爬蟲之如何爬取抖音小姐姐的視訊

640?wx_fmt=png

介紹

這次爬的是當下大火的APP--抖音,批量下載一個使用者釋出的所有視訊。各位也應該知道,抖音只有移動端,官網開啟除了給你個APP下載二維碼啥也沒有,所以相比爬PC網站,還是遇到了更多的問題,也花了更多的時間,不過好在基本實現了,除了一點咱在後面說。

思路梳理

其實如果看了其他博主爬抖音的教程就發現,大部分都是通過fildder手機抓包來獲取介面地址等資訊,其實不用那麼麻煩,我們通過分享選擇連結形式就可以獲取到資訊:

640?wx_fmt=png

然後電腦訪問這個連結,就可以開啟頁面了,不過很快我們就會發現一個問題,電腦訪問這個地址釋出視訊是空的:

640?wx_fmt=png

谷歌Chrome瀏覽器有一個模擬手機訪問的功能,我們選在iPhone X模式來訪問頁面,果然看到釋出的視訊了:

640?wx_fmt=png

我們接下來看下後臺請求,不多,很快就找到我們需要的視訊資訊了,也能直接開啟觀看視訊,到這感覺已經成功了一大半了:

640?wx_fmt=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為止。

640?wx_fmt=png

這樣所有視訊地址都有了,就開始下載吧!!

640?wx_fmt=png

640?wx_fmt=png

程式碼部分

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 '******[email protected]_Tang、******'

問題

開始說了,目前還存在一個問題,我們看介面地址可以發現,目前需要5個引數分別是:
user_id, max_cursor,count,_signature, dytk
前面三個都沒問題,而且我看有的博主5/6月份都文章都還只需要前三個引數,_signature, dytk是兩個加密之後的引數,不知道咋加密的,而且selenium似乎也沒有獲取後臺請求地址的方法,返回的視訊地址也沒有在頁面進行渲染,所以現在還需要點選分享連結之後手動填入_signature, dytk兩個值,有點冒傻氣~skr~skr~~

原創作者:Awesome_Tang,原文連結:https://www.jianshu.com/p/80e5b3c25905

640?wx_fmt=png

相關推薦

Python爬蟲如何姐姐視訊

介紹這次爬的是當下大火的APP--抖音,批量下載一個使用者釋出的所有視訊。各位也應該知道,抖音只

使用python-requests+Fiddler4+appium爬蟲,批量視訊

抖音很火,大家都知道,樓主決定使用python爬取抖音小視訊,人家都說天下沒有爬不到的資料,so,樓主決定試試水,純屬技術愛好,分享給大家。。 1.樓主首先使用Fiddler4來抓取手機抖音app這個包,具體配置的操作,網上有很多教程供大家參考。 上面得出抖音的視訊的url,這些url均能在網頁中

使用python爬蟲,批量app視訊

使用python爬蟲,批量爬取抖音app視訊(requests+Fiddler+appium) 抖音很火,樓主使用python隨機爬取抖音視訊,並且無水印下載,人家都說天下沒有爬不到的資料,so,樓主決定試試水,純屬技術愛好,分享給大家。。 1.樓主首先使用Fiddler4來抓取手機抖音

python無水印姐姐視訊(2018最新,含Pyqt客戶端)

       各位小夥伴,之前一段時間迷上了抖音小姐姐視訊,但是下載的視訊都有水印,於是自己用Python 寫了個爬取小姐姐視訊的工具,大家可以直接拷貝到自己編譯器上執行。此外,我還利用pyqt5寫了個操作介面,這樣可以方便不懂程式碼的人使用。後面程式碼我都會一一貼上來。備註

Python爬蟲煎蛋網妹子圖

創建目錄 req add 註意 not 相同 esp mpi python3 這篇文章通過簡單的Python爬蟲(未使用框架,僅供娛樂)獲取並下載煎蛋網妹子圖指定頁面或全部圖片,並將圖片下載到磁盤。 首先導入模塊:urllib.request、re、os import

python3 學習 3:python爬蟲動態載入的圖片,以百度圖片為例

轉: https://blog.csdn.net/qq_32166627/article/details/60882964 前言: 前面我們爬取圖片的網站都是靜態的,在頁面中右鍵檢視原始碼就能看到網頁中圖片的位置。這樣我們用requests庫得到頁面原始碼後,再用bs4庫解析標籤即可儲存圖片

Python爬蟲各大幣交易網站公告——靜態網站.md

Python爬蟲之爬取各大幣交易網站公告——靜態網站 瞭解爬蟲之後,我們也漸漸掌握了根據網站的種類選擇不同庫來對其進行處理,提取我們想要的東西。 靜態網站,我們往往利用requests庫提取網站html資訊,再通過正則表示式或BeautifulSoup庫提取我們

python學習(7):python爬蟲動態載入的圖片,以百度圖片為例

前言: 前面我們爬取圖片的網站都是靜態的,在頁面中右鍵檢視原始碼就能看到網頁中圖片的位置。這樣我們用requests庫得到頁面原始碼後,再用bs4庫解析標籤即可儲存圖片到本地。 當我們在看百度圖片時,右鍵–檢查–Elements,點選箭頭,再用箭頭點選圖片時

Python爬蟲動態頁面資料

很多網站通常會用到Ajax和動態HTML技術,因而只是使用基於靜態頁面爬取的方法是行不通的。對於動態網站資訊的爬取需要使用另外的一些方法。 先看看如何分辨網站時靜態的還是動態的,正常而言含有“檢視更多”字樣或者開啟網站時下拉才會載入內容出來的進本都是動態的,簡便的方法就是在

Python 3.X所有視訊

今天閒著沒事刷抖音,看到好多好看的小姐姐,突然想到把抖音裡好看好玩的視訊都下載來多方便看省的一會一個廣告,一會一個推送的。 我先是用fiddler抓包工具進行了抖音app的抓包, fiddler的使用:https://blog.csdn.net/lyd135

Python爬蟲知乎帖子並儲存到mysql(以及遇到問題和解決方法)

爬取問題標題並儲存到資料庫: 程式碼: # coding=utf-8 import urllib import urllib2 import re import MySQLdb #co

Python爬蟲瓜子二手車資訊- requests方法

最近在做二手車市場資料分析,試著爬取瓜子二手車在售車輛資訊,做一下記錄 大致思路如下: 2、從a連結頁面獲取每輛車詳情頁的連結b 3、進入b抓取我需要的車輛資訊:     car_model = Field() # 車型資訊 registe

Python爬蟲內涵吧段子(urllib.request)

引言 在寒假開始的時候就打算學習爬蟲了,但是沒有想到一入坑到現在還沒有出坑,說多了都是淚 T_T 我準備介紹的這個庫是我初學爬蟲時候用到的,比較古老,所以我只用了一兩次就轉向了requests了

python初級實戰系列教程《一、爬蟲網頁、圖片、視訊

python基礎知識可以到廖雪峰大佬的官網學習哦! 廖雪峰官網網址 學完python就開始我們的實戰吧!首先我們就來學習下python爬蟲 學習Python爬蟲,先是介紹一個最容易上手的庫urll

Python爬蟲---視訊

[TOC] ##前言 最近一直想要寫一個抖音爬蟲來批量下載抖音的短視訊,但是經過幾天的摸索我發現了一個很嚴重的問題......抖音實在是難爬!從一開始的網頁分析中就有著很多的坑,但是這幾天的摸索也不是一無所獲,我鼓搗出來了一個問題版的抖音爬蟲(操作較為複雜),所以我也想通過這篇部落格來記錄下我分析網頁的過程,

怎麽用Python小視頻? 資深程序員都這樣的(附源碼)

aid option rip size with open url var mark open 簡介 抖音,是一款可以拍短視頻的音樂創意短視頻社交軟件,該軟件於2016年9月上線,是一個專註年輕人的15秒音樂短視頻社區。用戶可以通過這款軟件選擇歌曲,拍攝15秒的音樂短視頻

白scrapy爬蟲簡書網頁並下載對應鏈接內容

tps python 分享 列表 scrapy 網頁 pytho 分享圖片 介紹 *準備工作: 爬取的網址:https://www.jianshu.com/p/7353375213ab 爬取的內容:下圖中python庫介紹的內容列表,並將其鏈接的文章內容寫進文本文件中 小

PythonAPP,竟然只需要十行程式碼

環境說明 環境: python 3.7.1 centos 7.4 pip 10.0.1 部署 [[email protected] ~]# python3.7 --version Python 3.7.1 [[email protected] ~]#

爬蟲熱門音樂

爬取抖音的熱門 音樂 詳細程式碼在下面 響應體內容工作流 預設情況下,當你進行網路請求後,響應體會立即被下載。你可以通過 stream 引數覆蓋這個行為,推遲下載響應體直到訪問 Response.content 屬性: tarb

Python網路爬蟲淘寶網頁頁面 MOOC可以執行的程式碼

可以實現功能的全部程式碼: import requests import re def getHTMLText(url): try: r = requests.get(url, timeout = 30) r.raise_for_statu