經(jīng)過一天一夜的奮戰(zhàn)(有點夸張),終于把這個東西搞定了就轧,期間遇到了很多困難(后面會慢慢展開),不過田度,睿智(蠢笨)如我妒御,在各大博客和蛇崽兄弟的指導下,終于完成了這一切镇饺。為了不讓大家重蹈覆轍乎莉,我將整個過程都記錄了下來,嗯奸笤,共勉惋啃。
Tools & Background
目標:在豆瓣上取得所有《無問西東》的有價值的評論,并整理分析得出評價中最常用的詞匯成圖揭保。
IOS
Python3
PyCharm
Scrapy(xpath)
結(jié)巴分詞
matplotlib
wordcloud
基本的網(wǎng)絡(luò)交互知識(這里附上一個比較全面但不完整的介紹)
Grab info
熟悉Scrapy肥橙,并在PyCharm中創(chuàng)建框架。
在 pyCharm的terminal里秸侣,
用 'scrapy startproject object_name' 創(chuàng)建scrapy項目 這里object_name用douban
用'scrapy crawl name' 作為測試命令存筏, 這里name用 dongxi_comment
Attention:有的時候因為創(chuàng)建文件的層次不同,需要用cd命令返回上一層味榛。(compiler會提示你)-
創(chuàng)建一個基本類椭坚,調(diào)試setting參數(shù)。
name是必須的搏色,上面提到的測試命令就是用的這個name善茎,代表這個爬蟲程序。(可以隨便绕到巍)
starts_urls是必須的垂涯,因為這個就相當于我們爬的起點烁焙。
在scrapy的官方tutorial里,這些就夠了耕赘,甚至不需要發(fā)起request骄蝇,因為這個框架可以自動識別然后調(diào)用接下來的parse函數(shù)〔俾猓看起來很方便九火,但是如果要對一些默認的設(shè)置進行修改或者,做一些預(yù)處理册招,這個就很麻煩了岔激,或許可以在setting里設(shè)置,但是預(yù)處理就做不到了(后面會提到)是掰。所以我這里不會按照官文的格式虑鼎,但也不會差太多。
page: 用來記錄一共爬了多少頁冀惭。
cookie:防止因為登錄需要而被限制的參數(shù)震叙。
headers:模擬瀏覽器發(fā)生請求的參數(shù)。
這上面兩個參數(shù)都是從瀏覽器中得到(如何得到)散休,cookie比較特殊媒楼,因為這里得到的值很不規(guī)范,服務(wù)器不能識別戚丸,所以后面有一個處理
-
start_requests 函數(shù)設(shè)置
整個函數(shù)分為3個部分:
A. 對cookie的預(yù)處理(引用來源)
B. 創(chuàng)建文件夾和路徑切換
C. 發(fā)起第一次請求(需要改變的參數(shù)划址,才寫到括號里,否則都是默認參數(shù)值)限府。
-
主函數(shù)設(shè)置
A. 先確定目標網(wǎng)站的HTML架構(gòu)夺颤,學習過最好,這樣可以很快定位數(shù)據(jù)位置胁勺。如圖世澜,先定位到div(class=comment),方便后面提取這個區(qū)間的數(shù)據(jù)
B. 接著署穗,打開一個新的txt寥裂,注意參數(shù)(a+),表示沒有相應(yīng)的文件就創(chuàng)建案疲,有就續(xù)寫封恰。注意,所有的寫入都應(yīng)該在with這個block里完成褐啡,程序一旦離開該block诺舔,則文件自動close。
C. 因為這里有二十個comments,所以我們要用一個for循環(huán)低飒,同時記錄贊同的數(shù)據(jù)量许昨,少于10,則不在數(shù)據(jù)收集范圍逸嘀,同時取評論時間车要,方便后期數(shù)據(jù)分析。
Attention:這里有個坑崭倘!大家注意定位評論時間的class屬性:網(wǎng)頁上顯示為“comment-time ”,不是“comment-time”类垫,你要問我有什么區(qū)別司光?time后面有個空格啊Oせ肌2屑摇! 在這里卡了一個小時售躁,不說了坞淮,哭去。
<span class="comment-time " title="2018-01-12 22:51:11">
2018-01-12
</span>
D. 最后一部分就是對下一頁url的提取陪捷,這里有兩種方法回窘,一種就是上圖中看到的:先取點得到一個殘缺的url,再加上缺失的部分市袖。用Request發(fā)起一次新的請求啡直。
還有一種就是利用response.follow,該函數(shù)可以直接補充相應(yīng)url缺失的部分苍碟,如圖
大家肯定也看到了酒觅,這里用的是yield,而不是return微峰,為什么不用return舷丹,因為用了會報錯啊,開個玩笑蜓肆,這里有yield的相關(guān)資料哦颜凯!關(guān)于follow更多可以在官網(wǎng)找到
Lookback
有一些坑在文中已經(jīng)提到過了,那么還有什么呢症杏?
爬取中文時装获,pyCharm的self.log()打印出來的都是Unicode(在另一種編碼規(guī)則下),也就是你我都看不懂厉颤。穴豫。。但不是亂碼,雖然看不懂精肃,但是output到txt file里(或者數(shù)據(jù)庫)是可以被認識的(在UTF-8的編碼規(guī)則下)秤涩。知乎解釋
輸出到具體某個文件時(txt),我用了python3 的open()司抱,close()筐眷,總是會出現(xiàn)失敗,具體error忘了截圖习柠,大概是Unicode和Ascii的沖突吧匀谣。所以我就用到了with,它不用手動close资溃,我之前好像提到過哈武翎。
-
差點忘記這里有一個巨坑,如下圖
乍一看溶锭,這個紅色處調(diào)用是沒有問題的宝恶,但是實際執(zhí)行的時候,是被忽略掉的趴捅。我以為response可以作為一個參數(shù)進行傳遞垫毙,但是實際上好像不行。
那怎么做呢拱绑?
再發(fā)起一次請求综芥,利用callback調(diào)用函數(shù)。
Process
- 先導入數(shù)據(jù)欺栗。
- 結(jié)巴分詞處理毫痕,不用擔心數(shù)字,它會自動過濾迟几。
- wordcloud可以用pip直接下載(至少mac可以)消请,因為它不支持中文顯示,所以要自己設(shè)置中文字體类腮。關(guān)于wordcloud的參數(shù)這里有
- 最后就是展示圖片了臊泰,用到了常用的數(shù)據(jù)處理包—matplotlib。
Outcome
想那次哭的稀里嘩啦蚜枢,也就是三個月前缸逃,不多說了,上圖厂抽。
眼看都要天黑了需频,去跑步了啦。
彩蛋?攴铩U蜒场0摺!
這里推薦我在編程過程中循環(huán)聽的歌:
辻詩音的《I am beautiful》
Nylas的《廢物曬太陽》
徐秉龍的《白羊》
馮提莫的《佛系少女》