电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

Python爬蟲(chóng)進(jìn)階之爬取某視頻并下載的實(shí)現(xiàn)

瀏覽:84日期:2022-07-02 18:11:55

這幾天在家閑得無(wú)聊,意外的挖掘到了一個(gè)資源網(wǎng)站(你懂得),但是網(wǎng)速慢廣告多下載不了種種原因讓我突然萌生了爬蟲(chóng)的想法。

下面說(shuō)說(shuō)流程:

一、網(wǎng)站分析

首先進(jìn)入網(wǎng)站,F(xiàn)12檢查,本來(lái)以為這種低端網(wǎng)站很好爬取,是我太低估了web主??梢钥吹轿宜⑿戮W(wǎng)頁(yè)之后,出現(xiàn)了很多js文件,并且響應(yīng)獲取的代碼與源代碼不一樣,這就不難猜到這個(gè)網(wǎng)站是動(dòng)態(tài)加載頁(yè)面。

Python爬蟲(chóng)進(jìn)階之爬取某視頻并下載的實(shí)現(xiàn)

目前我知道的動(dòng)態(tài)網(wǎng)頁(yè)爬取的方法只有這兩種:1、從網(wǎng)頁(yè)響應(yīng)中找到JS腳本返回的JSON數(shù)據(jù);2、使用Selenium對(duì)網(wǎng)頁(yè)進(jìn)行模擬訪問(wèn)。源代碼問(wèn)題好解決,重要的是我獲取的源代碼中有沒(méi)有我需要的東西。我再一次進(jìn)入網(wǎng)站進(jìn)行F12檢查源代碼,點(diǎn)擊左上角然后在頁(yè)面點(diǎn)擊一個(gè)視頻獲取一個(gè)元素的代碼,結(jié)果里面沒(méi)有嵌入的原視頻鏈接(看來(lái)我真的是把別人想的太笨了)。

Python爬蟲(chóng)進(jìn)階之爬取某視頻并下載的實(shí)現(xiàn)

沒(méi)辦法只有進(jìn)行抓包,去找js請(qǐng)求的接口。再一次F12打開(kāi)網(wǎng)頁(yè)調(diào)試工具,點(diǎn)擊單獨(dú)的一個(gè)視頻進(jìn)行播放,然后在Network中篩選一下,只看HXR響應(yīng)(HXR全稱(chēng)是XMLHTTPRequest,HMLHTTP是AJAX網(wǎng)頁(yè)開(kāi)發(fā)技術(shù)的重要組成部分。除XML之外,XMLHTTP還能用于獲取其它格式的數(shù)據(jù),如JSON或者甚至純文本。)。

Python爬蟲(chóng)進(jìn)階之爬取某視頻并下載的實(shí)現(xiàn)

然后我一項(xiàng)一項(xiàng)的去檢查返回的響應(yīng)信息,發(fā)現(xiàn)當(dāng)我點(diǎn)擊播放的時(shí)候有后綴為.m3u8的鏈接,隨后就不斷刷新.ts文件的鏈接。

Python爬蟲(chóng)進(jìn)階之爬取某視頻并下載的實(shí)現(xiàn)

本來(lái)以為這就是原視頻的地址,我傻傻的直接從這個(gè)m3u8文件的headers中的URL直接進(jìn)入網(wǎng)站看看,結(jié)果傻眼了,獲取的是一串串.ts的文件名。

沒(méi)辦法只能百度君了。 科普了一下,也就說(shuō)我們必須把ts文件都下載下來(lái)進(jìn)行合并之后才能轉(zhuǎn)成視頻。

Python爬蟲(chóng)進(jìn)階之爬取某視頻并下載的實(shí)現(xiàn)

好了,視頻原地址弄清楚了,現(xiàn)在我們開(kāi)始從一個(gè)視頻擴(kuò)展到首頁(yè)的整個(gè)頁(yè)面的視頻。再一次進(jìn)行抓包分析,發(fā)現(xiàn)一個(gè)API中包含了首頁(yè)的分類(lèi)列表,然而里面并沒(méi)有進(jìn)入分類(lèi)的URL地址,只有一個(gè)tagid值和圖片的地址。

Python爬蟲(chóng)進(jìn)階之爬取某視頻并下載的實(shí)現(xiàn)

