很多人喜欢玩抖音,我也喜欢看抖音小姐姐,可拿着手机一个个找视频太费劲。作为一个程序员,如何能在电脑前一边编程一边轻松地看抖音小姐姐呢?
下面利用Python,简单的三个步骤就可以将你喜欢的抖音小姐姐的视频自动下载下来了。
Charles
Charles是一个App抓包工具,与Filddler的功能相似,利用它可以得到App运行过程中发生的所有网络请求和响应内容。
在电脑端下载安装完Charles后,需要配置证书,最后开启SSL监听。
手机端则是需要与电脑在同一网络下,比如都连接家里的Wi-Fi,然后在手机的Wi-Fi高级选项里使用Charles代理,输入电脑的IP地址,端口8888,最后为证书命名。
连好以后,手机打开抖音App,随着操作App的动作,可以获取到视频的请求信息。
通过多次实验,发现链接的后面是会不停的改变,只有链接的前头始终不变,即「http://v1-dy」「http://v6-dy」「http://v9-dy」不变。
所以在写脚本的时候,可以用这些信息做为链接开头。
MitmProxy
利用MitmProxy中的mitmdump组件,对接Python脚本,用Python实现监听后的处理。
这里我只是利用脚本获取链接,并没有直接利用脚本下载视频。
因为我是在mitmdump.exe文件所在的文件夹运行脚本,脚本里导入不了requests模块。
不想配置环境变量了,所以只获取链接。
利用链接再去下载视频,视频链接需要去重,因为可能会有重复的。
Python脚本如下:
def response(flow): urls = ['http://v1-dy', 'http://v3-dy', 'http://v6-dy', 'http://v9-dy'] # 对url进行筛选,只选取视频的url for url in urls: if url in flow.request.url: print('\n\n抖音视频\n\n') with open('douyin.csv', 'a+', encoding='utf-8-sig') as f: f.write(flow.request.url + '\n')
配置抖音的Appium参数:
点击蓝色按钮,手机自动启动抖音App。接着操作手机,然后点击Appium的刷新键,获取元素定位代码。
通过本次的实践发现Appium有时并不能很好的获取元素的定位,针对找不到的元素,我直接对手机屏幕位置进行点击。
由于大家手机屏幕大小不同,这个参数肯定是会变化的,所以存在弊端,无法通用。
左右滑动切换图片
大致操作如上图。UP主的主页图漏了,请自行脑补,Python代码如下:
import time import random from appium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from appium.webdriver.common.touch_action import TouchAction from selenium.webdriver.support import expected_conditions as EC def main(): # 设置驱动配置 server = 'http://localhost:4723/wd/hub' desired_caps = { 'platformName': 'Android', 'deviceName': 'STF_AL00', 'appPackage': 'com.ss.android.ugc.aweme', 'appActivity': '.main.MainActivity', # 关闭手机软键盘 'unicodeKeyboard': True, 'resetKeyboard': True } driver = webdriver.Remote(server, desired_caps) wait = WebDriverWait(driver, 60) # 同意用户隐私协议,点击 button_1 = wait.until(EC.presence_of_element_located((By.ID, 'com.ss.android.ugc.aweme:id/q6'))) button_1.click() # 禁止电话权限,点击 button_2 = wait.until(EC.presence_of_element_located((By.ID, 'com.android.packageinstaller:id/permission_deny_button'))) button_2.click() # 禁止位置权限,点击 button_3 = wait.until(EC.presence_of_element_located((By.ID, 'com.android.packageinstaller:id/permission_deny_button'))) button_3.click() time.sleep(2) # 向上滑动,进入抖音视频播放页面 TouchAction(driver).press(x=515, y=1200).move_to(x=515, y=1000).release().perform() # 这里需要设置一个较长时间的延迟,因为抖音有引导操作和提示,需等待片刻 time.sleep(20) # 点击抖音"喜欢"处,以此进入登录界面 TouchAction(driver).press(x=950, y=800).release().perform() # 点击密码登录 button_4 = wait.until(EC.presence_of_element_located((By.ID, 'com.ss.android.ugc.aweme:id/afg'))) button_4.click() # 输入账号 button_5 = wait.until(EC.presence_of_element_located((By.ID, 'com.ss.android.ugc.aweme:id/ab_'))) button_5.send_keys('你的账号') # 输入密码 button_6 = wait.until(EC.presence_of_element_located((By.ID, 'com.ss.android.ugc.aweme:id/aes'))) button_6.send_keys('你的密码') time.sleep(2) # 因为会跳出软键盘,会遮挡登录按钮,需点击软键盘取消 TouchAction(driver).press(x=980, y=1850).release().perform() time.sleep(2) # 点击登录按钮 button_7 = wait.until(EC.presence_of_element_located((By.ID, 'com.ss.android.ugc.aweme:id/abb'))) button_7.click() time.sleep(2) # 登录成功,进入抖音视频界面,点击下方标题栏 "我" TouchAction(driver).press(x=990, y=1850).release().perform() # 进入个人主页,点击关注处 button_8 = wait.until(EC.presence_of_element_located((By.ID, 'com.ss.android.ugc.aweme:id/a_7'))) button_8.click() # 进入关注栏,点击第二个关注 button_9 = wait.until(EC.presence_of_element_located((By.XPATH, ' /hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.RelativeLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.view.ViewGroup/android.widget.LinearLayout/android.support.v7.widget.RecyclerView/android.widget.RelativeLayout[2]/android.widget.RelativeLayout[1]'))) button_9.click() # 进入UP主主页,点击第一个视频 button_10 = wait.until(EC.presence_of_element_located((By.ID, 'com.ss.android.ugc.aweme:id/aqm'))) button_10.click() # 不断下滑页面,直到底部 while True: TouchAction(driver).press(x=515, y=1247).move_to(x=515, y=1026).release().perform() time.sleep(float(random.randint(5, 10))) if __name__ == '__main__': main()
下载视频代码,需要对视频链接去重:
import pandas as pd import requests import os num = 0 dom = [] folder_path = "F:/video/" os.makedirs(folder_path) df = pd.read_csv('douyin.csv', header=None, names=["url"]) # 对链接去重及去除刚进入抖音获取的视频链接 for i in df['url'][2:]: if i not in dom: dom.append(i) # 下载视频 for j in dom: url = j num += 1 response = requests.get(url, stream=True) filename = str(num) + '.mp4' with open('F:\\video\\' + filename, 'ab+') as f: f.write(response.content) f.flush() print(filename + '下载完成')
最后成功获取小姐姐们的全部视频:
我打算将视频里喜欢的妹子全剪辑出来,做一个「最美瞬间」系列的视频,分享给大家!
源码地址:
https://github.com/Tobby-star/douyin
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。
更新日志
- 【雨果唱片】中国管弦乐《鹿回头》WAV
- APM亚流新世代《一起冒险》[FLAC/分轨][106.77MB]
- 崔健《飞狗》律冻文化[WAV+CUE][1.1G]
- 罗志祥《舞状元 (Explicit)》[320K/MP3][66.77MB]
- 尤雅.1997-幽雅精粹2CD【南方】【WAV+CUE】
- 张惠妹.2007-STAR(引进版)【EMI百代】【WAV+CUE】
- 群星.2008-LOVE情歌集VOL.8【正东】【WAV+CUE】
- 罗志祥《舞状元 (Explicit)》[FLAC/分轨][360.76MB]
- Tank《我不伟大,至少我能改变我。》[320K/MP3][160.41MB]
- Tank《我不伟大,至少我能改变我。》[FLAC/分轨][236.89MB]
- CD圣经推荐-夏韶声《谙2》SACD-ISO
- 钟镇涛-《百分百钟镇涛》首批限量版SACD-ISO
- 群星《继续微笑致敬许冠杰》[低速原抓WAV+CUE]
- 潘秀琼.2003-国语难忘金曲珍藏集【皇星全音】【WAV+CUE】
- 林东松.1997-2039玫瑰事件【宝丽金】【WAV+CUE】