教大家怎樣使用腳本抓取湯不熱(Tumblr)小視頻并下載下來

  • A+
所屬分類:福利分享 艾微資訊

之前準備發這個帖子,被禁言了,可能是因為違規圖床,或者是代碼有問題,不敢發了,所以,部分代碼都以貼圖代替,也移除了鏈接(果然是對鏈接理解不同,我理解的是帶點擊跳轉的才叫鏈接)。
疑似違規的圖床,是一個叫貼圖庫的網站,生成的圖片地址是 i2.piimg.com,如果是違規的請大家告訴我,因為我在搜索本站的時候,并未搜索到相應的地址。
前陣子看到有兄弟發了個腳本抓豆瓣的姑娘們,覺得挺有意思的,果然還是懂點技術流弊啊,其實我這帖子也請教了他。
最近迷上了湯不熱(Tumblr),比較喜歡看上面的真人實拍的視頻,心想著能不能自動去下載視頻,然后放到我的谷歌屌絲版的VR眼鏡里去欣賞,雖然都不長,但是畢竟是真人實拍,和AV還是有區別的。
于是上網找了一下有沒有這樣的腳本,發現已經有很多了,但是都不是很完美,于是,我準備自己動手改。找到一個看起來能用的腳本,于是就開始了我的改造計劃。
要改造是因為湯不熱(Tumblr)頁面的結構經常變動,頁面結構一變,代碼也要跟著變,而且視頻的地址可能會經過多重跳轉,可不是,在發這個文章之前,我發現前幾天寫的代碼不能用了,因為界面結構變了,所以要調整。
這個腳本只能下載視頻,不含圖片,我覺得圖片上網看看就好了,而且只是視頻的地址,雖然Python有很多庫可以直接下載,但是畢竟不是專業的,保存好地址可以放到迅雷了批量下載。ps:不知道為什么,有些地址在瀏覽器里可以很快速度下載,但是迅雷就沒速度,不知道為啥,如果遇到迅雷沒速度的,可以用瀏覽器直接下載。
版本是Python 2,有興趣的,可以去谷歌一下Python2環境的搭建,我這里就不詳細說了,我千言萬語的表達,都勝過你去看個教程。遇到所有的錯誤,都可以在Google上找到。有問題我會盡量解答,無奈有回復限制。
代碼如下:

import sys, getopt,wget
import time,re,os,requests,urllib2
import sys
from bs4 import BeautifulSoup

#ss搭理配置,其他代理自己改
proxies = {
\"http\": \"socks5://127.0.0.1:1080\",
\"https\": \"socks5://127.0.0.1:1080\",
}

reload(sys)
sys.setdefaultencoding( \"utf-8\" )
#----------- 爬取tumblr圖片和視頻 -----------
class TumblrClass:
def __init__(self):
self.clear_video=0
self.clear_img=0
self.img_path=''
self.video_path=''
self.index_url=''
self.curPage=1
self.video_url_file=''
self.img_url_file=''
self.headers = {
'Host':self.index_url.replace('http://',''),
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:44.0) Gecko/20100101 Firefox/44.0',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'Accept-Language': 'zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3',
'Accept-Encoding': 'gzip, deflate',
'Referer': self.index_url,
'Connection': 'keep-alive',
'Cache-Control': 'max-age=0'
}
self.se = requests.Session()
def set_headers(self,reUrl):
self.headers = {
'Host':self.index_url.replace('http://','').strip('/'),
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:44.0) Gecko/20100101 Firefox/44.0',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'X-Requested-With':'XMLhttpRequest',
'Accept-Language': 'zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3',
'Accept-Encoding': 'gzip, deflate',
'Referer': reUrl,
'Connection': 'keep-alive',
'Cache-Control': 'max-age=0'
}

