用bs4和urllib 爬取視頻

實驗對象:麥子學院html

一、大部分視頻信息都存在http://www.maiziedu.com/course/all/中,全部的視頻信息都有本身的ID,第一次查詢地址應該是在:'http://www.maiziedu.com/course/' + id中python

image 

image

分析頁面獲取title ,爲建立文件夾獲取目錄app

    url_dict1 = {}
    url = 'http://www.maiziedu.com/course/{}'.format(num)page = urllib.request.urlopen(url)
    context = page.read().decode('utf8')
    title = re.search('<title>.*</title>', context)
    title = title.group().strip('</title>')if '500' in title:return {}else:
        #對文件夾進行進一步的精簡if (len(title.split(":")) != 1):
            title = title.split(":")[1]
        title=title.split('-')[0]
        url_dict1['url'] = url
        url_dict1['title'] = title
        # urls.append(url_dict1)return url_dict1

 

獲取字典包含url和titleless

這一部分就是進行分析,獲取到頁面全部章節的地址和標題ide

在python代碼中用bs4 分析並獲取播放頁面連接網站

 

urls = []
page = urllib.request.urlopen(url)
context = page.read().decode('utf8')
soup = BeautifulSoup(context, "html.parser")
for tag in soup.find('ul', class_='lesson-lists').find_all('li'):
    urls.append(tag.find('a').get('href').split('/')[-2])return urls

返回全部章節的url和title
二、播放頁面分析頁面播放路徑是從js中明文調用的,直接獲取網站的title及視頻調用的js文件中的url路徑url

page = urllib.request.urlopen(url)
context = page.read().decode('utf8')
soup = BeautifulSoup(context, "html.parser")
title = soup.find('div', class_='bottom-module').find_all('span', class_='title')[0]
title = re.compile(r'<[^>]+>', re.S).sub('', str(title)) + '.mp4'

ok = soup.find_all('script')[2]return ok.string.split('"')[-2], title
此處獲取title是爲了保存文件時,按照網站顯示內容進行重命名。三、下載文件
def report(count, blockSize, totalSize):
    j = '#'
    percent = int(count * blockSize * 100 / totalSize)sys.stdout.write(str(percent) + '% [' + j * int(percent / 2) + '->' + "]\r")sys.stdout.flush()def download(url, filename):
    # BASE_DIR = os.path.split(os.path.realpath(__file__))[0]
    saveFile = os.path.join(BASE_DIR, filename)if not os.path.exists(saveFile):
        urllib.request.urlretrieve(url, saveFile, reporthook=report)sys.stdout.write("\n\rDownload complete, saved as %s" % (saveFile) + '\n\r')sys.stdout.flush()else:print('文件已存在!跳過繼續下載下一個')

 

report 在命令行顯示下載進度spa

urlretrieve進行下載,也能夠使用其餘方式命令行

 

總結:code

使用urlib+bs4直接粗暴的下載麥子視頻文件,有許多不如意的地方須要改進,因版權緣由,不在此貼出源碼

相關文章
相關標籤/搜索