對於多線程我在這使用的是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
client = redis.StrictRedis()函數
而後找到須要抓取的視頻的接口,經過瀏覽器的network功能能夠看到,記住選上右上角的持續日誌,別的瀏覽器多是Preserver log,這個功能可讓你在網頁接受到數據的時候,連接在依次出如今下面,很是好用,我選擇的是火狐瀏覽器,用習慣了。從下面能夠看到,在我點擊播放按鈕的時候,當播放一會後,下面就出現不少個mp2t類型的數據,好幾百kb,也挺大的,猜測是視頻的一部分,點進去以後,的確是這樣,一個視頻分爲好多個ts,ts也是視頻格式的一種,能直接打開觀看。在視頻播放完後,發現共有41個ts格式的文件,這些應該就是所有視頻的內容了,咱們所須要的就是把這41個ts所有抓取出來。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所在的文件下。
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)
for i in over:
i.join()
print('所有線程結束')
上面的就是最後的代碼了,我分爲了三個線程進行爬取,start()方法是啓動線程,join()方法是讓線程一直進行着,這些方法也都是必須有的。三個線程,三個start,三個join。
下面放上所有代碼
import threading
import requests
import redis
import os
client = redis.StrictRedis()
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)
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)
print('線程:'+name+'結束')
over = []
for i in range(1,4):
#線程命名
threadname = myspider(i)
#線程開始執行
threadname.start()
#線程加入到持續運行列表裏面
over.append(threadname)
for i in over:
i.join()
print('所有線程結束')