首先進(jìn)入今日頭條視頻首頁。
分析網(wǎng)頁
其中href屬性下的連接就是我們需要下載的視頻。
在下載全部視頻之前應(yīng)該分析一下單視頻下載的方法。
下載一個(gè)視頻
首先查看單個(gè)視頻的網(wǎng)頁頁面
我們需要獲取var mp4下的視頻。但是這個(gè)語句應(yīng)該是JS的?可以使用正則匹配到連接。
def get_video_url(url):
try:
res = requests.get(url)
if res.status_code != 200:
print('視頻詳情頁請求失敗')
return None
print('視頻詳情頁請求成功 : ' + video_title)
res.encoding = 'utf-8'
link = re.findall(r'var mp4 = "(.*.mp4?)";', res.text)[0]
link = 'http:' + link
return link
except Exception:
print('視頻詳情頁請求失敗')
return None
這個(gè)函數(shù)的返回值就是需要下載的視頻連接。
file_path = '{0}/{1}.{2}'.format('D:/1', video_title, 'mp4')
with open(file_path, 'wb') as f: #必須是wb
f.write(data)
f.close()
這樣就可以下載單個(gè)視頻了。
下載首頁全部視頻
具體正則方式,詳見網(wǎng)頁html格式。
#單進(jìn)程使用
def get_urls():
try:
res = requests.get('http://video.eastday.com/')
if res.status_code != 200:
print('視頻主頁請求失敗')
return None
print('獲取視頻主頁')
res.encoding = 'utf-8'
soup = BeautifulSoup(res.text, 'html.parser')
links = soup.find_all('a', pdata=re.compile("index.*")) #所有帶視頻的標(biāo)簽 都帶index這些 例如pdata="index|jlp|12|0"
for link in links:
if not re.findall('.*/a/.*', link['href']): #頁面因?yàn)樽钌厦娴?是類型分類 不帶/a/ 視頻全部帶
continue
# if re.compile(link['href'])
if not re.findall('http://video.eastday.com/', link['href']): #有一部分視頻沒有http://video.eastday.com/ 只有后面一部分
link['href'] = 'http://video.eastday.com/' + link['href']
#對于每一個(gè)主頁的url都有一個(gè)具體頁面
get_video_url(link['href'], link['title'])
except Exception:
print('視頻主頁請求失敗')
return None
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
這樣下載的方式比較慢,按順序下載。
為了提高效率,可以考慮進(jìn)程池方式。
進(jìn)程池方式下載視頻
假如直接加上進(jìn)程池,相當(dāng)于每個(gè)進(jìn)程都同時(shí)開始下載同一個(gè)。。我們應(yīng)該根據(jù)pool.map傳入不同參數(shù)讓不同的進(jìn)程下載不同的部分。
我們觀察可以知道視頻主頁分為:主題部分、娛樂、記錄片等等。
比如這個(gè)輕松一刻的代碼部分:
我們可以定義一個(gè)字典類型,根據(jù)參數(shù)讓不同進(jìn)程完成不同部分下載。
還有一個(gè)比較重要的是。我們對于不同板塊需要重新獲取該板塊的所有url。
具體代碼如下:
#進(jìn)程池使用
def get_urls_(item_index):
try:
res = requests.get('http://video.eastday.com/')
if res.status_code != 200:
print('視頻主頁請求失敗')
return None
print('獲取視頻主頁')
res.encoding = 'utf-8'
soup = BeautifulSoup(res.text, 'html.parser')
item_dict = {
'1' : 'w100 clr pt25', #6個(gè)板塊
'2' : 'main funny mt10',
'3' : 'main mt10 consult',
'4' : 'main mt10 entertainment',
'5' : 'main mt10 Blog',
'6' : 'main mt10 record',
}
#這里就相當(dāng)于不同進(jìn)程(1-6號進(jìn)程) 執(zhí)行不同板塊的url下載工作
html_all = soup.find_all('div', class_=re.compile(item_dict[str(item_index)]))
soup_items = BeautifulSoup(str(html_all[0]), 'html.parser') # 加上str!??! 還有它是列表!?。? soup_items = soup_items.find_all('a', pdata=re.compile("index.*"))
for item in soup_items:
if not re.findall('.*/a/.*', item['href']):
continue
if not re.findall('http://video.eastday.com/', item['href']):
item['href'] = 'http://video.eastday.com/' + item['href']
get_video_url(item['href'], item['title'])
except Exception:
print('視頻主頁請求失敗')
return None
if __name__=='__main__':
groups = [x for x in range(0, 6)]
pool = Pool()
pool.map(get_urls_, groups) #需要執(zhí)行的 加上條件
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
調(diào)試代碼
可以看到是同時(shí)執(zhí)行,而不是順序執(zhí)行。提高效率。
|