充氣WaWa什麼感覺?Python告訴你

點擊上方豬哥Python,跟着豬哥學Python

上期爲大家介紹了requests庫的基本信息以及使用requests庫爬取某東的商品頁,收到了很多同學的反饋說期待豬哥的更新,豬哥感到非常開心,今天就帶大家來玩一把刺激的!

一、需求背景

在實際開發過程中,在我們動手開發之前,都是由產品經理爲我們(測試、前端、後端、項目經理等)先講解一下需求,我們瞭解了需求之後,纔開始一起來討論技術方案。

我們自己實現一些小功能時同樣需要討論需求,也就是告訴別人我們爲什麼要做這個東西?或者我們想利用這款產品解決什麼問題。

我們常常看到一些有關充氣wawa的表情包和圖片或新聞,但是這種東西很少會像一些小視頻一些相互交流,大家可能都是偷摸玩耍。所以豬哥相信其實大部分同學並沒有親身體驗過充氣wawa到底是什麼感覺(包括豬哥),所以豬哥很好奇究竟是什麼一種體驗?真的如傳言中那樣爽嗎?


二、功能描述

基於很多人沒有體驗過充氣wawa是什麼感覺,但是又很好奇,所以希望通過爬蟲+數據分析的方式直觀而真實的告訴大家(下圖爲成品圖)。


三、技術方案

爲了實現上面的需求以及功能,我們來討論下具體的技術實現方案:

  1. 分析某東評論數據請求

  2. 使用requests庫抓取某東的充氣wawa評論

  3. 使用詞雲做數據展示


四、技術實現

上篇文章中就給大家說過,今天我們以某東商品編號爲:1263013576的商品爲對象,進行數據分析,我們來看看詳細的技術實現步驟吧!

本教程只爲學習交流,不得用於商用獲利,後果自負!
如有侵權或者對任何公司或個人造成不利影響,請告知刪除

1.分析並獲取評論接口的URL

第一步:打開某東的商品頁,搜索你想研究的商品。