于是我又在主頁(yè)點(diǎn)一個(gè)分類(lèi),再次進(jìn)行抓包,發(fā)現(xiàn)了一個(gè)API中包含了一個(gè)分類(lèi)的單頁(yè)所有視頻的信息,通過(guò)他們的headers中的URL對(duì)比發(fā)現(xiàn),關(guān)于視頻的前一部分都是https:xxxxxxx&c=video,然后m=categories,通過(guò)字面意思我們都可以知道是分類(lèi),而每個(gè)tagid值對(duì)應(yīng)不同的分類(lèi)。并且還發(fā)現(xiàn)每個(gè)URL中都追加了時(shí)間戳timestamp(這是web主為了確保請(qǐng)求不會(huì)在它第一次被發(fā)送后即緩存,看來(lái)還是有小心機(jī)?。.?dāng)m=lists,則是每個(gè)分類(lèi)下的視頻列表,這里面我們就可以找到每個(gè)視頻對(duì)應(yīng)的ID了。

Python爬蟲(chóng)進(jìn)階之爬取某視頻并下載的實(shí)現(xiàn)

Python爬蟲(chóng)進(jìn)階之爬取某視頻并下載的實(shí)現(xiàn)

Python爬蟲(chóng)進(jìn)階之爬取某視頻并下載的實(shí)現(xiàn)

通過(guò)id我們可以獲取到視頻的詳細(xì)信息,并且還有m3u8文件URL地址的后面一部分。

Python爬蟲(chóng)進(jìn)階之爬取某視頻并下載的實(shí)現(xiàn)

好了,網(wǎng)站我們解析清楚了,現(xiàn)在開(kāi)始堆碼了。

二、寫(xiě)代碼

導(dǎo)入相關(guān)模塊

import requestsfrom datetime import datetimeimport re#import json import timeimport os#視頻分類(lèi)和視頻列表URL的前一段url = 'http://xxxxxxx/api/?d=pc&c=video&'#m3u8文件和ts文件的URL前一段m3u8_url =’https://xxxxxxxxxxxxx/videos/cherry-prod/2020/03/01/2dda82de-5b31-11ea-b5ae-1c1b0da2bc3f/hls/480/’#構(gòu)造請(qǐng)求頭信息header = {'user-agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.57.2 (KHTML, like Gecko) Version/5.1.7 Safari/534.57.2'}#創(chuàng)建空列表存放視頻信息vediomassag=’’#返回當(dāng)前時(shí)間戳TimeStamp = int(datetime.timestamp(datetime.now()))

2.定義函數(shù),獲取網(wǎng)站首頁(yè)分類(lèi)列表信息

#自定義函數(shù)獲取分類(lèi)def get_vediocategory(url, TimeStamp): cgURL = url + 'm=categories&timestamp=' + str(TimeStamp) + ’&’ response = requests.get(cgURL, headers=header) category = response.text# strrr=’'%s'’%category# return strrr return category

3.定義函數(shù),通過(guò)上一個(gè)函數(shù)返回的分類(lèi)信息,根據(jù)分類(lèi)對(duì)應(yīng)的id,輸入id并傳輸?shù)疆?dāng)前URL中以便獲取分類(lèi)下的視頻列表信息

#獲取分類(lèi)后的視頻列表def get_vedioList(url, TimeStamp, tagID): listURL = url + 'm=lists&timestamp=' + str(TimeStamp) + ’&’ + 'page=1&tag_id=' + str(tagID) + '&sort_type=&is_vip=0' response = requests.get(listURL, headers=header) vedioLists = response.text return vedioLists

4.在視頻列表信息中獲取視頻對(duì)應(yīng)的id,獲取單個(gè)視頻詳細(xì)信息的URL

#獲取單個(gè)視頻的詳細(xì)信息def get_vediomassages(url, TimeStamp, vedioID): videoURL = url + 'm=detail&timestamp=' + str(TimeStamp) + ’&’ + '&id=' + str(vedioID) response = requests.get(videoURL, headers=header) vediomassag = response.text return vediomassag

5.在視頻詳細(xì)信息中找到m3u8文件的下載地址,并將文件保存到創(chuàng)建的文件中

