[爬蟲] 利用 Python 的 Selenium 庫爬取極客時間付費課程並儲存為 PDF 檔案

wangchunbo發表於2020-06-03
"""
Function:利用Python的Selenium庫爬取極客時間付費課程並儲存為PDF檔案
Author:KevinWong
Time: 2018年9月30日20:48:38
"""
from selenium import webdriver
import pdfkit,time,re
def main():
    # 定義chromedriver路徑
    driver_path = r'D:\Software\chromedriver.exe'
    # 獲取chrome瀏覽器驅動
    driver = webdriver.Chrome(executable_path=driver_path)
    # 使用driver開啟極客時間登入頁面
    login_url = 'https://account.geekbang.org/signin'
    driver.get(login_url)
    # 此處while死迴圈實際上可以不寫 當執行完所有程式碼後 瀏覽器會自動關閉
    while True:
        # 輸入手機號
        driver.find_element_by_class_name("nw-input").send_keys("18576614172")
        # 輸入密碼
        driver.find_element_by_class_name("input").send_keys("KevinWong#Libra@1995")
        # 點選登入按鈕
        driver.find_element_by_class_name("mybtn").click()
        # 為了使ajax載入完成 此處使用隱式等待讓程式等待5秒鐘
        driver.implicitly_wait(5)
        # 找到左側欄的“我的訂閱”連結並點選
        driver.find_element_by_class_name("left-nav").find_elements_by_tag_name("a")[4].click()
        # 找到頁面中部的“開始學習”按鈕並點選
        """
        由於我只訂閱了一門付費專欄 
        因此頁面中只有一個“開始學習”按鈕
        所以直接獲取第一個按鈕即可
        如果有多門付費專欄可以使用find_elements_by_class_name()這個方法
        它返回一個List 可通過迴圈獲取每一個按鈕並進行點選
        """
        driver.find_element_by_class_name("btn-wrapper").click()
        # 切換到新開啟的專欄文章列表頁面
        """
            因為點選“開始學習”之後 
            會在瀏覽器開啟一個新的標籤頁 
            所以此處需要將driver轉換到新開啟的專欄文章列表
            否則無法獲取新開啟的頁面的資料
        """
        driver.switch_to_window(driver.window_handles[1])
        # 配置PDF選項 避免中文亂碼
        options = {
            'page-size': 'Letter',
            'encoding': "UTF-8",
            'custom-header': [
                ('Accept-Encoding', 'gzip')
            ]
        }
        # 找到文章列表頁面所有的文章標題
        titles = driver.find_elements_by_class_name("article-item-title")
        print("正在爬取專欄文章,並生成PDF檔案...")
        # 記錄爬取文章的開始時間
        start = time.time()
        for i in range(len(titles)):
            # 點選當前選中的標題 跳轉到文章內容頁面
            driver.find_elements_by_class_name("article-item-title")[i].click()
            print('正在爬取第' + str(i + 1) + '篇文章')
            # 獲取當前文章的標題
            title = driver.find_element_by_class_name("article-title").text
            """
            因為要在windows下儲存為PDF檔案 
            所以檔名不能為特殊字元
            此處將可能出現的特殊替換為空字串
            """
            raw_title =  re.sub('[\/::*?"<>|]','',title)
            # 獲取文章內容頁面的詳細內容 使用pdfkit生成PDF檔案並儲存到本地
            pdfkit.from_string(driver.page_source, raw_title+'.pdf', options=options)
            # 返回到文章列表頁面
            driver.back()
        # 記錄爬取文章的結束時間
        end = time.time()
        print("所有文章爬取完畢!共耗時" + str(int(end - start)) + "秒")
        break
if __name__ == '__main__':
    main()
本作品採用《CC 協議》,轉載必須註明作者和本文連結

上海PHP自學中心-免費程式設計視訊教學|
7Dn78VKKcW.jpg!large
S3d25uqwht.png!large

相關文章