"""
Function:利用Python的Selenium庫爬取極客時間付費課程並儲存為PDF檔案
Author:KevinWong
Time: 2018年9月30日20:48:38
"""
from selenium import webdriver
import pdfkit,time,re
def main():
driver_path = r'D:\Software\chromedriver.exe'
driver = webdriver.Chrome(executable_path=driver_path)
login_url = 'https://account.geekbang.org/signin'
driver.get(login_url)
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()
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])
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.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自學中心-免費程式設計視訊教學|