#將下載的m3u8文件放進(jìn)創(chuàng)建的ts列表文件中def get_m3u8List(m3u8_url,vediomassag): lasturl = r’'m3u8_720_url':'(.*?)','download_url’ last_url =re.findall(lasturl,vediomassag) lastURL=m3u8_url+str(last_url) response = requests.get(lastURL, headers=header) tsList = response.text cur_path=’E:files’ #在指定路徑建立文件夾 try: if not os.path.isdir(cur_path): #確認(rèn)文件夾是否存在 os.makedirs(cur_path) #不存在則新建 except: print('文件夾存在') filename=cur_path+’t2.txt’ #在文件夾中存放txt文件 f = open(filename,’a’, encoding='utf-8') f.write(tsList) f.close print(’創(chuàng)建%s文件成功’%(filename)) return filename

6.將m3u8文件中的ts單個(gè)提取出來(lái)放進(jìn)列表中。

# 提取ts列表文件的內(nèi)容,逐個(gè)拼接ts的url,形成listdef get_tsList(filename): ls = [] with open(filename, 'r') as file: line = f.readlines() for line in lines: if line.endswith('.tsn'): ls.append(line[:-1]) return ls

7.遍歷列表獲取單個(gè)ts地址,請(qǐng)求下載ts文件放進(jìn)創(chuàng)建的文件夾中

# 批量下載ts文件def DownloadTs(ls): length = len(ls) root=’E:mp4’ try: if not os.path.exists(root): os.mkdir(root) except: print('文件夾創(chuàng)建失敗') try: for i in range(length): tsname = ls[i][:-3] ts_URL=url+ls[i] print(ts_URL) r = requests.get(ts_URL) with open(root, ’a’) as f: f.write(r.content) f.close() print(’r’ + tsname + ' -->OK ({}/{}){:.2f}%'.format(i, length, i * 100 / length), end=’’) print('下載完畢') except: print('下載失敗')

代碼整合

import requestsfrom datetime import datetimeimport re#import jsonimport timeimport osurl = 'http://xxxxxxxx/api/?d=pc&c=video&'m3u8_url =’https://xxxxxxxxxxxxxxx/videos/cherry-prod/2020/03/01/2dda82de-5b31-11ea-b5ae-1c1b0da2bc3f/hls/480/’header = {'user-agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.57.2 (KHTML, like Gecko) Version/5.1.7 Safari/534.57.2'}vediomassag=’’TimeStamp = int(datetime.timestamp(datetime.now()))#自定義函數(shù)獲取分類(lèi)def get_vediocategory(url, TimeStamp): cgURL = url + 'm=categories&timestamp=' + str(TimeStamp) + ’&’ response = requests.get(cgURL, headers=header) category = response.text# strrr=’'%s'’%category# return strrr return category#獲取分類(lèi)后的視頻列表def get_vedioList(url, TimeStamp, tagID): listURL = url + 'm=lists&timestamp=' + str(TimeStamp) + ’&’ + 'page=1&tag_id=' + str(tagID) + '&sort_type=&is_vip=0' response = requests.get(listURL, headers=header) vedioLists = response.text return vedioLists#獲取單個(gè)視頻的詳細(xì)信息def get_vediomassages(url, TimeStamp, vedioID): videoURL = url + 'm=detail&timestamp=' + str(TimeStamp) + ’&’ + '&id=' + str(vedioID) response = requests.get(videoURL, headers=header) vediomassag = response.text return vediomassag#將下載的m3u8文件放進(jìn)創(chuàng)建的ts列表文件中def get_m3u8List(m3u8_url,vediomassag): lasturl = r’'m3u8_720_url':'(.*?)','download_url’ last_url =re.findall(lasturl,vediomassag) lastURL=m3u8_url+str(last_url) response = requests.get(lastURL, headers=header) tsList = response.text cur_path=’E:files’ #在指定路徑建立文件夾 try: if not os.path.isdir(cur_path): #確認(rèn)文件夾是否存在 os.makedirs(cur_path) #不存在則新建 except: print('文件夾存在') filename=cur_path+’t2.txt’ #在文件夾中存放txt文件 f = open(filename,’a’, encoding='utf-8') f.write(tsList) f.close print(’創(chuàng)建%s文件成功’%(filename)) return filename# 提取ts列表文件的內(nèi)容,逐個(gè)拼接ts的url,形成listdef get_tsList(filename): ls = [] with open(filename, 'r') as file: line = f.readlines() for line in lines: if line.endswith('.tsn'): ls.append(line[:-1]) return ls# 批量下載ts文件def DownloadTs(ls): length = len(ls) root=’E:mp4’ try: if not os.path.exists(root): os.mkdir(root) except: print('文件夾創(chuàng)建失敗') try: for i in range(length): tsname = ls[i][:-3] ts_URL=url+ls[i] print(ts_URL) r = requests.get(ts_URL) with open(root, ’a’) as f: f.write(r.content) f.close() print(’r’ + tsname + ' -->OK ({}/{}){:.2f}%'.format(i, length, i * 100 / length), end=’’) print('下載完畢') except: print('下載失敗')’’’# 整合所有ts文件,保存為mp4格式(此處函數(shù)復(fù)制而來(lái)未做實(shí)驗(yàn),本人直接在根目錄命令行輸入copy/b*.ts 文件名.mp4,意思是將所有ts文件合并轉(zhuǎn)換成自己命名的MP4格式文件。)def MergeMp4(): print('開(kāi)始合并') path = 'E://mp4//' outdir = 'output' os.chdir(root) if not os.path.exists(outdir): os.mkdir(outdir) os.system('copy /b *.ts new.mp4') os.system('move new.mp4 {}'.format(outdir)) print('結(jié)束合并')’’’ if __name__ == ’__main__’:# 將獲取的分類(lèi)信息解碼顯示出來(lái)# print(json.loads(get_vediocategory(url, TimeStamp))) print(get_vediocategory(url, TimeStamp)) tagID = input('請(qǐng)輸入分類(lèi)對(duì)應(yīng)的id') print(get_vedioList(url, TimeStamp, tagID)) vedioID = input('請(qǐng)輸入視頻對(duì)應(yīng)的id') get_vediomassages(url, TimeStamp, vedioID) get_m3u8List(m3u8_url,vediomassag) get_tsList(filename) DownloadTs(ls)# MergeMp4()

