Python登入豆瓣並爬取影評
上一篇我們講過Cookie相關的知識,瞭解到Cookie是為了互動式web而誕生的,它主要用於以下三個方面:
- 會話狀態管理(如使用者登入狀態、購物車、遊戲分數或其它需要記錄的資訊)
- 個性化設定(如使用者自定義設定、主題等)
- 瀏覽器行為跟蹤(如跟蹤分析使用者行為等)
我們今天就用requests庫來登入豆瓣然後爬取影評為例子, 用程式碼講解下Cookie的會話狀態管理(登入)功能。
> 此教程僅用於學習,不得商業獲利!如有侵害任何公司利益,請告知刪除!
一、需求背景
之前豬哥帶大家爬取了優酷的彈幕並生成詞雲圖片,發現優酷彈幕的質量並不高,有很多介詞和一些無效詞,比如:哈哈、啊啊、這些、那些。。。而豆瓣口碑一直不錯,有些書或者電影的推薦都很不錯,所以我們今天來爬取下豆瓣的影評,然後生成詞雲,看看效果如何吧!
二、功能描述
我們使用requests庫登入豆瓣,然後爬取影評,最後生成詞雲!
為什麼我們之前的案例(京東、優酷等)中不需要登入,而今天爬取豆瓣需要登入呢?那是因為豆瓣在沒有登入狀態情況下只允許你檢視前200條影評,之後就需要登入才能檢視,這也算是一種反扒手段!
三、技術方案
我們看下簡單的技術方案,大致可以分為三部分:
- 分析豆瓣的登入介面並用requests庫實現登入並儲存cookie
- 分析豆瓣影評介面實現批量抓取資料
- 使用詞雲做影評資料分析
方案確定之後我們就開始實際操作吧!
四、登入豆瓣
做爬蟲前我們都是先從瀏覽器開始,使用除錯視窗檢視url。
1.分析豆瓣登入介面
開啟登入頁面,然後調出除錯視窗,輸入使用者名稱和密碼,點選登入。
因為是一個POST請求,所以我們還需要看看請求登入時攜帶的引數,我們將除錯視窗往下拉檢視Form Data。
2.程式碼實現登入豆瓣
得到登入請求URL和引數後,我們就可以來用requests庫來寫一個登入功能!
3.儲存會話狀態
上期我們在爬取優酷彈幕的時候我們是複製瀏覽器中的Cookie到請求頭中這來來儲存會話狀態,但是我們如何讓程式碼自動儲存Cookie呢?
也許你見過或者使用過urllib
庫,它用來儲存Cookie的方式如下:
cookie = http.cookiejar.CookieJar()
handler = urllib.request.HttpCookieProcessor(cookie)
opener = urllib.request.build_opener(handler)
opener(url)
但是前面我們介紹requests庫的時候就說過:
> requests庫是一個基於urllib/3的第三方網路庫,它的特點是功能強大,API優雅。由上圖我們可以看到,對於http客戶端python官方文件也推薦我們使用requests庫,實際工作中requests庫也是使用的比較多的庫。
所以今天我們來看看requests庫是如何優雅的幫我們自動儲存Cookie的?我們來對程式碼做一點微調,使之能自動儲存Cookie維持會話狀態! 上述程式碼中,我們做了兩處改動:
- 在最上面增加一行
s = requests.Session()
,生成Session物件用來儲存Cookie - 發起請求不再是原來的requests物件,而是變成了Session物件
我們可以看到發起請求的物件變成了session物件,它和原來的requests物件發起請求方式一樣,只不過它每次請求會自動帶上Cookie,所以後面我們都用Session物件來發起請求!
4.這個Session物件是我們常說的session嗎?
講到這裡也許有同學會問:requests.Session物件是不是我們常說的session呢?
答案當然不是,我們常說的session是儲存在服務端的,而requests.Session物件只是一個用於儲存Cookie的物件而已,我們可以看看它的原始碼介紹 所以大家千萬不要將requests.Session物件與session技術搞混了!
五、爬取影評
我們實現了登入和儲存會話狀態之後,就可以開始幹正事啦!
1.分析豆瓣影評介面
首先在豆瓣中找到自己想要分析的電影,這裡豬哥選擇一部美國電影**《荒野生存》**,因為這部電影是豬哥心中之最,沒有之一! 然後下拉找到影評,調出除錯視窗,找到載入影評的URL
2.爬取一條影評資料
但是爬取下來的是一個HTML網頁資料,我們需要將影評資料提取出來
3.影評內容提取
上圖中我們可以看到爬取返回的是html,而影評資料便是巢狀在html標籤中,如何提取影評內容呢?
這裡我們使用正則表示式來匹配想要的標籤內容,當然也有更高階的提取方法,比如使用某些庫(比如bs4、xpath等)去解析html提取內容,而且使用庫效率也比較高,但這是我們後面的內容,我們今天就用正則來匹配!
我們先來分析下返回html 的網頁結構
我們發現影評內容都是在<span class="short"></span>
這個標籤裡,那我們 就可以寫正則來匹配這個標籤裡的內容啦!
檢查下提取的內容
4.批量爬取
我們爬取、提取、儲存完一條資料之後,我們來批量爬取一下。根據前面幾次爬取的經驗,我們知道批量爬取的關鍵在於找到分頁引數,我們可以很快發現URL中有一個start
引數便是控制分頁的引數。
這裡只爬取了25頁就爬完,我們可以去瀏覽器中驗證一下,是不是真的只有25頁,豬哥驗證過確實只有25頁!
六、分析影評
資料抓取下來之後,我們就來使用詞雲分析一下這部電影吧!
基於使用詞雲分析的案例前面已經講過兩個了,所以豬哥只會簡單的講解一下!
1.使用結巴分詞
因為我們下載的影評是一段一段的文字,而我們做的詞雲是統計單詞出現的次數,所以需要先分詞!
2.使用詞雲分析
最終成果: 從這些詞中我們可以知道這是關於一部關於追尋自我與現實生活的電影,豬哥裂牆推薦!!!
七、總結
今天我們以爬取豆瓣為例子,學到了不少的東西,來總結一下:
- 學習如何使用requests庫發起POST請求
- 學習瞭如何使用requests庫登入網站
- 學習瞭如何使用requests庫的Session物件保持會話狀態
- 學習瞭如何使用正則表示式提取網頁標籤中的內容
鑑於篇幅有限,爬蟲過程中遇到的很多細節和技巧並沒有完全寫出來,所以希望大家能自己動手實踐,當然也可以加入到豬哥的Python新手交流群中和大家一起學習,遇到問題也可以在群裡提問!加群請加豬哥微信:it-pig66
,好友申請格式:加群-xxx!