当前位置: 首页 > 后端技术 > Python

多线程爬取视频详细教程

时间:2023-03-26 13:26:30 Python

多线程,我这里用的是threading模块,反正很好用。这个模块有一个通用的格式。比如下面先定义一个myspider类,然后是__init__函数,run函数,这些都是必须的。首先导入我们需要的模块,os是创建文件夹,redis是将视频链接导入redis进行去重。Redis需要提前开启。在下载的文件夹下,然后输入redis-server.exeredis.windows.conf,就可以看到一个很大的立方体。importthreadingimportrequestsimportredisimportosinitializeStrictRedis()functionclient=redis.StrictRedis()然后找到要抓取视频的接口,可以通过浏览器的网络功能看到,记得在上边选择连续日志右上角,浏览其他服务器可能是Preserver日志。这个功能可以让你在网页上接收数据,链接会依次出现在下方。这是非常容易使用。我选择火狐浏览器,习惯了。从下面可以看到,当我点击播放按钮的时候,播放了一会儿,下面会出现很多mp2t类型的数据,几百kb,相当大。我想这是视频的一部分。点进去之后,果然是这样的。一个视频分为几个ts,ts也是一种视频格式,可以直接打开观看。视频播放后发现有41个ts格式的文件。这些应该是整个视频的内容。我们需要的是将这41个ts文件全部抓取下来。开始伪装浏览器视频url的公共部分,但是不完整的Url='https://ycdncn01.weilekangnet...:59666/data5/AC228D3093E44F58/BD672E9808DC5CEE/480p/0out480p'disguisebrowserheaders={'User-Agent':'Mozilla/5.0(WindowsNT10.0;WOW64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/55.0.2883.87UBrowser/6.2.4098.3Safari/537.36'}上面哪个Url不完整因为有41个,是发现在这个网址末尾加上数字0,1,2...40就完成了。创建文件夹,如果存在则不创建。os.makedirs('短视频',exist_ok=True)首先创建一个文件夹来保存视频。这个文件夹是在pycharm软件或者py所在的文件下自动创建的。引入父类threading.Threadclassmyspider(threading.Thread):def__init__(self,name):#引用父类主函数qwthreading.Thread.__init__(self)self.name=name#线程主运行函数defrun(self):print('Thread:'+self.name+'startrunning')#运行爬虫函数spider(self.name)上面的代码是多线程的精髓,格式是固定的,只要记住,只有self.name可以选择改,run是多线程函数,我们可以在里面调用爬虫函数spider,然后认真写爬虫spider函数。defspider(name):#发现视频分为40个部分,类型为tsformatforiinrange(0,41):#完整的视频拼接接口a=Url+str(i)+'.ts'#将所有的url存入redis集合并去重。如果能导入,说明url还没有爬取,所以爬取ifclient.sadd('URL_list',a):#GetvideoasbytesTypevideo=requests.get(a,headers=headers).content#命名视频names=a.split('/')[-1]#Downloadintofolderwithopen(os.path.join('短视频',names),'wb')asf:f.write(video)爬虫函数,代码也很详细,这里就不赘述了。主要是有一个os.path.join('A','B'),A是文件夹的名字,B是保存视频的名字。线程继续运行over=[]初始化线程,为iinrange(1,4)定义三个线程:#threadnamefunction(){//外汇百科http://www.fx61.com/definitionsthreadname=myspider(i)#线程开始执行threadname.start()#线程加入到持续运行列表over.append(threadname)线程继续运行,主线程没有结束,对i使用join方法在over:i.join()所有线程结束后,主线程结束print('Allthreadsend')上面是最后的代码,我分成三个线程进行爬取,start()方法是启动线程,而join()方法就是让线程一直进行下去,这些方法也是必须的。三个线程、三个启动和三个连接。把所有代码放在下面importthreadingimportrequestsimportredisimportosinitializationStrictRedis()functionclient=redis.StrictRedis()视频url的公共部分,但是不完整url='https://ycdncn01.weilekangnet...:59666/data5/AC228D3093E44F58/BD672E9808DC5CEE/480p/0out480p'Fakebrowserheaders={'User-Agent':'Mozilla/5.0(WindowsNT10.0;WOW64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/55.0.2883.87UBrowser/98.2Safarier/537.36'}创建文件夹,存在则不创建引用父类main函数qwthreading.Thread.__init__(self)self.name=name#线程主运行函数defrun(self):print('Thread:'+self.name+'开始运行')#运行爬虫函数spider(self.name)defspider(name):#发现视频分为40个部分,类型为tsformatforiinrange(0,41):#完整的视频拼接接口a=Url+str(i)+'.ts'#将所有url存入redis集合,用于去重。如果可以导入,则说明该url还没有爬取,所以爬取ifclient.sadd('URL_list',a):#获取视频为byte类型video=requests.get(a,headers=headers).content#命名视频名称=a.split('/')[-1]#下载到文件夹open(os.path.join('短视频',names),'wb')asf:f.write(video)当线程找不到需要抓取的url时,线程结束print('thread:'+name+'end')线程继续over=[]初始化线程运行,为iinrange(1,4)定义三个线程:#线程名threadname=myspider(i)#线程开始执行threadname.start()#线程加入到连续运行链表over.append(threadname)线程继续运行,主线程没有结束,使用over中的join方法fori:i.join()所有线程结束后,主线程结束print('allthreadsend')