專案實戰!用爬蟲和Flask打造屬於自己的電影網站
也許你曾經為了一部電影找遍全網卻沒發現任何有用的資源,也許你曾經被披著電影外衣的網站忽悠進去而染上木馬病毒。一部小小的電影搞得你心力交瘁,懷疑人生。
不過,作為一名合格的程式設計師,一向以write the code,change the world所著稱,我們寫的程式碼都能改變世界,豈能被這種小事情所屈服?不是不幹,要幹就幹一票大的!
這一次,我們祭上萬能的Python語言,用爬蟲技術加上Flask框架,打造一個屬於自己的電影網站!介面清爽無木馬,PC手機隨心看!今年告別單身,征服女神的任務,就從這裡開始啦~
一、準備工作
1. 首先你要一個Python直譯器。在目前為止,Python存在兩大主流的版本,一個是Python2.7,一個是Python3.6。Python2.x歷史悠久,支援的庫多,但是畢竟是老版本,一些歷史遺留的問題未能得到解決,比如編碼問題,一些內建函式的執行效能等。
而Python3優化了Python2中的很多底層程式碼,並且預設的字串就是unicode型別,無需擔心編碼問題,很多函式因為使用了生成器而大大的提高了程式碼的執行效率。
但是Python3因為比較新,所以一些第三方庫還來不及支援Python3(比如程序管理工具supervisor就還未支援Python3),但是慢慢的都在支援Python3了,並且Python3也是未來的一個趨勢,Python2已經被官方宣佈在2020年將全面停止更新。
所以現在學Python,首選Python3。因此我們本個課程,也用Python3來講解。如果您還沒有安裝Python3,可以到官網:https://www.python.org,根據自己的作業系統,選擇相應的版本下載。安裝過程非常簡單,一頓下一步就可以啦,但是為了不必要的麻煩,給個小提示,千萬不要放在有中文的路徑下面哦~
2. 安裝完Python以後,如果不出意外,應該是已經安裝了pip。通過pip可以非常方便的管理Python第三方包。可以在CMD或者任何shell終端輸入pip -V,如果提示了找不到pip命令,說明pip沒有安裝成功。那麼可以通過easy_install install pip來進行安裝。
3. requests庫。這個庫是專門用來做網路請求的。他比Python自帶的urllib庫好用很多,在urllib3的基礎之上做了進一步的封裝,讓我們寫網路請求的時候不要處理一些類似於url編碼等相關的無意義的事情。
他的slogan是Http for Humans,意思是對人友好的Http請求庫,可以說是非常的形象了。
這個庫不是Python內建的,因此需要通過pip進行安裝。安裝方式也是非常簡單,只要進入cmd或者shell終端,輸入pip install requests即可安裝。
4. Scrapy框架。最強大的爬蟲框架,沒有之一!注意,他不是一個簡簡單單的庫,而是一個框架。實現了從url匹配,到資料下載,資料解析,資料儲存等一套完整的元件。
讓你寫爬蟲更加輕鬆,更加健壯,更加高效。我們也是用這個框架來幫我們處理爬蟲,這樣我們可以不間斷的批量的爬取電影資訊,然後儲存到資料庫中。
Scrapy也不是Python內建的,需要通過pip install scrapy安裝。
5. MySQL伺服器。資料爬取下來後,要儲存起來,以後才能通過網頁的形式展現出來。儲存資料的方式有很多,比如可以儲存到JSON檔案中、MySQL資料庫中、SQLite資料庫等。
而MySQL由於效能高、成本低、可靠性好,已經成為最流行的開源資料庫,已經被廣泛的應用在了大中小型網站中。
我們的資料從網站上爬取下來後,以後還需要用在網站中展示。因此我們採用MySQL來儲存資料。MySQL安裝非常簡單,可以到MySQL官網下載安裝即可。
6. Django框架。Django框架是Python web開發中一款非常主流的框架。上手快,功能齊全,可以勝任大型網站的任務。他也是集HTTP協議、URL匹配、資料庫管理、HTML模版渲染等於一體的框架。
資料已經從爬到資料庫中了,下一步我們就是使用Django框架實現一個網站,動態的載入資料!根據自己的需求,想做成什麼樣就做成什麼樣!Django也是第三方的,需要通過pip install django進行安裝。
二、專案架構:
在寫具體的程式碼之前,先來理順一下整個專案框架的結構。爬蟲負責抓取網站的資料,並對抓取下來的資料進行解析和清洗,然後儲存到資料庫中。之後Django再從資料庫中讀取資料,並將讀取的資料顯示在網頁中。結構圖如下:
三、爬蟲實現:
俗話說,巧婦難為無米之炊,再牛逼的爬蟲程式如果沒有好的資料來源,也爬不到有價值的資料。因此選擇一個好的資源網站至關重要。這裡我們選擇的是電影天堂和陽光電影兩個特別良心的網站。
這兩個網站上有大量的高清視訊資源,每部電影都配有詳細的資訊,包括演員,導演,年代,型別,豆瓣評分,視訊截圖等,最重要的是附有迅雷下載連結,可以說是非常良心了。
但是這個網站經常會有一些廣告(廣告是主要的主要的收入來源),當你在點選某個連結的時候,會首先給你彈出一個新頁面,裡面嵌入的就是廣告資源,然後你再次點選,才能進入到下一個頁面。並且有時候這個網站還會被Chrome瀏覽器識別為病毒網站(不知是否真的有病毒),導致無法正常訪問。
另外最後一個就是,這個網站的介面相當不美觀,對於我這種審美要求高的(特別是美女(*^_^*))碼農來說,實在不能忍受。
因此如果我們能把上面的電影資源都爬下來,再按照自己的需求實現一個網站,顯示這些資訊,那就很有意思了。
無論從個人角度還是商業角度來說,都是非常有價值的!這裡我們使用的是Scrapy框架來實現的,那麼以下主要從資料抓取,資料解析和資料儲存三個角度來進行分析:
1. 資料抓取和解析:在寫程式碼之前,我們首先來分析下電影天堂這個網站,他的首頁是包含了各種型別資源的一個組合。我們現在要爬取的是電影資訊,因此點選“更多最新電影”跳轉到最新電影的列表頁面,如下圖:
可以看到這個列表頁包含了許多我們想要的電影資源,但是我們現在爬,只能爬取到這一頁的電影資訊,怎麼能把其他頁面的電影也爬下來呢,這時候就要找到每個頁面的url規則了。
我們可以看到,第一頁電影的URL是:http://www.dytt8.net/html/gndy/dyzz/list_23_1.html,第二頁電影的URL是:http://www.dytt8.net/html/gndy/dyzz/list_23_2.html。
所以我們得出一個結論就是,URL的前面部分都是一樣的,最後那個數字是幾,代表的是第幾頁。接下來就是去爬詳情頁面了。詳情頁的例圖如下:
包括電影的資訊、海報,都能在這個裡面找到。那麼資料爬取的程式碼如下:
2.資料儲存:這裡我們把爬取下來的資料儲存到MySQL資料庫中。需要在pipeline中進行實現。示例程式碼如下:
以上便是爬蟲部分的講解和示例程式碼演示,當然因為篇幅限制,無法把所有細節都介紹到位。
四、網站實現:
網站這裡我們用的是Flask框架。在後臺做好資料的提取,在前端做好頁面的顯示。示例程式碼如下:
做完後的效果圖如下(只是簡簡單單的做了個demo,UI還需要進一步美化):
喜歡請點個贊吧。