抖音很火,樓主使用python隨機(jī)爬取抖音視頻,并且無水印下載,人家都說天下沒有爬不到的數(shù)據(jù),so,樓主決定試試水,純屬技術(shù)愛好,分享給大家。。
1.樓主首先使用Fiddler4來抓取手機(jī)抖音app這個(gè)包,具體配置的操作,網(wǎng)上有很多教程供大家參考。
上面得出抖音的視頻的url,這些url均能在網(wǎng)頁中打開,樓主數(shù)了數(shù),這些url的前綴有些不同,一共有這4種類型:
v1-dy.ixigua.com
v3-dy.ixigua.com
v6-dy.ixigua.com
v9-dy.ixigua.com
樓主查看這四種類型得知,v6-dy.ixigua.com 這個(gè)前綴后面的參數(shù)其中有一個(gè)是Expires(中文含義過期的意思)
Expires=1536737310,這個(gè)是時(shí)間戳,標(biāo)記的是過期的時(shí)間如下圖所示,過了15:28分30秒,則表示url不能使用,樓主算了一下,url有效期是一個(gè)小時(shí)。
看到這些url,樓主不能手動(dòng)一個(gè)一個(gè)粘貼,so樓主需要在+Fiddler4中(在Fiddler4使用script代碼網(wǎng)上有大量詳細(xì)教程)使用如下代碼,自動(dòng)保存到一個(gè)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();
}
//保存到本地添加結(jié)束
把上邊的代碼插入到如下圖所示的地方即可。
2.上面的url是樓主手動(dòng)點(diǎn)擊一個(gè)個(gè)刷新抖音app出現(xiàn)的,so樓主使用appium來自動(dòng)刷新抖音app,自動(dòng)獲得url,自動(dòng)保存到txt文檔中。
首先需要在appium中得到抖音這個(gè)app包的一些用的信息,如下圖所示
樓主使用的是紅米手機(jī),至于appium怎么安裝配置,大家可參考網(wǎng)上相關(guān)教程,appium客戶端連接上手機(jī)(需要數(shù)據(jù)線連接)后,在控制臺(tái)打印出log日志文件,在日志文件中找到這四個(gè)參數(shù)即可,然后保存
到appium客戶端中即可,就能在appium客戶端中操作抖音app。
{
? “platformName”: “Android”,
? “deviceName”: “Redmi Note5”,
? “appPackage”: “com.ss.android.ugc.aweme”,
? “appActivity”: “.main.MainActivity”
}
appPackage這一項(xiàng)com.ss.android.ugc.aweme 則表示抖音短視頻。
樓主使用如下代碼來實(shí)現(xiàn)無限刷新抖音app,前提是需要手機(jī)連著數(shù)據(jù)線連在電腦上并且開啟appium客戶端的服務(wù)和打開Fiddler4抓包(配置好環(huán)境手機(jī))。
from appium import webdriver
from time import sleep
'''
遇到不懂的問題?Python學(xué)習(xí)交流群:821460695滿足你的需求,資料都已經(jīng)上傳群文件,可以自行下載!
'''
##以下代碼可以操控手機(jī)app
class Action():
def __init__(self):
# 初始化配置,設(shè)置Desired Capabilities參數(shù)
self.desired_caps = {
"platformName": "Android",
"deviceName": "Mi_Note_3",
"appPackage": "com.ss.android.ugc.aweme",
"appActivity": ".main.MainActivity"
}
# 指定Appium Server
self.server = 'http://localhost:4723/wd/hub'
# 新建一個(gè)Session
self.driver = webdriver.Remote(self.server, self.desired_caps)
# 設(shè)置滑動(dòng)初始坐標(biāo)和滑動(dòng)距離
self.start_x = 500
self.start_y = 1500
self.distance = 1300
def comments(self):
sleep(3)
# app開啟之后點(diǎn)擊一次屏幕,確保頁面的展示
self.driver.tap([(500, 1200)], 500)
def scroll(self):
# 無限滑動(dòng)
while True:
# 模擬滑動(dòng)
self.driver.swipe(self.start_x, self.start_y, self.start_x,
self.start_y - self.distance)
# 設(shè)置延時(shí)等待
sleep(5)
def main(self):
self.comments()
self.scroll()
if __name__ == '__main__':
action = Action()
action.main()
樓主運(yùn)行次代碼就能在Fiddler4中得到無限量的url。
3.樓主拿到url后,會(huì)發(fā)現(xiàn)有些url會(huì)重復(fù),so樓主加入了去重的功能,為了好看樓主也加入了進(jìn)度條花里花哨的功能,運(yùn)行代碼最終會(huì)下載下來。
# _*_ coding: utf-8 _*_
import requests
import sys
'''
遇到不懂的問題?Python學(xué)習(xí)交流群:821460695滿足你的需求,資料都已經(jīng)上傳群文件,可以自行下載!
'''
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得到的是一個(gè)list類型
for a in f_data_list:
datalist_blank.append(a.strip())#去掉\n strip去掉頭尾默認(rèn)空格或換行符
# 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后面的值放進(jìn)字典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
elif int(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=[]
for x,y in data_dict.items():
data_new.append(y)
return data_new
def responsedouyin():
data_url=distinct_data()
# 使用request獲取視頻url的內(nèi)容
# stream=True作用是推遲下載響應(yīng)體直到訪問Response.content屬性
# 將視頻寫入文件夾
num = 1
for url in 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 用于整數(shù)輸出 %s用于字符串輸出
# 實(shí)現(xiàn)下載進(jìn)度條顯示,這一步需要得到總視頻大小
total_size = int(res.headers['Content-Length'])
#print('這是視頻的總大小:',total_size)
#設(shè)置流的起始值為0
temp_size = 0
if res.status_code == 200:
with open(pathinfo, 'wb') as file:
#file.write(res.content)
#print(pathinfo + '下載完成啦啦啦啦啦')
num += 1
#當(dāng)流下載時(shí),下面是優(yōu)先推薦的獲取內(nèi)容方式,iter_content()函數(shù)就是得到文件的內(nèi)容,指定chunk_size=1024,大小可以自己設(shè)置喲,設(shè)置的意思就是下載一點(diǎn)流寫一點(diǎn)流到磁盤中
for chunk in res.iter_content(chunk_size=1024):
if chunk:
temp_size += len(chunk)
file.write(chunk)
file.flush() #刷新緩存
#############下載進(jìn)度條部分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()#刷新緩存
#############下載進(jìn)度條部分end###############
print('\n')#每一條打印在屏幕上換行輸出
if __name__ == '__main__':
responsedouyin()
運(yùn)行代碼,效果圖如下
視頻最終保存到文件夾中
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元

