慕課網(wǎng)免費(fèi)教程爬蟲(chóng)

1. 爬蟲(chóng)背景

剛開(kāi)始學(xué)Python的時(shí)候,在慕課網(wǎng)上看到了好多Python的教程慕的,有視頻的阎肝,有文檔的。當(dāng)時(shí)網(wǎng)上有一個(gè)Java版的教程下載器肮街,有一個(gè)缺點(diǎn)风题,只能下載視頻,不能下載文檔類的視頻嫉父。文檔類的教程一個(gè)一個(gè)復(fù)制下來(lái)粘貼到word上面保存很痛苦的沛硅。后來(lái)自己想了一下,干嘛不自己寫一個(gè)爬蟲(chóng)爬取慕課網(wǎng)呢绕辖,然后就寫了這個(gè)爬蟲(chóng)摇肌。

2. 前期準(zhǔn)備

  • 安裝pdfkit
  • 安裝wkhtmltopdf
  • 驗(yàn)證安裝是否成功


    正確顯示版本號(hào),說(shuō)明安裝成功

3. 使用的工具

  • Chrome的F12
  • Anaconda
  • Visual Studio Code
  • 運(yùn)行環(huán)境Deepin15.4

4. 爬蟲(chóng)代碼

from bs4 import BeautifulSoup

from urllib.request import urlopen

import urllib.request

from urllib.error import URLError, HTTPError

import json

import re

import requests

import os


import pdfkit


def get_url_content(url):
    # 獲取url的內(nèi)容
    content = requests.get(url)
    return content.text


# 獲取課程列表
# i=1
print('增強(qiáng)版慕課網(wǎng)教程爬蟲(chóng)仪际,支持下載非視頻類的教程围小,保存稱PDF文件')
print('輸入課程編號(hào),如http://www.imooc.com/learn/177弟头,輸入177即可')
while True:
    # 獲取課程的內(nèi)容
    chapter_address = input('輸入課程地址(輸入exit退出):')
    if(chapter_address == 'exit'):
        break
    course_url = "http://www.imooc.com/learn/" + chapter_address.strip()
    try:
        soup = BeautifulSoup(get_url_content(course_url), "html.parser")
        video_count = 0
        item_count = 0
        # 獲取課程名稱
        course_name = soup.find('div', class_="hd clearfix")
        print(course_name.get_text())
        # 根據(jù)課程名稱建立一個(gè)文件夾
        video_path = os.path.abspath(
            '.') + '/' + course_name.get_text().strip() + '/'
        if not os.path.isdir(video_path):
            os.mkdir(video_path)

        file_name = course_name.get_text().strip()
        # 簡(jiǎn)單處理一下保存文件的文件名吩抓,文件名不能有\(zhòng)/?<>""
        # 所有先將這些字符替換掉,否則保存成文件的時(shí)候會(huì)出錯(cuò)
        if '/' in file_name:
            file_name = course_name.get_text().strip().replace('/', '&')
        if '\"' in file_name:
            file_name = course_name.get_text().strip().replace('\"', '“')
        # 將課程的名稱及學(xué)習(xí)地址保存程一個(gè)文件
        output_file = open(video_path + file_name + '.txt', 'w')
        chapter_names = soup.find_all('div', class_="chapter")
        for chapter_name in chapter_names:
            output_file.write(chapter_name.find('strong').get_text().split()[
                              0] + ' ' + chapter_name.find('strong').get_text().split()[1] + '\r\n')
            class_links = chapter_name.find_all(
                'a', href=re.compile(r"\d"), class_="J-media-item")
            for class_link in class_links:
                # 使用split()函數(shù)分割字符串赴恨,默認(rèn)使用空格疹娶、換行符、制表符分割伦连,并返回一個(gè)列表(列表最后一個(gè)元素不需要)
                output_file.write(' '.join(class_link.get_text().strip().split()[0:len(class_link.get_text().strip(
                ).split()) - 1]) + '>' + 'http://www.imooc.com' + class_link['href'] + '\r\n')  # join()函數(shù)將列表轉(zhuǎn)換成String
                if "video" in class_link['href']:
                    # 用于統(tǒng)計(jì)課程有幾個(gè)視頻
                    video_count = video_count + 1
                # 用于統(tǒng)計(jì)課程有幾個(gè)學(xué)習(xí)內(nèi)容(有的課程不是視頻教程)
                item_count = item_count + 1
        print('共' + str(video_count) + '個(gè)視頻')
        print('共' + str(item_count) + '個(gè)學(xué)習(xí)內(nèi)容', '\r\n\r\n')
        output_file.close()
        video_info_file = open(video_path + file_name + '.txt', 'r')
        info_data = video_info_file.readlines()
        for temp in info_data:
            # 保存文檔教程雨饺,生成pdf
            if 'code' in temp:
                file_name = temp.split('>')[0].replace(':', ':')
                code_link = temp.split('>')[1]
                code_content = BeautifulSoup(urllib.request.urlopen(
                    code_link).read().decode('utf-8'), "html.parser")
                code_content.find('div', class_="code-panel")
                options = {
                    # 定義編碼類型钳垮,防止中文出現(xiàn)亂碼
                    'encoding': "UTF-8"
                }
                # windows環(huán)境下制定wkhtmltopdf的路徑
                # config = pdfkit.configuration(
                # wkhtmltopdf=r'C:\Program Files (x86)\wkhtmltopdf\bin\wkhtmltopdf.exe')
                # pdfkit.from_string(
                # str(code_content.find('div',class_="code-panel")), file_name
                # +'.pdf', options=options, configuration=config)
                print(file_name, '下載中...')
                # pdfkit生成PDF文檔保存
                pdfkit.from_string(
                    str(code_content.find('div', class_="code-panel")), video_path + file_name + '.pdf', options=options)
            elif 'video' in temp:
                # 簡(jiǎn)單的文件名的合法性檢查
                video_name = temp.split('>')[0].replace(':', ':')
                video_link = temp.split('>')[1]
                video_id = video_link.split(
                    '/')[len(video_link.split('/')) - 1]
                # 獲取視頻下載地址,返回一個(gè)json數(shù)據(jù)
                url = "http://www.imooc.com/course/ajaxmediainfo/?mid={}&mode=flash".format(
                    video_id.strip())
                # 返回的是一個(gè)json字符串
                video_info = get_url_content(url)
                # print('video_info', video_info)
                video_link = json.loads(video_info)
                '''Json數(shù)據(jù)格式
                    {
                        "result": 0,
                        "data": {
                            "result": {
                                "mid": 3510,
                                "mpath": [
                                    "http://v2.mukewang.com/d51dbce1-b075-4558-b1b3-bfb4fcc5ee0a/L.mp4?auth_key=1480781145-0-0-32089e0973914437dc19596d2cc552c8",
                                    "http://v2.mukewang.com/d51dbce1-b075-4558-b1b3-bfb4fcc5ee0a/M.mp4?auth_key=1480781145-0-0-4d0a14128facb64e0f94bba9419ce7a4",
                                    "http://v2.mukewang.com/d51dbce1-b075-4558-b1b3-bfb4fcc5ee0a/H.mp4?auth_key=1480781145-0-0-68c1c5dbdd7540020065c030842843d8"
                                ],
                                "cpid": "918",
                                "name": "WAMPServer集成環(huán)境下載和安裝",
                                "time": 0,
                                "practise": []
                            }
                        },
                        "msg": "成功"
                    }
                    '''
                print(video_link['data']['result']['name'], '下載中...')
                # 下載視頻额港,默認(rèn)下載高清視頻
                urllib.request.urlretrieve(video_link['data']['result']['mpath'][-1],
                                           video_path + video_name.split()[0] + ' ' + video_link['data']['result']['name'] + '.mp4')  
                # input_file.close()
            else:
                pass
    except HTTPError as e:
        print('沒(méi)有這個(gè)課程饺窿,請(qǐng)輸入正確的編號(hào)···')