此時(shí)正在下載

Python爬蟲(chóng)進(jìn)階之爬取某視頻并下載的實(shí)現(xiàn)

三、問(wèn)題:

首先對(duì)于這種網(wǎng)站采取的爬取方法有很多,而我的方法相對(duì)來(lái)說(shuō)有點(diǎn)太低端了,并且我也 是第一次寫(xiě)博客,第一次寫(xiě)爬蟲(chóng)這類(lèi)程序,在格式上命名上存在著很多問(wèn)題,函數(shù)的用法不全面。并且在運(yùn)行的時(shí)候效率低速度太慢。在獲取分類(lèi)列表和視頻列表時(shí),因?yàn)槭荍SON文件,需要轉(zhuǎn)碼,過(guò)程太多加上程序不夠穩(wěn)定我就注釋掉了。還有就是對(duì)于這種動(dòng)態(tài)網(wǎng)頁(yè)了解不夠,所以學(xué)爬蟲(chóng)的小伙伴一定要把網(wǎng)頁(yè)的基礎(chǔ)搞好。希望各位大佬多指正多批評(píng),讓我們這些小白一起努力學(xué)好Python。

注意:里面所有的鏈接我的給打碼了,怕被和諧了哈哈

到此這篇關(guān)于Python爬蟲(chóng)進(jìn)階之爬取某視頻并下載的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Python 爬取某視頻并下載內(nèi)容請(qǐng)搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Python 編程
相關(guān)文章:
主站蜘蛛池模板: Magnescale探规,Magnescale磁栅尺,Magnescale传感器,Magnescale测厚仪,Mitutoyo光栅尺,笔式位移传感器-苏州连达精密量仪有限公司 | 深圳美安可自动化设备有限公司,喷码机,定制喷码机,二维码喷码机,深圳喷码机,纸箱喷码机,东莞喷码机 UV喷码机,日期喷码机,鸡蛋喷码机,管芯喷码机,管内壁喷码机,喷码机厂家 | 谷歌关键词优化-外贸网站优化-Google SEO小语种推广-思亿欧外贸快车 | 讲师宝经纪-专业培训机构师资供应商_培训机构找讲师、培训师、讲师经纪就上讲师宝经纪 | 硫化罐-电加热蒸汽硫化罐生产厂家-山东鑫泰鑫智能装备有限公司 | 地脚螺栓_材质_标准-永年县德联地脚螺栓厂家| 热缩管切管机-超声波切带机-织带切带机-无纺布切布机-深圳市宸兴业科技有限公司 | 中开泵,中开泵厂家,双吸中开泵-山东博二泵业有限公司 | 岩棉板|岩棉复合板|聚氨酯夹芯板|岩棉夹芯板|彩钢夹芯板-江苏恒海钢结构 | 高压无油空压机_无油水润滑空压机_水润滑无油螺杆空压机_无油空压机厂家-科普柯超滤(广东)节能科技有限公司 | STRO|DTRO-STRO反渗透膜(科普)_碟滤 | 搪瓷搅拌器,搪玻璃搅拌器,搪玻璃冷凝器_厂家-淄博越宏化工设备 | 传动滚筒,改向滚筒-淄博建凯机械科技有限公司 | FFU_空气初效|中效|高效过滤器_空调过滤网-广州梓净净化设备有限公司 | 半自动预灌装机,卡式瓶灌装机,注射器灌装机,给药器灌装机,大输液灌装机,西林瓶灌装机-长沙一星制药机械有限公司 | 罗茨真空机组,立式无油往复真空泵,2BV水环真空泵-力侨真空科技 | 中高频感应加热设备|高频淬火设备|超音频感应加热电源|不锈钢管光亮退火机|真空管烤消设备 - 郑州蓝硕工业炉设备有限公司 | 马尔表面粗糙度仪-MAHR-T500Hommel-Mitutoyo粗糙度仪-笃挚仪器 | 警用|治安|保安|不锈钢岗亭-售货亭价格-垃圾分类亭-移动厕所厂家-苏州灿宇建材 | 河南档案架,档案密集架,手动密集架,河南密集架批发/报价 | 全国冰箱|空调|洗衣机|热水器|燃气灶维修服务平台-百修家电 | 蓄电池在线监测系统|SF6在线监控泄露报警系统-武汉中电通电力设备有限公司 | 蒸汽热收缩机_蒸汽发生器_塑封机_包膜机_封切收缩机_热收缩包装机_真空机_全自动打包机_捆扎机_封箱机-东莞市中堡智能科技有限公司 | 旋片真空泵_真空泵_水环真空泵_真空机组-深圳恒才机电设备有限公司 | 英国雷迪地下管线探测仪-雷迪RD8100管线仪-多功能数字听漏仪-北京迪瑞进创科技有限公司 | 衡阳耐适防护科技有限公司——威仕盾焊接防护用品官网/焊工手套/焊接防护服/皮革防护手套 | 精密模具加工制造 - 富东懿 | 行星搅拌机,双行星搅拌机,动力混合机,无锡米克斯行星搅拌机生产厂家 | 浙江工业冷却塔-菱电冷却塔厂家 - 浙江菱电冷却设备有限公司 | 微型气象仪_气象传感器_防爆气象传感器-天合传感器大全 | 微型气象仪_气象传感器_防爆气象传感器-天合传感器大全 | 生产自动包装秤_颗粒包装秤_肥料包装秤等包装机械-郑州鑫晟重工科技有限公司 | 北京晚会活动策划|北京节目录制后期剪辑|北京演播厅出租租赁-北京龙视星光文化传媒有限公司 | 法钢特种钢材(上海)有限公司 - 耐磨钢板、高强度钢板销售加工 阀门智能定位器_电液动执行器_气动执行机构-赫尔法流体技术(北京)有限公司 | 铜镍-康铜-锰铜-电阻合金-NC003 - 杭州兴宇合金有限公司 | 沧州友城管业有限公司-内外涂塑钢管-大口径螺旋钢管-涂塑螺旋管-保温钢管生产厂家 | 志高装潢官网-苏州老房旧房装修改造-二手房装修翻新 | 寮步纸箱厂_东莞纸箱厂 _东莞纸箱加工厂-东莞市寮步恒辉纸制品厂 | PSI渗透压仪,TPS酸度计,美国CHAI PCR仪,渗透压仪厂家_价格,微生物快速检测仪-华泰和合(北京)商贸有限公司 | 玻璃钢型材-玻璃钢风管-玻璃钢管道,生产厂家-[江苏欧升玻璃钢制造有限公司] | 环氧乙烷灭菌器_压力蒸汽灭菌器_低温等离子过氧化氢灭菌器 _低温蒸汽甲醛灭菌器_清洗工作站_医用干燥柜_灭菌耗材-环氧乙烷灭菌器_脉动真空压力蒸汽灭菌器_低温等离子灭菌设备_河南省三强医疗器械有限责任公司 |