欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

使用python爬取抖音視頻列表信息

 更新時間:2019年07月15日 09:14:24   作者:數(shù)據(jù)科學  
這篇文章主要介紹了如何用python爬取抖音視頻列表信息,本文圖文并茂給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下

如果看到特別感興趣的抖音vlogger的視頻,想全部dump下來,如何操作呢?下面介紹介紹如何使用python導出特定用戶所有視頻信息

抓包分析

Chrome Deveploer Tools Chrome 瀏覽器開發(fā)者工具

在抖音APP端,復制vlogger主頁地址, 比如: http://v.douyin.com/kGcU4y/ , 在PC端用chrome瀏覽器打卡,并模擬手機,這里選擇iPhone, 然后把復制的主頁地址,放到瀏覽器進行訪問,頁面跳轉到 https://www.iesdouyin.com/share/user/110677980134

下拉主頁, 選擇Network=>XHR 選項卡, 看到類似請求

:authority: www.iesdouyin.com
:method: GET
:path: /web/api/v2/aweme/post/?user_id=110677980134&sec_uid=&count=21&max_cursor=1561112910000&aid=1128&_signature=3Xf-nxAQgGfUO4SKisB.Ld13.o&dytk=061ae6e81229e178146aa674327eba89
:scheme: https
accept: application/json
accept-encoding: gzip, deflate, br
accept-language: zh-CN,zh;q=0.9,en;q=0.8,ja;q=0.7,zh-TW;q=0.6,da;q=0.5
cookie: tt_webid=6690145457198417412; _ga=GA1.2.605400954.1557670882; _ba=BA0.2-20181226-5199e-GIJXgXk9ajNkyFhmv7Wy; _gid=GA1.2.1914501522.1562857517
referer: https://www.iesdouyin.com/share/user/110677980134
user-agent: Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1
x-requested-with: XMLHttpRequest

返回數(shù)據(jù)截圖

通過分析ajax請求的URL https://www.iesdouyin.com/web/api/v2/aweme/post/?user_id=110677980134&sec_uid=&count=21&max_cursor=1559299764000&aid=1128&_signature=3Xf-nxAQgGfUO4SKisB.Ld13.o&dytk=061ae6e81229e178146aa674327eba89 得出請求參數(shù)主要包含:

字段 類型 說明
user_id int 抖音賬號的ID
count int 返回的數(shù)據(jù)條數(shù),就用默認值21
max_cursor int 請求的游標,每次請求帶上上次請求返回的max_cursor
aid int 使用默認值11128
_signature string 每次請求帶上的參數(shù)簽名
dytk string 每次請求帶上的一個參數(shù)

參數(shù)的獲取方法:

https://www.iesdouyin.com/share/user/110677980134

(function() {
  $(function(){
    __M.require('douyin_falcon:page/reflow_user/index').init({
      uid: "110677980134",
      dytk: '061ae6e81229e178146aa674327eba89'
    });
  });
})();

通過正則獲取到此參數(shù)

  • _signature 獲取比較復雜,抖音對前端的js代碼進行了混淆壓縮,不易直接分析出算法過程,不過可以執(zhí)行簽名算法代碼,并返回對應的簽名結果。
  • 執(zhí)行js代碼的可以使用nodejs或者selenium webdriver,這里推薦使用selenium webdriver , nodejs的js執(zhí)行環(huán)境與瀏覽器有區(qū)別,計算出的簽名結果,并不能通過驗證,selenium webdriver 可以調用本地瀏覽器,計算出的簽名可以跟瀏覽器直接訪問訪問計算出的簽名一致。
  • 格式化之后的js代碼,點擊查看, 執(zhí)行js方法 _bytedAcrawler.sign("110677980134") 對參數(shù)進行簽名

代碼實現(xiàn)導出主頁視頻列表

