--- image: https://xkcd.com/favicon.ico description: 大家在學習完這些關於網路、爬蟲的知識之後,來試試操作看看抓一次想要的東西吧!xkcd 是一個很酷的漫畫網站,從 2005 年開始,上面會不定期刊載作者 Randall Munroe 繪製的漫畫,經常以火柴形狀的人物呈現許多生活中不同主題的梗或趣味話題。 --- # 資訊之芽 Py 第二階段 - Scraping 作業 ![xkcd](https://xkcd.com/favicon.ico) Week 11 小作業 - **竹區 Deadline: 5/31(一) 23:59 / 北區 Deadline: 6/1(二) 23:59** **繳交表單:https://forms.gle/fLHzYZ9CvxdPussw5** :::warning (5/27)題敘更新:若無法正確下載某些漫畫,請做好 error handling(詳細請見下文) ::: 大家在學習完這些關於網路、爬蟲的知識之後,來試試操作看看抓一次想要的東西吧! [xkcd.com](xkcd.com) 是一個很酷的漫畫網站,從 2005 年開始,網站上上面會不定期刊載作者 Randall Munroe 繪製的漫畫,經常以火柴形狀的人物呈現許多生活中不同主題的梗或趣味話題。 先在這裡附上幾篇: ![xkcd 1825: 7 Eleven](https://imgs.xkcd.com/comics/7_eleven_2x.png =x300) ![xkcd 688: Self-Description](https://imgs.xkcd.com/comics/self_description.png =100%x) 你可能已經看過這個很具識別性的畫風。 每則漫畫依數字順序編號,從 [xkcd: 1](https://xkcd.com/1) 一路累積到目前的 [xkcd: 2466](https://xkcd.com/2466) 號,打開首頁的話則隨時能看到最新的漫畫,還有 Random 按鈕可以隨機挑選。 另外,由於 Randall 的梗經常牽涉科技、科學、數學與哲學等多領域的知識,讀者不一定有通盤接觸,因此甚至有 [Wiki 共編網站](https://www.explainxkcd.com/)專門幫網友解說每則 xkcd 漫畫裡面的笑點跟典故。 如果覺得有趣的話,可以當作練英文好好翻一翻。 ## 作業 我們希望你製作一個下載器的 python script 程式,方便我們在電腦上閱覽 xkcd 上的漫畫圖片。 ## 說明 這個下載器 `xkcd.py` 必須有三個功能,必須讓使用者以輸入數字或代碼選擇功能,介面上要 print 出這兩項功能的簡介: 1. **大量下載**:一次下載任意 50 張 xkcd 的漫畫(不限哪幾張但不可重複)。先建立一個資料夾(子目錄),之後將這 50 張全部存成個別的檔案置入資料夾中。 從網路下載,寫入到一個二進位檔案的方式如下: ```python res = requests.get('https://imgs.xkcd.com/_______') with open('檔名.png', 'wb') as f: f.write(res.content) ``` 2. **指定下載**:以 input 輸入指定的漫畫,下載並存入一個 `xkcd.png`。 - 允許輸入單一數字,代表下載一則。 - 允許輸入 `r` 和 `random` 代表隨機下載一則。 - 可以參考 [`random.randint`](https://docs.python.org/3/library/random.html#functions-for-integers)、[<small>中文說明</small>](https://blog.louie.lu/2017/07/27/random-python-standard-library-02/) - 允許輸入以 `,` 分隔的多個數字,代表下載多則。 - 允許輸入一個 `數字-數字` 的範圍,代表下載多則。 - 你的程式應該要可以爬到 xkcd.com 上所有非互動式的漫畫,**如果網站上沒有指定的漫畫(例如 [6666](https://xkcd.com/6666)),必須要告知使用者並且重新輸入。** - 之後可能會新增新的漫畫,另外前面也有空號的狀況,所以必須在下載時確認漫畫能不能下載。 另外還有需要使用課外知識的 Bonus: * *2. 指定下載* 的 Bonus 功能: - 允許輸入一個漫畫的名稱,並下載一則。 - 漫畫的名稱定義為:`https://imgs.xkcd.com/comics/` 網址後面的部分,扣除 `.png` - 下載之後自動跳出視窗,打開圖片檔。 $\Longrightarrow$ 可以上網搜尋如何在 python 上呼叫開啟圖片檔或瀏覽器的程式碼,此題在任意作業系統上可以運作都可以,也能使用 PIL(使用`io.BytesIO`、`image.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`。如果有需要安裝任何 `bs4`、`html5lib`、`requests` 以外的套件,請在備註中說明(可以開放使用)。