抖音很火,楼主使用python随机爬取抖音视频,并且无水印下载,人家都说天下没有爬不到的数据,so,楼主决定试试水,纯属技术爱好,分享给大家。。
v1-dy.ixigua.com,v3-dy.ixigua.com,v6-dy.ixigua.com,v9-dy.ixigua.com
//保存到本地添加开始
//这是抖音的地址||"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:" + " " + oSession.oRequest.headers);
//file.writeLine("Request-body:" + oSession.GetRequestBodyAsString());
//file.writeLine(" ");
file.close();
}
//保存到本地添加结束
到appium客户端中即可,就能在appium客户端中操作抖音app。
{
"platformName": "Android",
"deviceName": "Redmi Note5",
"appPackage": "com.ss.android.ugc.aweme",
"appActivity": ".main.MainActivity"
}
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())#去掉 strip去掉头尾默认空格或换行符# print(datalist)data_dict={}
for data in datalist_blank:
#print(type(data),data,' ')
#print(data.split('/'),' ',data.split('/').index('m'),' ')
#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(" [%s%s] %d % %"% ('█'* done,''* (50 - done), 100 * temp_size / total_size)+" 下载信息:"+pathinfo +"下载完成啦啦啦啦啦")
sys.stdout.flush()#刷新缓存#############下载进度条部分end###############print(' ')#每一条打印在屏幕上换行输出
if __name__ == '__main__':
responsedouyin()