def get_user_video_list_by_uid(user_id, cursor=0):
  url = 'https://www.iesdouyin.com/web/api/v2/aweme/post/?'
  sign, dytk = signature(user_id)
  tk_logger.info("sign:%s,dytk:%s" % (sign, dytk))
  if sign is None or dytk is None:
    tk_logger.log("sign [%s] or dytk [%s] is none" % (sign, dytk))
    return None
  headers = dict_merge(CHROME_HEADER, {
    "Accept": "application/json",
    "X-Requested-With": "XMLHttpRequest",
  })
  params = {
    "user_id": user_id,
    "count": "21",
    "max_cursor": cursor,
    "aid": "1128",
    "_signature": sign,
    "dytk": dytk
  }
  res = requests.get(url, headers=headers, params=params)
  tk_logger.info("request url: %s" % res.url)
  content = res.content.decode("utf8")
  jsn = json.loads(content)
  return jsn

獲取的視頻列表信息


獲取視頻信息代碼片段

def get_video_detail_by_id(video_id):
  url = "https://aweme-hl.snssdk.com/aweme/v1/aweme/detail/?version_code=6.5.0&pass-region=1&pass-route=1&js_sdk_version=1.16.2.7&app_name=aweme&vid=9D5F078E-A1A9-4F64-81C7-F89CA6A3B1DC&app_version=6.5.0&device_id=34712926793&channel=App%20Store&mcc_mnc=46011&aid=1128&screen_width=750&openudid=263bd93f02801d126ca004edccbff8f6e1b19f51&os_api=18∾=WIFI&os_version=12.3.1&device_platform=iphone&build_number=65014&device_type=iPhone9,1&iid=74239983401&idfa=F39B285A-4B4F-4874-9D7E-C728A892BF6D"
  data = {"aweme_id": video_id}
  headers = {
    "sdk-version": "1",
    "x-Tt-Token": "00fc1e7950db67b5f43a312e9265cdfee513ea70c36d918c871f3bb553347f3db50ffca143b8722327b345816a75efca071d",
    "User-Agent": "Aweme 6.5.0 rv:65014 (iPhone; iOS 12.3.1; en_CN) Cronet",
    "Content-Type": "application/x-www-form-urlencoded",
    "Cookie": "tt_webid=6636348554880222728; __tea_sdk__user_unique_id=6636348554880222728; odin_tt=76d9b82d6e6f2ddfc99719a5b5d44a7d703cf977f0f7bddf8537f93920d57cb9ec33162ee47868b760f6b09e69209bb2f90bad220b75678af850a0dfa9f056e2; install_id=74239983401; ttreq=1$dab0516952a4157c0c11d4993533c09d6e45fc94; sid_guard=fc1e7950db67b5f43a312e9265cdfee5%7C1559955316%7C5184000%7CWed%2C+07-Aug-2019+00%3A55%3A16+GMT; uid_tt=0afcb06309f632d872799ec0ac3b2c80; sid_tt=fc1e7950db67b5f43a312e9265cdfee5; sessionid=fc1e7950db67b5f43a312e9265cdfee5",
    "X-Khronos": "1559956401",
    "X-Gorgon": "8300000000002e40eee38cad71d14037bd1385d18bc973f094f5",
  }
  ret = {}
  res = requests.post(url, data=data, headers=headers)
  if res.status_code == 200:
    # tk_logger.info("video detail raw:%s" % res.content.decode("utf8"))
    jsn = json.loads(res.content)
    detail = jsn.get("aweme_detail", {})
    video_info = get_video_info(detail)
    user_info = get_user_info(detail)
    play_addr = get_play_address(detail)
    video_cover = get_video_cover(detail)
    ret["video_info"] = video_info
    ret["user_info"] = user_info
    ret["play_addr"] = play_addr
    ret["video_cover"] = video_cover
  else:
    raise TKException("get video detail failed [%s][%d]" % (url, res.status_code))
  return ret

下載視頻代碼片段

