上期爲你們介紹了requests庫的基本信息以及使用requests庫爬取某東的商品頁,收到了不少同窗的反饋說期待豬哥的更新,豬哥感到很是開心,今天就帶你們來玩一把刺激的!前端
在實際開發過程當中,在咱們動手開發以前,都是由產品經理爲咱們(測試、前端、後端、項目經理等)先講解一下需求,咱們瞭解了需求以後,纔開始一塊兒來討論技術方案。
咱們本身實現一些小功能時一樣須要討論需求,也就是告訴別人咱們爲何要作這個東西?或者咱們想利用這款產品解決什麼問題。vue
咱們經常看到一些有關充氣娃娃的表情包和圖片或新聞,可是這種東西不多會像一些小視頻一些相互交流,你們可能都是偷摸玩耍。因此豬哥相信其實大部分同窗並無親身體驗過充氣娃娃究竟是什麼感受(包括豬哥),因此豬哥很好奇到底是什麼一種體驗?真的如傳言中那樣爽嗎?
web
基於不少人沒有體驗過充氣娃娃是什麼感受,可是又很好奇,因此但願經過爬蟲+數據分析的方式直觀而真是的告訴你們(下圖爲成品圖)。
數據庫
爲了實現上面的需求以及功能,咱們來討論下具體的技術實現方案:編程
上篇文章中就給你們說過,今天咱們以某東商品編號爲:1263013576的商品爲對象,進行數據分析,咱們來看看詳細的技術實現步驟吧!json
本教程只爲學習交流,不得用於商用獲利,後果自負!
若有侵權或者對任何公司或我的形成不利影響,請告知刪除後端
第一步:打開某東的商品頁,搜索你想研究的商品。
第二步:咱們在頁面中鼠標右鍵選擇檢查(或F12)調出瀏覽器的調試窗口。
第三步:調出瀏覽器後點擊評論按鈕使其加載數據,而後咱們點擊network查看數據。
第四步:查找加載評論數據的請求url,咱們可使用某條評論中的一段話,而後在調試窗口中搜索。
通過上面4步分析,咱們就拿到了京東評論數據的接口:https://sclub.jd.com/comment/productPageComments.action?callback=fetchJSON_comment98vv4654&productId=1263013576&score=0&sortType=5&page=0&pageSize=10&isShadowSku=0&fold=1跨域
productPageComments:看這個名字就知道是產品頁評論數組
拿到評論數據接口url以後,咱們就能夠開始寫代碼抓取數據了。通常咱們會先嚐試抓取一條數據,成功以後,咱們再去分析如何實現大量抓取。瀏覽器
上一篇咱們已經講解了如何使用requests庫發起http/s請求,咱們來看看代碼
可是在打印的結果中數據倒是空?爲什麼瀏覽器請求成功,而咱們的代碼卻請求不到數據呢?難道咱們遇到了反扒?這種狀況下如何解決?
你們在遇到這種狀況時,回到瀏覽器的調試窗口,查看下瀏覽器發起的請求頭,由於可能瀏覽器請求時攜帶了什麼請求頭參數而咱們代碼中沒有。
果真,咱們在瀏覽器頭中看到了有兩個請求頭Referer和User-Agent,那咱們先把他們加到代碼的請求頭中,再試試!
咱們對爬取的數據分析發現,此數據爲jsonp跨域請求返回的json結果,因此咱們只要把前面的fetchJSON_comment98vv4646(
和最後的)
去掉就拿到json數據了。
將json數據複製到json格式化工具中或者在Chrome瀏覽器調試窗口點擊Preview
也能夠看到,json數據中有一個key爲comments
的值即是咱們想要的評論數據。
咱們再對comments值進行分析發現是一個有多條數據的列表,而列表裏的每一項就是每一個評論對象,包含了評論的內容,時間,id,評價來源等等信息,而其中的content
字段即是咱們在頁面看到的用戶評價內容。
那咱們來用代碼將每一個評價對象的content
字段提取並打印出來
數據提取後咱們須要將他們保存起來,通常保存數據的格式主要有:文件、數據庫、內存這三大類。今天咱們就將數據保存爲txt文件格式,由於操做文件相對簡單同時也能知足咱們的後續數據分析的需求。
而後咱們查看一下生成的文件內容是否正確
再完成一頁數據爬取、提取、保存以後,咱們來研究一下如何批量抓取?
作過web的同窗可能知道,有一項功能是咱們必需要作的,那即是分頁。何爲分頁?爲什麼要作分頁?
咱們在瀏覽不少網頁的時候經常看到「下一頁」這樣的字眼,其實這就是使用了分頁技術,由於向用戶展現數據時不可能把全部的數據一次性展現,因此採用分頁技術,一頁一頁的展現出來。
讓咱們再回到最開始的加載評論數據的url:
咱們能夠看到連接裏面有兩個參數page=0&pageSize=10,page表示當前的頁數,pageSize表示每頁多少條,那這兩個數據直接去數據庫limit數據。
老司機一眼即可以看出這就是分頁的參數,可是有同窗會說:若是我是老司機還幹嗎看你的文章?因此我教你們如何來找到這個分頁參數。
回到某東的商品頁,咱們將評價頁面拉到最底下,發現有分頁的按鈕,而後咱們在調試窗口清空以前的請求記錄。
清空以前的請求記錄以後,咱們點擊上圖紅框分頁按鈕的數字2,表明這第二頁,而後複製第一條評價去調試窗口搜索,最後找到請求連接。
而後咱們點擊Headers
查看第二頁請求數據的url
而後咱們比較第一頁評價與第二頁評價的url有何區別
這裏也就驗證了豬哥的猜測:page表示當前的頁數,pageSize表示每頁多少條。並且咱們還能得出另外一個結論:第一個page=0,第二頁page=1 而後依次日後。有同窗會問:爲何第一頁不是1,而是0,由於在數據庫中通常的都是從0開始計數,編程行業不少數組列表都是從0開始計數。
好了,知道分頁規律以後,咱們只要在每次請求時將page參數遞增不就能夠批量抓取了嗎?咱們來寫代碼吧!
簡單講解一下作的改動:
爬取完成以後檢查成果
數據成功保存以後咱們須要對數據進行分詞清洗,對於分詞咱們使用著名的分詞庫jieba。
首先是安裝jieba庫:
pip3 install jieba
固然這裏你還能夠對一些介詞等無效詞進行剔除,這樣能夠避免無效數據。
生成雲詞咱們須要用到numpy
、matplotlib
、wordcloud
、Pillow
這幾個庫,你們先自行下載。matplotlib
庫用於圖像處理,wordcloud
庫用於生成詞雲。
注意:font_path是選擇字體的路徑,若是不設置默認字體可能不支持中文,豬哥選擇的是Mac系統自帶的宋體字!
最終結果:
咱們來看看全代碼:
因考慮新手的友好性,文章篇幅較長,詳細的介紹了從需求到技術分析、爬取數據、清洗數據、最後的分析數據。咱們來總結一下本片文章學到的東西吧:
這是一套完整的數據分析案例,但願你們能本身動手嘗試,去探索更多有趣的案例,作個有趣的人~
獲取源碼,掃描下方二維碼關注微信公衆號「裸睡的豬」,回覆:京東商品評價