def get_blogs_in_file(self,fileName):
blogList=[]
inFile=open(fileName,'r')
for line in inFile:
blogList.append(line.replace('\n',''))
return blogList
def get_img_urls(self,text):
img_urls=[]
return img_urls
def get_video_urls(self,text):
r = BeautifulSoup(text,\"html.parser\")
iframes = r.find_all('iframe',src=re.compile(\"https://www.tumblr.com/video/\"))
video_urls=[]
for iframe in iframes:
newSrc = iframe['src']
video_urls.append(newSrc)

return video_urls
def get_video_files(self,url):
url=url.strip('/')
print '進入嵌套的視頻頁面 : '+url
#-----------------------------------------------------------
self.set_headers(url)
self.headers={
'Host': 'www.tumblr.com',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:45.0) Gecko/20100101 Firefox/45.0',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'Accept-Language': 'zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3',
'Accept-Encoding': 'gzip, deflate, br',
'Connection': 'keep-alive'
}
Reslut=self.se.get(url,headers=self.headers,proxies=proxies)

soup = BeautifulSoup(Reslut.text,\"html.parser\")
links = soup.find_all('source')
for link in links:
originUrl = link.get('src')
originType = link.get('type')

#獲取真正的URL
r = self.se.get(originUrl,headers=self.headers,proxies=proxies,allow_redirects = False)
trueUrl = r.headers['Location']
if '#_=_' in trueUrl:
trueUrl = trueUrl.replace('#_=_','')

return trueUrl
def save_video_file(self,url,path):
url=self.get_video_files(url)
print '開始保存視頻地址到文件 : '+url
self.video_url_file.write(url+'\n')
self.video_url_file.flush()

def deal_blogs_page(self,url):
print '正在獲取當前頁面的所有視頻內容 : '+url
self.set_headers(url)
Result=self.se.get(url,headers=self.headers,proxies=proxies)
text=Result.text
video_urls=self.get_video_urls(text)

for videoUrl in video_urls:
self.save_video_file(videoUrl,self.video_path)
nextUrls=re.findall('href=\\"/page/(?P<next>\d+)\\"',text)
if(nextUrls!=[]):
nextPage=str(self.curPage+1)
if(nextPage in nextUrls):
nextUrl=self.index_url+'page/'+nextPage
self.curPage+=1
self.deal_blogs_page(nextUrl)
#抓取一頁的時候,停60秒
#time.sleep(60)
else:
return
def deal_save_path(self):
userNames=re.findall('http://(?P<PATH>[^\.]*?)\.tumblr\.com/',self.index_url)
if(userNames!=[]):
userName=userNames[0]
self.img_path=userName+'/img/'
self.video_path=userName+'/videos/'
if(os.path.exists(self.video_path)==False):
os.makedirs(self.video_path)
self.video_url_file=open(self.video_path+'video_url','w')

def display_progress(width, percent):
percent=int(percent)
print \"%s %d%%\r\" % (('%%-%ds' % width) % (width * percent / 100 * '='), percent),
if percent >= 100:
print
sys.stdout.flush()

def update_display(self,received,file_size):
percent = received*100.0/file_size
if percent > 100:
percent = 100.0
self.display_progress(100,percent)

def main(self,type,value,isSave):
self.isSave=isSave
if(type=='b'):
if(re.match('^[http://]',value)==False):
self.index_url='http://'+value.strip('/')+'/'
else:
self.index_url=value.strip('/')+'/'
self.set_headers(self.index_url)
self.deal_save_path()
self.deal_blogs_page(self.index_url)
elif(type=='f'):
urlList=self.get_blogs_in_file(value)
for url in urlList:
if(re.match('^[http://]',url)==False):
self.index_url='http://'+url.strip('/')+'/'
else:
self.index_url=url.strip('/')+'/'
self.deal_save_path()
self.deal_blogs_page(self.index_url)
def __del__(self):
self.video_url_file.close()

if __name__ == '__main__':
tc=TumblrClass()
type=''
values=''
isSave=0
if(len(sys.argv)!=3):
print 'Input number Error!'
print 'python '+sys.argv[0]+' -u

or -f[fileName] [0/1]'
exit()
opts, args = getopt.getopt(sys.argv[1:], \"hu:f:h:s:\")
for op, value in opts:
if(op=='-u'):
type='b'
values=value
elif(op=='-f'):
type = 'f'
values=value
else:
print 'python '+sys.argv[0]+' -u
or -f[fileName] [0/1]'
exit()
isSave=sys.argv[2]
#print isSave
tc.main(type,values,isSave)

 

這是在控制臺執行時候的畫面


教大家怎樣使用腳本抓取湯不熱(Tumblr)小視頻并下載下來

這是保存之后的文本文件教大家怎樣使用腳本抓取湯不熱(Tumblr)小視頻并下載下來

教大家怎樣使用腳本抓取湯不熱(Tumblr)小視頻并下載下來下面是是代碼需要的庫教大家怎樣使用腳本抓取湯不熱(Tumblr)小視頻并下載下來

以上源程序作者是 waitig(Github) ,但是不能發鏈接,我就署名好了,因為源程序年久失修,幾近不能用,我修復了一些bug,并且修改了抓取的方式,還增加了使用代理(因為湯不熱現在中國打不開,你懂的),精簡了代碼。

發表評論

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: