也許你曾經(jīng)為了一部電影找遍全網(wǎng)卻沒發(fā)現(xiàn)任何有用的資源钉迷,也許你曾經(jīng)被披著電影外衣的網(wǎng)站忽悠進(jìn)去而染上木馬病毒至非。一部小小的電影搞得你心力交瘁,懷疑人生糠聪。不過荒椭,作為一名合格的程序員,一向以write the code,change the world所著稱舰蟆,我們寫的代碼都能改變世界趣惠,豈能被這種小事情所屈服?不是不干身害,要干就干一票大的味悄!這一次,我們祭上萬能的Python語言塌鸯,用爬蟲技術(shù)加上Flask框架侍瑟,打造一個屬于自己的電影網(wǎng)站!界面清爽無木馬,PC手機(jī)隨心看涨颜!今年告別單身费韭,征服女神的任務(wù),就從這里開始啦~
一庭瑰、準(zhǔn)備工作
1. 首先你要一個Python解釋器星持。在目前為止,Python存在兩大主流的版本弹灭,一個是Python2.7督暂,一個是Python3.6。Python2.x歷史悠久穷吮,支持的庫多逻翁,但是畢竟是老版本,一些歷史遺留的問題未能得到解決酒来,比如編碼問題卢未,一些內(nèi)置函數(shù)的執(zhí)行性能等肪凛。而Python3優(yōu)化了Python2中的很多底層代碼堰汉,并且默認(rèn)的字符串就是unicode類型,無需擔(dān)心編碼問題伟墙,很多函數(shù)因為使用了生成器而大大的提高了代碼的執(zhí)行效率翘鸭。但是Python3因為比較新,所以一些第三方庫還來不及支持Python3(比如進(jìn)程管理工具supervisor就還未支持Python3)戳葵,但是慢慢的都在支持Python3了就乓,并且Python3也是未來的一個趨勢,Python2已經(jīng)被官方宣布在2020年將全面停止更新拱烁。所以現(xiàn)在學(xué)Python生蚁,首選Python3。因此我們本個課程戏自,也用Python3來講解邦投。如果您還沒有安裝Python3,可以到官網(wǎng):https://www.python.org擅笔,根據(jù)自己的操作系統(tǒng)志衣,選擇相應(yīng)的版本下載。安裝過程非常簡單猛们,一頓下一步就可以啦念脯,但是為了不必要的麻煩,給個小提示弯淘,千萬不要放在有中文的路徑下面哦~
2. 安裝完P(guān)ython以后绿店,如果不出意外,應(yīng)該是已經(jīng)安裝了pip庐橙。通過pip可以非常方便的管理Python第三方包假勿√杷可以在CMD或者任何shell終端輸入pip -V,如果提示了找不到pip命令废登,說明pip沒有安裝成功淹魄。那么可以通過easy_install install pip來進(jìn)行安裝。
3. requests庫堡距。這個庫是專門用來做網(wǎng)絡(luò)請求的甲锡。他比Python自帶的urllib庫好用很多,在urllib3的基礎(chǔ)之上做了進(jìn)一步的封裝羽戒,讓我們寫網(wǎng)絡(luò)請求的時候不要處理一些類似于url編碼等相關(guān)的無意義的事情缤沦。他的slogan是Http for Humans,意思是對人友好的Http請求庫易稠,可以說是非常的形象了缸废。這個庫不是Python內(nèi)置的,因此需要通過pip進(jìn)行安裝驶社。安裝方式也是非常簡單企量,只要進(jìn)入cmd或者shell終端,輸入pip install requests即可安裝亡电。
4. Scrapy框架届巩。最強(qiáng)大的爬蟲框架,沒有之一份乒!注意恕汇,他不是一個簡簡單單的庫,而是一個框架或辖。實現(xiàn)了從url匹配瘾英,到數(shù)據(jù)下載,數(shù)據(jù)解析颂暇,數(shù)據(jù)存儲等一套完整的組件缺谴。讓你寫爬蟲更加輕松,更加健壯蟀架,更加高效瓣赂。我們也是用這個框架來幫我們處理爬蟲,這樣我們可以不間斷的批量的爬取電影信息片拍,然后存儲到數(shù)據(jù)庫中煌集。Scrapy也不是Python內(nèi)置的,需要通過pip install scrapy安裝捌省。
5. MySQL服務(wù)器苫纤。數(shù)據(jù)爬取下來后,要存儲起來,以后才能通過網(wǎng)頁的形式展現(xiàn)出來卷拘。存儲數(shù)據(jù)的方式有很多喊废,比如可以存儲到JSON文件中、MySQL數(shù)據(jù)庫中栗弟、SQLite數(shù)據(jù)庫等污筷。而MySQL由于性能高、成本低乍赫、可靠性好瓣蛀,已經(jīng)成為最流行的開源數(shù)據(jù)庫,已經(jīng)被廣泛的應(yīng)用在了大中小型網(wǎng)站中雷厂。我們的數(shù)據(jù)從網(wǎng)站上爬取下來后惋增,以后還需要用在網(wǎng)站中展示。因此我們采用MySQL來存儲數(shù)據(jù)改鲫。MySQL安裝非常簡單诈皿,可以到MySQL官網(wǎng)下載安裝即可:https://dev.mysql.com/downloads/windows/installer/5.7.html。
6. Django框架像棘。Django框架是Python web開發(fā)中一款非常主流的框架稽亏。上手快,功能齊全讲弄,可以勝任大型網(wǎng)站的任務(wù)措左。他也是集HTTP協(xié)議、URL匹配避除、數(shù)據(jù)庫管理、HTML模版渲染等于一體的框架胸嘁。數(shù)據(jù)已經(jīng)從爬到數(shù)據(jù)庫中了瓶摆,下一步我們就是使用Django框架實現(xiàn)一個網(wǎng)站,動態(tài)的加載數(shù)據(jù)性宏!根據(jù)自己的需求群井,想做成什么樣就做成什么樣!Django也是第三方的毫胜,需要通過pip install django進(jìn)行安裝书斜。
二、項目架構(gòu):
在寫具體的代碼之前酵使,先來理順一下整個項目框架的結(jié)構(gòu)荐吉。爬蟲負(fù)責(zé)抓取網(wǎng)站的數(shù)據(jù),并對抓取下來的數(shù)據(jù)進(jìn)行解析和清洗口渔,然后存儲到數(shù)據(jù)庫中样屠。之后Django再從數(shù)據(jù)庫中讀取數(shù)據(jù),并將讀取的數(shù)據(jù)顯示在網(wǎng)頁中。結(jié)構(gòu)圖如下:
三痪欲、爬蟲實現(xiàn):
俗話說悦穿,巧婦難為無米之炊,再牛逼的爬蟲程序如果沒有好的數(shù)據(jù)來源业踢,也爬不到有價值的數(shù)據(jù)栗柒。因此選擇一個好的資源網(wǎng)站至關(guān)重要。這里我們選擇的是電影天堂和陽光電影兩個特別良心的網(wǎng)站知举。這兩個網(wǎng)站上有大量的高清視頻資源傍衡,每部電影都配有詳細(xì)的信息,包括演員负蠕,導(dǎo)演蛙埂,年代,類型遮糖,豆瓣評分绣的,視頻截圖等,最重要的是附有迅雷下載鏈接欲账,可以說是非常良心了屡江。但是這個網(wǎng)站經(jīng)常會有一些廣告(廣告是主要的主要的收入來源),當(dāng)你在點擊某個鏈接的時候赛不,會首先給你彈出一個新頁面惩嘉,里面嵌入的就是廣告資源,然后你再次點擊踢故,才能進(jìn)入到下一個頁面文黎。并且有時候這個網(wǎng)站還會被Chrome瀏覽器識別為病毒網(wǎng)站(不知是否真的有病毒),導(dǎo)致無法正常訪問殿较。另外最后一個就是耸峭,這個網(wǎng)站的界面相當(dāng)不美觀,對于我這種審美要求高的(特別是美女(*^_^*))碼農(nóng)來說淋纲,實在不能忍受劳闹。因此如果我們能把上面的電影資源都爬下來,再按照自己的需求實現(xiàn)一個網(wǎng)站洽瞬,顯示這些信息本涕,那就很有意思了。無論從個人角度還是商業(yè)角度來說伙窃,都是非常有價值的菩颖!這里我們使用的是Scrapy框架來實現(xiàn)的,那么以下主要從數(shù)據(jù)抓取对供,數(shù)據(jù)解析和數(shù)據(jù)存儲三個角度來進(jìn)行分析:
1. 數(shù)據(jù)抓取和解析:在寫代碼之前位他,我們首先來分析下電影天堂這個網(wǎng)站氛濒,他的首頁是包含了各種類型資源的一個組合。我們現(xiàn)在要爬取的是電影信息鹅髓,因此點擊“更多最新電影”跳轉(zhuǎn)到最新電影的列表頁面舞竿,如下圖:
可以看到這個列表頁包含了許多我們想要的電影資源,但是我們現(xiàn)在爬窿冯,只能爬取到這一頁的電影信息骗奖,怎么能把其他頁面的電影也爬下來呢,這時候就要找到每個頁面的url規(guī)則了醒串。我們可以看到执桌,第一頁電影的URL是:http://www.dytt8.net/html/gndy/dyzz/list_23_1.html,第二頁電影的URL是:http://www.dytt8.net/html/gndy/dyzz/list_23_2.html芜赌。所以我們得出一個結(jié)論就是仰挣,URL的前面部分都是一樣的,最后那個數(shù)字是幾缠沈,代表的是第幾頁膘壶。接下來就是去爬詳情頁面了。詳情頁的例圖如下:
包括電影的信息洲愤、海報颓芭,都能在這個里面找到。那么數(shù)據(jù)爬取的代碼如下:
2.數(shù)據(jù)存儲:這里我們把爬取下來的數(shù)據(jù)存儲到MySQL數(shù)據(jù)庫中柬赐。需要在pipeline中進(jìn)行實現(xiàn)亡问。示例代碼如下:
以上便是爬蟲部分的講解和示例代碼演示,當(dāng)然因為篇幅限制肛宋,無法把所有細(xì)節(jié)都介紹到位州藕,如果您對這個項目還有不懂的地方,我們在2月24日在網(wǎng)易云課堂會有直播悼吱,從零開始開始講解慎框,如何分析頁面,如何提取元素后添,scrapy框架是如何運行的等。有什么不懂的還可以和老師進(jìn)行互動薪丁,相信你一定可以學(xué)會的遇西!
四、網(wǎng)站實現(xiàn):
網(wǎng)站這里我們用的是Flask框架严嗜。在后臺做好數(shù)據(jù)的提取粱檀,在前端做好頁面的顯示。示例代碼如下:
做完后的效果圖如下(只是簡簡單單的做了個demo漫玄,UI還需要進(jìn)一步美化):
五茄蚯、總結(jié):
這個項目可以說是用到了Python大部分的技術(shù)要點压彭。有Python網(wǎng)絡(luò)爬蟲、Scrapy框架渗常、Python web開發(fā)壮不、Flask框架等。內(nèi)容比較豐富皱碘,知識點太多询一。無法通過一篇簡單的文章把所有技術(shù)細(xì)節(jié)都介紹到位。如果您對這個項目感興趣癌椿,并且想要進(jìn)一步學(xué)習(xí)健蕊,可以在2月24日晚8點,知了課堂和網(wǎng)易云課堂聯(lián)合舉辦了一場免費的直播盛宴踢俄,我將從零開始缩功,為您講述這個項目背后的一切技術(shù)要點,您將獲得以下收益:
1. Python實戰(zhàn)體驗都办;
2. 網(wǎng)絡(luò)爬蟲實戰(zhàn)技巧嫡锌;
3. 數(shù)據(jù)解析技術(shù)要點;
4. Python web開發(fā)技術(shù)流程脆丁;
5. Flask世舰、Django框架的使用;
6. 數(shù)據(jù)爬下來槽卫,如何產(chǎn)生價值跟压;
7. 用爬蟲和Flask/Django技術(shù)實現(xiàn)自己的電影網(wǎng)站;