detail = get_video_detail_by_id(video_id)
def download_video(detail):
  url = detail.get("play_addr", {}).get("url_list", [])
  if len(url) == 0:
    raise TKException("cannot get video url list [%s]" % detail)

  url = url[0]
  folder = DOWNLOAD_DIR + '/' + detail.get('user_info', {}).get("uid", "unknown")
  if not os.path.exists(folder):
    os.mkdir(folder)
  video_id = detail.get('video_info', {}).get('statistics', {}).get('aweme_id')
  # filename = "%s/%s" % (folder, detail.get("video_info", {}).get("desc", video_id) + ".mp4")
  filename = "%s/%s" % (folder, video_id + ".mp4")
  tk_logger.info("download video %s" % url)
  if os.path.isfile(filename):
    file_size = get_remote_file_size(url)
    if file_size == os.path.getsize(filename):
      tk_logger.info("file already downloaded, skip ...")
      return
    else:
      tk_logger.info("download file , file size:%d" % file_size)
  res = requests.get(url, headers=IOS_HEADER)
  if res.status_code == 200:
    with open(filename, "wb") as fp:
      for chunk in res.iter_content(chunk_size=1024):
        fp.write(chunk)
  else:
    raise TKException("download video [%s] failed [%d]" % (url, res.status_code))

下載視頻

總結

以上所述是小編給大家介紹的使用python爬取抖音視頻列表信息 ,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
如果你覺得本文對你有幫助,歡迎轉載,煩請注明出處,謝謝!

相關文章

  • python實現(xiàn)計算倒數(shù)的方法

    python實現(xiàn)計算倒數(shù)的方法

    這篇文章主要介紹了python實現(xiàn)計算倒數(shù)的方法,涉及Python針對數(shù)學運算操作的相關技巧,需要的朋友可以參考下
    2015-07-07
  • python模擬登錄百度代碼分享(獲取百度貼吧等級)

    python模擬登錄百度代碼分享(獲取百度貼吧等級)

    python模擬登錄百度,實現(xiàn)了登錄并讀取百度關注貼吧列表,百度登錄還是有點麻煩的,由于用的ssl,所以要先獲取token,然后再登錄,這個用finddle2分析下,還是比較好解決的
    2013-12-12
  • 基于Python編寫一個計算器程序,實現(xiàn)簡單的加減乘除和取余二元運算

    基于Python編寫一個計算器程序,實現(xiàn)簡單的加減乘除和取余二元運算

    這篇文章主要介紹了基于Python編寫一個計算器程序,實現(xiàn)簡單的加減乘除和取余二元運算,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-08-08
  • Python字符串內置函數(shù)功能與用法總結

    Python字符串內置函數(shù)功能與用法總結

    這篇文章主要介紹了Python字符串內置函數(shù)功能與用法,結合實例形式總結分析了Python常見字符串操作函數(shù)的功能、分類、使用方法及相關操作注意事項,需要的朋友可以參考下
    2019-04-04
  • Python人臉識別初探

    Python人臉識別初探

    這篇文章主要為大家詳細介紹了Python人臉識別初探的相關資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-12-12
  • Python ORM框架SQLAlchemy學習筆記之數(shù)據(jù)添加和事務回滾介紹

    Python ORM框架SQLAlchemy學習筆記之數(shù)據(jù)添加和事務回滾介紹

    這篇文章主要介紹了Python ORM框架SQLAlchemy學習筆記之數(shù)據(jù)添加和事務回滾介紹,需要的朋友可以參考下
    2014-06-06
  • python with (as)語句實例詳解

    python with (as)語句實例詳解

    這篇文章主要介紹了python with (as)語句實例詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-02-02
  • python中賦值語句的特點和形式

    python中賦值語句的特點和形式

    這篇文章主要介紹了python中賦值語句的特點和形式,文中介紹了多目標賦值的共享引用問題,多目標賦值其實是多個目標對同一個內存空間的引用,這里要分兩種情況,當被引用對象是不可變對象時則不存在問題,感興趣的朋友跟隨小編一起看看吧
    2023-12-12
  • Python數(shù)學建模學習模擬退火算法旅行商問題示例解析

    Python數(shù)學建模學習模擬退火算法旅行商問題示例解析

    模擬退火算法不僅可以解決連續(xù)函數(shù)優(yōu)化問題,KIRKPATRICK在1983年成功將其應用于求解組合優(yōu)化問題,現(xiàn)已成為求解旅行商問題的常用方法,通常采用反序、移位和交換等操作算子產生新解
    2021-10-10
  • Python的多種對象工廠模式方便代碼維護擴展

    Python的多種對象工廠模式方便代碼維護擴展

    這篇文章主要為大家介紹了Python的多種對象工廠模式更方便我們進行代碼維護擴展,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2024-01-01

最新評論