在這炎炎夏季,當你百無聊賴時,在這「枯藤老樹昏鴉,空調wifi西瓜」的閒暇時刻,
你是否也是「夕陽西下,就往沙發上一趴」?
何不看一部電影?放鬆一下我們疲勞已久的神經。
那麼,問題來了?有什麼好的電影值得我們去看呢?所幸,豆瓣電影評分機制給予了我們一定的參考,
我們可以在百度中搜索「豆瓣電影分類排行榜」來獲得相應的電影信息。
例如,我們點擊「豆瓣電影分類排行榜 - 劇情片」進去後,默認的是」好於75%-65%「的推薦。
看一部低端的電影浪費我們的人生,還不如去玩一局LOL活得開心,因此,小叮噹選擇的是」好於100%-90%"的電影信息。
那麼,我下次想找電影看呢?難道還需要再來訪問一遍豆瓣,來獲得這些電影信息?
當然是不用,下面,小叮噹就為大家分享,如何使用Python中的Scrapy框架,來獲取豆瓣的電影信息。
還不了解Scrapy的夥伴們,可以去看下「小叮噹高級爬蟲(一):爬蟲利器Scrapy」。
巴金先生有他的「激流三部曲」,《家》、《春》、《秋》;
而小叮噹卻有「Scrapy五部曲」,比巴金先生還多了兩部,就問巴金先生「慌不慌」。
哈哈,下面我們言歸正傳,先來看看Scrapy項目的「五部曲」。
Scrapy項目五部曲
(1)分析網頁
判斷我們將要爬取的網頁數據是靜態還是動態。
(2)使用命令創建Scrapy項目
scrapy startproject 項目名
(3)明確爬取目標
定義items.py文件內容,明確將要爬取的目標
(4)使用命令創建爬蟲文件
在系統生成的Scrapy項目的」spiders「文件夾下使用命令:scrapy genspider 爬蟲名稱 網頁域名
(5)存儲數據
完善管道文件pipelines.py,存儲爬取的數據。
通過Scrapy獲取豆瓣電影信息
為方便新手,以下Scrapy的使用是在windows7的環境下。
(1)分析豆瓣電影信息
以我們剛才搜索到的「豆瓣電影分類排行榜 - 劇情片」為例。
我們在360瀏覽器中按下F12,選擇「network",之後選擇」xhr",拖動滾動條,發現Name下方有數據出現,且隨滾動條的滾動而增多。這說明頁面是動態頁面。我們單擊選擇其中一條,在右側框裡查看它的請求地址。
注意:爬蟲新手推薦使用谷歌瀏覽器或是火狐瀏覽器(當你熟悉了,什麼瀏覽器都是可以。大家不要糾結這個問題)
點擊瀏覽器上方的」+「號,新建網頁,將我們剛才查看到的請求地址粘到地址欄中,進行訪問。
可以看到,訪問的結果已是我們的電影信息。
為方便新手操作,小叮噹將網址粘到火狐中為大家演示。
對比一下就可以發現,還是火狐的數據可視化效果好,便於新手查找數據。觀察數據,第一個電影是」星際穿越「,不是我們在網頁中看到的」肖申克的救贖「。
此時我們將數據網址的」start"值改為「0」。
按下回車進行訪問,發現此時數據中的第一個已為「肖申克的救贖」,和我們在網頁中看到的一致。
(2)使用命令創建Scrapy項目
小叮噹先在磁碟空間較大的H盤創建文件夾「Scrapy項目」,並進入。
按住鍵盤「shift"鍵,右擊滑鼠,在出現的選項中選擇」在此處打開命令窗口「。
我們在打開的命令窗口中輸入命令:scrapy startproject douban_movie 其中」douban_movie"是我們自定義的項目名稱,表示「豆瓣電影」。
此時我可以發現」Scrapy項目「文件夾下多了我們剛才使用命令創建的」douban_movie「項目。
(3)明確爬取目標
我們以爬取目標為「電影名稱」、「電影評分」、「電影詳情連結」為例給大家分享。(大家可以根據自己的需求確定爬取的目標)
我們用pycharm打開H盤中我們創建的「douban_movie」Scrapy爬蟲項目。
在"視圖"工具欄中將「project"項目視圖點開,或是直接使用」Alt+1"的快捷鍵。
在左側的視圖窗口中雙擊"items.py"。
通過"Scrapy.Field()"方法,我們將目標實例化。
(4)使用命令創建爬蟲文件
我們以同樣的方法,打開H盤我們創建的「douban_movie」項目中的「spiders"文件夾,按住鍵盤「shift"鍵,右擊滑鼠,在出現的選項中選擇」在此處打開命令窗口「。
在打開的命令窗口中輸入命令:scrapy genspider catch_movie douban.com
其中」catch_movie"表示爬蟲名字,「douban.com"表示要抓取的網頁的域名。
之後,我們在pycharm下點擊」spiders"文件夾,發現系統已為我們創建好「catch_movie.py"爬蟲文件。
雙擊「catch_movie.py",出現系統為我們創建好的爬蟲模板。
編寫爬蟲文件,使之符合我們的需求。我們將"start_urls"欄位值改寫為我們分析好的網頁地址。在「parse」解析函數下,我們使用print語句將內容列印出來,進行測試。
雙擊」settings.py",將「ROBOTSTXT_OBEY = True」協議前加上「#」注釋掉,將「user_agent"欄位前」#「去掉,將其值設置為我們在瀏覽器中看到的值。
運行爬蟲進行初步測試,在剛才的命令窗口中輸入:scrapy crawl catch_movie 其中「catch_movie"是我們創建的爬蟲名字。
此時我們已經可以看到爬取的整個頁面。
測試能拿到數據後,我們來正式編寫爬蟲。
用yield來返回item使得函數可迭代,節省內存空間,提高程序運行效率。
(5)存儲數據
我們,雙擊」pipelines.py",進行管道文件的編寫,來存儲我們爬取的數據。
我們導入json,將最後的數據寫為json格式,定義函數open_spider在爬蟲執行時,打開文件準備寫入,在系統模板process_item中編寫數據寫入過程,最後定義函數close_spider關閉文件。
其中需注意:①打開文件時,一定要設定編碼格式,例如設置為encoding=「utf-8"
②在調用dumps寫成json格式時,一定要寫」ensure_ascii=False「使ascii碼為關閉狀態,不然爬取的數據無法正常顯示中文。
切記,一定要到」settings.py"中將「ITEM_PIPELINES」前的注釋去掉,以表示啟用管道文件。
其中的數字300表示優先級,數字越小,優先級越高。(以供在管道文件中定義多個類時使用)
最後,我們在命令窗口中輸入命令:scrapy crawl catch_movie 運行爬蟲
運行結束,可看到spiders文件夾下多了一個「douban_movie.json」的文件,這表示我們的數據存儲成功。
Scrapy豆瓣電影項目的完善
為使大家更好地明白Scrapy項目的完整步驟,上述的爬虫部分只編寫了前20條電影信息的數據,現在我們來完善「catch_movie.py」文件,爬取全部電影信息。
(1)首先我們設置網址偏移offset用來構造出所有的電影信息網址。
(2)當我們遞歸爬取網址時,一定要設置終止條件,不然我們的程序會一直運行。當我們爬取不到電影信息時,我們得到的電影列表肯定為空列表,所以我們可以以此來return,終止遞歸。
(3)根據我們分析網頁的規律,每次偏移量加20,以此構造新的爬蟲請求,並將其用yield返回給引擎。
(4)再次運行爬蟲,查看結果。
可以看到,運行完善後的Scrapy豆瓣電影爬蟲項目,我們已經可以拿到全部的電影數據信息。