Try   HackMD

資訊之芽 Py 第二階段 - Scraping 作業
xkcd

Week 11 小作業 - 竹區 Deadline: 5/31(一) 23:59 / 北區 Deadline: 6/1(二) 23:59
繳交表單:https://forms.gle/fLHzYZ9CvxdPussw5

(5/27)題敘更新:若無法正確下載某些漫畫,請做好 error handling(詳細請見下文)

大家在學習完這些關於網路、爬蟲的知識之後,來試試操作看看抓一次想要的東西吧!

xkcd.com 是一個很酷的漫畫網站,從 2005 年開始,網站上上面會不定期刊載作者 Randall Munroe 繪製的漫畫,經常以火柴形狀的人物呈現許多生活中不同主題的梗或趣味話題。

先在這裡附上幾篇:

Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →

Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →

你可能已經看過這個很具識別性的畫風。

每則漫畫依數字順序編號,從 xkcd: 1 一路累積到目前的 xkcd: 2466 號,打開首頁的話則隨時能看到最新的漫畫,還有 Random 按鈕可以隨機挑選。

另外,由於 Randall 的梗經常牽涉科技、科學、數學與哲學等多領域的知識,讀者不一定有通盤接觸,因此甚至有 Wiki 共編網站專門幫網友解說每則 xkcd 漫畫裡面的笑點跟典故。

如果覺得有趣的話,可以當作練英文好好翻一翻。

作業

我們希望你製作一個下載器的 python script 程式,方便我們在電腦上閱覽 xkcd 上的漫畫圖片。

說明

這個下載器 xkcd.py 必須有三個功能,必須讓使用者以輸入數字或代碼選擇功能,介面上要 print 出這兩項功能的簡介:

  1. 大量下載:一次下載任意 50 張 xkcd 的漫畫(不限哪幾張但不可重複)。先建立一個資料夾(子目錄),之後將這 50 張全部存成個別的檔案置入資料夾中。

從網路下載,寫入到一個二進位檔案的方式如下:

res = requests.get('https://imgs.xkcd.com/_______')

with open('檔名.png', 'wb') as f:
    f.write(res.content)
  1. 指定下載:以 input 輸入指定的漫畫,下載並存入一個 xkcd.png
    • 允許輸入單一數字,代表下載一則。
    • 允許輸入 rrandom 代表隨機下載一則。
    • 允許輸入以 , 分隔的多個數字,代表下載多則。
    • 允許輸入一個 數字-數字 的範圍,代表下載多則。
    • 你的程式應該要可以爬到 xkcd.com 上所有非互動式的漫畫,如果網站上沒有指定的漫畫(例如 6666),必須要告知使用者並且重新輸入。
      • 之後可能會新增新的漫畫,另外前面也有空號的狀況,所以必須在下載時確認漫畫能不能下載。

另外還有需要使用課外知識的 Bonus:

  • 2. 指定下載 的 Bonus 功能:
    • 允許輸入一個漫畫的名稱,並下載一則。
      • 漫畫的名稱定義為:https://imgs.xkcd.com/comics/ 網址後面的部分,扣除 .png
    • 下載之後自動跳出視窗,打開圖片檔。
      \(\Longrightarrow\) 可以上網搜尋如何在 python 上呼叫開啟圖片檔或瀏覽器的程式碼,此題在任意作業系統上可以運作都可以,也能使用 PIL(使用io.BytesIOimage.show())。
  • Bonus Task: 新增指令參數模式,除了前面的互動模式(interactive mode) 之外,可以利用 python xkcd.py 參數 指令操作。**
    • 此種模式在執行過程中不能讀入使用者輸入,也就是說它是一個非互動的程式(non-interactive mode),適合拿來用在批次處理之類的。
    • 參數可以自行指定,但是需要以 python xkcd.py help 印出相關的說明。
    • 需要用到不少課外知識。

(5/27 更新) 網站上有幾則漫畫具有互動性的設計,或是格式與一般的圖片不太一樣(例如 1350、1416、1608、1663、2198),不需要特別處理這些特例。

你只需要確保你所寫出的爬蟲可以下載多數漫畫的圖片就好,遇到無法下載的狀況時必須使用 error handling(顯示錯誤訊息告知使用者重新輸入),使程式不會直接 crash。我們批改的時候會從程式碼去判斷給分。

作業繳交

繳交表單:https://forms.gle/fLHzYZ9CvxdPussw5

你的作業應該只會有一個檔案 xkcd.py。如果有需要安裝任何 bs4html5librequests 以外的套件,請在備註中說明(可以開放使用)。