第二步:我們在頁面中鼠標右鍵選擇檢查(或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:看這個名字就知道是產品頁評論

2.爬取評論數據

拿到評論數據接口url之後,我們就可以開始寫代碼抓取數據了。一般我們會先嚐試抓取一條數據,成功之後,我們再去分析如何實現大量抓取。

上一篇我們已經講解了如何使用requests庫發起http/s請求,我們來看看代碼


但是在打印的結果中數據卻是空?爲何瀏覽器請求成功,而我們的代碼卻請求不到數據呢?難道我們遇到了反爬?這種情況下如何解決?

大家在遇到這種情況時,回到瀏覽器的調試窗口,查看下瀏覽器發起的請求頭,因爲可能瀏覽器請求時攜帶了什麼請求頭參數而我們代碼中沒有。


果然,我們在瀏覽器頭中看到了有兩個請求頭RefererUser-Agent,那我們先把他們加到代碼的請求頭中,再試試!

3.數據提取

我們對爬取的數據分析發現,此數據爲jsonp跨域請求返回的json結果,所以我們只要把前面的fetchJSON_comment98vv4646(和最後的)去掉就拿到json數據了。


將json數據複製到json格式化工具中或者在Chrome瀏覽器調試窗口點擊Preview也可以看到,json數據中有一個key爲comments的值便是我們想要的評論數據。


我們再對comments值進行分析發現是一個有多條數據的列表,而列表裏的每一項就是每個評論對象,包含了評論的內容,時間,id,評價來源等等信息,而其中的content字段便是我們在頁面看到的用戶評價內容。


那我們來用代碼將每個評價對象的content字段提取並打印出來

4.數據保存

數據提取後我們需要將他們保存起來,一般保存數據的格式主要有:文件、數據庫、內存這三大類。今天我們就將數據保存爲txt文件格式,因爲操作文件相對簡單同時也能滿足我們的後續數據分析的需求。


然後我們查看一下生成的文件內容是否正確

5.批量爬取

再完成一頁數據爬取、提取、保存之後,我們來研究一下如何批量抓取?

做過web的同學可能知道,有一項功能是我們必須要做的,那便是分頁。何爲分頁?爲何要做分頁?

我們在瀏覽很多網頁的時候常常看到“下一頁”這樣的字眼,其實這就是使用了分頁技術,因爲向用戶展示數據時不可能把所有的數據一次性展示,所以採用分頁技術,一頁一頁的展示出來。

讓我們再回到最開始的加載評論數據的url:

https://sclub.jd.com/comment/productPageComments.action?callback=fetchJSON_comment98vv4654&productId=1263013576&score=0&sortType=5&page=0&pageSize=10&isShadowSku=0&fold=1

我們可以看到鏈接裏面有兩個參數page=0&pageSize=10,page表示當前的頁數,pageSize表示每頁多少條,那這兩個數據直接去數據庫limit數據。

老司機一眼便可以看出這就是分頁的參數,但是有同學會說:如果我是老司機還幹嘛看你的文章?所以我教大家如何來找到這個分頁參數

回到某東的商品頁,我們將評價頁面拉到最底下,發現有分頁的按鈕,然後我們在調試窗口清空之前的請求記錄。


清空之前的請求記錄之後,我們點擊上圖紅框分頁按鈕的數字2,代表這第二頁,然後複製第一條評價去調試窗口搜索,最後找到請求鏈接。


然後我們點擊Headers查看第二頁請求數據的url


然後我們比較第一頁評價與第二頁評價的url有何區別


這裏也就驗證了豬哥的猜想:page表示當前的頁數pageSize表示每頁多少條。而且我們還能得出另一個結論:第一個page=0,第二頁page=1 然後依次往後。有同學會問:爲什麼第一頁不是1,而是0,因爲在數據庫中一般的都是從0開始計數,編程行業很多數組列表都是從0開始計數。

好了,知道分頁規律之後,我們只要在每次請求時將page參數遞增不就可以批量抓取了嗎?我們來寫代碼吧!


簡單講解一下做的改動:

  1. spider_comment方法增加入參page

    頁數,然後在url中增加佔位符,這樣就可以動態修改url,爬取指定的頁數。

  2. 增加一個batch_spider_comment方法,循環調用spider_comment方法,暫定爬取100頁。

  3. batch_spider_comment方法的for循環中設置了一個隨機的休眠時間,意在模擬用戶瀏覽,防止因爲爬取太頻繁被封ip。


爬取完成之後檢查成果

6.數據清洗

數據成功保存之後我們需要對數據進行分詞清洗,對於分詞我們使用著名的分詞庫jieba


首先是安裝jieba庫:

pip3 install jieba


當然這裏你還可以對一些介詞等無效詞進行剔除,這樣可以避免無效數據。

7.生成詞雲

生成詞雲我們需要用到numpymatplotlibwordcloudPillow這幾個庫,大家先自行下載。matplotlib庫用於圖像處理,wordcloud庫用於生成詞雲。

注意:font_path是選擇字體的路徑,如果不設置默認字體可能不支持中文,豬哥選擇的是Mac系統自帶的宋體字!

最終結果:


我們來看看全代碼

五、總結

因考慮新手的友好性,文章篇幅較長,詳細的介紹了從需求到技術分析、爬取數據、清洗數據、最後的分析數據。我們來總結一下本篇文章學到的東西吧:

  1. 如何分析並找出加載數據的url

  2. 如何使用requests庫的headers解決RefererUser-Agent反扒技術

  3. 如何找出分頁參數實現批量爬取

  4. 設置一個爬蟲間隔時間防止被封ip

  5. 數據的提取與保存到文件

  6. 使用jieba庫對數據分詞清洗

  7. 使用wordcloud生成指定形狀的詞雲


這是一套完整的數據分析案例,希望大家能自己動手嘗試,去探索更多有趣的案例,做個有趣的人~


項目源碼(或閱讀原文):https://github.com/pig6/jd_comment_spider

【完】

本文分享自微信公衆號 - 豬哥Java(pig-python)。
如有侵權,請聯繫 [email protected] 刪除。
本文參與“OSC源創計劃”,歡迎正在閱讀的你也加入,一起分享。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章