多線程爬取視頻詳細教程

對於多線程我在這使用的是threading模塊,反正挺好用的,這個模塊是有大體格式的,好比下面的先定義一個myspider類,而後__init__函數,run函數了,這些都是必須的。redis

首先導入咱們須要的模塊 ,os是爲了建立文件夾,redis是爲了將視頻連接導入redis來進行去重操做,redis須要提早打開,沒安裝的能夠去搜索一下教程,安裝好以後,先cmd進入redis下載的文件夾下,而後輸入redis-server.exe redis.windows.conf就好了,可以看見一個很大的立方體。windows

import threading瀏覽器

import requests多線程

import redisapp

import oside

初始化StrictRedis()函數

client = redis.StrictRedis()函數

而後找到須要抓取的視頻的接口,經過瀏覽器的network功能能夠看到,記住選上右上角的持續日誌,別的瀏覽器多是Preserver log,這個功能可讓你在網頁接受到數據的時候,連接在依次出如今下面,很是好用,我選擇的是火狐瀏覽器,用習慣了。從下面能夠看到,在我點擊播放按鈕的時候,當播放一會後,下面就出現不少個mp2t類型的數據,好幾百kb,也挺大的,猜測是視頻的一部分,點進去以後,的確是這樣,一個視頻分爲好多個ts,ts也是視頻格式的一種,能直接打開觀看。在視頻播放完後,發現共有41個ts格式的文件,這些應該就是所有視頻的內容了,咱們所須要的就是把這41個ts所有抓取出來。url

開始假裝瀏覽器線程

視頻的url的共同部分,可是不完整

Url = 'https://ycdncn01.weilekangnet...:59666/data5/AC228D3093E44F58/BD672E9808DC5CEE/480p/0out480p'日誌

假裝瀏覽器

headers={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 UBrowser/6.2.4098.3 Safari/537.36'}

上面哪一個Url,是不完整的,由於是41個,發現是在這個網址的後面添加數字0,1,2…40就是完整的。

建立文件夾,若是存在就不建立

os.makedirs('短視頻',exist_ok=True)

先建立一個文件夾保存視頻,這個文件夾自動建立在pycharm軟件或者py所在的文件下。

引入父類 threading.Thread

class myspider(threading.Thread):

    def __init__(self,name):

        #引用父類主函數qw

        threading.Thread.__init__(self)

        self.name = name

    #線程主要運行函數

    def run(self) :

        print('線程:'+self.name+'開始運行')

        #運行爬蟲函數

        spider(self.name)

上面這個代碼就是多線程的精髓了,格式是固定的,記住就行,只有self.name能夠選擇變換,run是多線程運行的函數,咱們能夠把爬蟲函數spider放在裏面進行調用,而後再去認真編寫爬蟲spider函數。

def spider(name):

    #發現視頻分爲40個部分,類型爲ts格式

    for i in range(0, 41):

        #組裝視頻的完整接口

        a = Url + str(i) + '.ts'

        # 將全部的url存放到redis的集合裏面,進行去重,若是可以導入進去,說明這個url尚未爬取,那麼就進行抓取

        if client.sadd('URL_list', a):

            #獲取視頻爲字節型

            video = requests.get(a,headers=headers).content

            #給視頻命名

            names = a.split('/')[-1]

            #下載進文件夾裏面

            with open(os.path.join('短視頻',names),'wb') as f:

                f.write(video)

爬蟲函數,代碼裏面寫的也很詳細了,這裏就很少說了。主要就是有一個os.path.join(‘A’,‘B’),A是文件夾的名字,B是保存後視頻的名字。

線程持續進行

over = []

初始化線程操做,定義三個線程

for i in range(1,4):

    #線程命名

function(){ //外匯百科 http://www.fx61.com/definitions

    threadname = myspider(i)

    #線程開始執行

    threadname.start()

    #線程加入到持續運行列表裏面

    over.append(threadname)

線程持續運行,而且主線程不結束,使用的是join方法

for i in over:

    i.join()

全部線程結束後,主線程結束

print('所有線程結束')

上面的就是最後的代碼了,我分爲了三個線程進行爬取,start()方法是啓動線程,join()方法是讓線程一直進行着,這些方法也都是必須有的。三個線程,三個start,三個join。
下面放上所有代碼

import threading

import requests

import redis

import os

初始化StrictRedis()函數

client = redis.StrictRedis()

視頻的url的共同部分,可是不完整

Url = 'https://ycdncn01.weilekangnet...:59666/data5/AC228D3093E44F58/BD672E9808DC5CEE/480p/0out480p'

假裝瀏覽器

headers={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 UBrowser/6.2.4098.3 Safari/537.36'}

建立文件夾,若是存在就不建立

os.makedirs('短視頻',exist_ok=True)

引入父類 threading.Thread

class myspider(threading.Thread):

    def __init__(self,name):

        #引用父類主函數qw

        threading.Thread.__init__(self)

        self.name = name

    #線程主要運行函數

    def run(self) :

        print('線程:'+self.name+'開始運行')

        #運行爬蟲函數

        spider(self.name)

def spider(name):

    #發現視頻分爲40個部分,類型爲ts格式

    for i in range(0, 41):

        #組裝視頻的完整接口

        a = Url + str(i) + '.ts'

        # 將全部的url存放到redis的集合裏面,進行去重,若是可以導入進去,說明這個url尚未爬取,那麼就進行抓取

        if client.sadd('URL_list', a):

            #獲取視頻爲字節型

            video = requests.get(a,headers=headers).content

            #給視頻命名

            names = a.split('/')[-1]

            #下載進文件夾裏面

            with open(os.path.join('短視頻',names),'wb') as f:

                f.write(video)

當一個線程找不到須要抓取的url時,線程結束

    print('線程:'+name+'結束')

線程持續進行

over = []

初始化線程操做,定義三個線程

for i in range(1,4):

    #線程命名

    threadname = myspider(i)

    #線程開始執行

    threadname.start()

    #線程加入到持續運行列表裏面

    over.append(threadname)

線程持續運行,而且主線程不結束,使用的是join方法

for i in over:

    i.join()

全部線程結束後,主線程結束

print('所有線程結束')

相關文章
相關標籤/搜索