5. 項(xiàng)目說(shuō)明

  • 項(xiàng)目地址:慕課網(wǎng)免費(fèi)教程下載器
  • 后續(xù)任務(wù):代碼比較亂,后面準(zhǔn)備用Scrapy重新寫一次移斩,實(shí)現(xiàn)輸入要爬取的關(guān)鍵字肚医,自動(dòng)爬取跟關(guān)鍵字相關(guān)的教程,包括分頁(yè)爬取向瓷。

6. 爬取的教程分享

因?yàn)榭吹?a href="http://www.reibang.com/p/5fc6ab5de253" target="_blank">(1組)學(xué)習(xí)視頻推薦--編程語(yǔ)言基礎(chǔ)文章里面有這兩個(gè)教程肠套,所以就直接爬取了這兩個(gè)課程上傳到百度云盤,方便有需要的人下載猖任。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末你稚,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子朱躺,更是在濱河造成了極大的恐慌刁赖,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,376評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件长搀,死亡現(xiàn)場(chǎng)離奇詭異宇弛,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)盈滴,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,126評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門涯肩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人巢钓,你說(shuō)我怎么就攤上這事病苗。” “怎么了症汹?”我有些...
    開(kāi)封第一講書人閱讀 156,966評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵硫朦,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我背镇,道長(zhǎng)咬展,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 56,432評(píng)論 1 283
  • 正文 為了忘掉前任瞒斩,我火速辦了婚禮破婆,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘胸囱。我一直安慰自己祷舀,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,519評(píng)論 6 385
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著裳扯,像睡著了一般抛丽。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上饰豺,一...
    開(kāi)封第一講書人閱讀 49,792評(píng)論 1 290
  • 那天亿鲜,我揣著相機(jī)與錄音,去河邊找鬼冤吨。 笑死蒿柳,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的锅很。 我是一名探鬼主播其馏,決...
    沈念sama閱讀 38,933評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼爆安!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起仔引,我...
    開(kāi)封第一講書人閱讀 37,701評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤扔仓,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后咖耘,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體翘簇,經(jīng)...
    沈念sama閱讀 44,143評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,488評(píng)論 2 327
  • 正文 我和宋清朗相戀三年儿倒,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了版保。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,626評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡夫否,死狀恐怖彻犁,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情凰慈,我是刑警寧澤汞幢,帶...
    沈念sama閱讀 34,292評(píng)論 4 329
  • 正文 年R本政府宣布,位于F島的核電站微谓,受9級(jí)特大地震影響森篷,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜豺型,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,896評(píng)論 3 313
  • 文/蒙蒙 一仲智、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧姻氨,春花似錦钓辆、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,742評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)碉咆。三九已至,卻和暖如春蛀恩,著一層夾襖步出監(jiān)牢的瞬間疫铜,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工双谆, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留壳咕,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,324評(píng)論 2 360
  • 正文 我出身青樓顽馋,卻偏偏與公主長(zhǎng)得像谓厘,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子寸谜,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,494評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容