知乎書籍排行網站——建站始末

網站地址books.bigfacewo.com
最近工做去了,感受人也變懶了,一直想寫一些關於這個網站東西分享出來。慢慢寫吧。
前情提要:對於大神來講,這個網站使用的技術都是小兒科啦。不過,我想仍是有朋友有這個需求的。這篇文章的內容不必定都是準確的,用的方法也不是最好的,不過我始終相信一句話——兼聽者明,偏聽則暗。因此看這篇文章的朋友,但願你能帶入本身的思考,同時更但願可以帶給你一些東西。前端

好了,廢話很少說了。python


網站是參考了一個外文網站。一時心血來潮,因而當時想,若是拿來分析知乎這個網站,會有什麼效果呢。
有一些不同的地方是stackoverflow這個網站開放了api,因此拿到數據是很方便的。知乎並無公開api,只能採起爬蟲手段。
因此,很天然地,流程大體分爲四個步驟:數據庫

  1. 數據獲取
  2. 數據分析
  3. 建站數據準備
  4. 建站

1、數據獲取

寫爬蟲要考慮的一些問題:編程

  1. 可靠性。當遇到程序錯誤或者一些不可抗力因素如斷電等形成的程序中止,如何從中止的時刻開始繼續爬取;或者說得設計一個狀態,該狀態保存了已經抓取數據的相關信息,下次抓取任務會忽略已經抓取的信息(這不是廢話嘛,哈哈),還有一些須要考慮的問題:api

    • 模擬登錄(後續填坑)
  2. 速度。假設一秒鐘爬取1條數據,那麼600條一個小時,6000000條就須要10000個小時,大概要一年多。這是不能接受的一個速度,單機多線程抓取10條每秒仍是能夠接受的。如此,大機率會觸發知乎反爬蟲系統,因此採起如下方法來回避這個問題:多線程

    • 代理池 。能夠找一些免費的代理網站,如西刺,爬一些ip下來用,固然這須要設計一個系統或服務,該服務不斷地去獲取代理ip,而後驗證是否可用,再存起來備用。當遇到爬蟲驗證頁面時應該將該ip移除或者標記爲暫時不可用。可是,不少狀況下知乎仍是能經過你的請求獲得你的真實ip。
    • Cookie。
    • 從新撥號。這個簡單並且很是可行,若是是單條寬帶,從新撥號會形成短期的爬取中止。
  3. 優先級。其實,並非每條數據都須要的或者說包含了有效信息,若是對要抓取的數據有必定了解,那麼咱們能夠提取一些特徵,優先抓取這部分數據。事實上我也這麼作的,這樣可以最大限度地節省時間。

當我接觸Python以後,就決定用它來寫爬蟲了,由於實在是太方便了!python爬蟲


2、數據分析

從數據中提取書籍信息,有兩種辦法:編程語言

  1. 提取書名號中的內容。
  2. 先創建書籍信息庫,再作匹配。

第二種辦法能夠作到更精確,可是創建書籍數據庫也頗費時間。因此採用了第一種方法。實際上知乎上只要提到書籍幾乎都會帶上書名號,或者有一些政治隱喻不能提的,固然咱們也不須要這類書的信息。工具

同一本書在每一個回答中最多隻能出現一次,將數據彙總後,獲得「標籤:書名:提到次數」的這樣的一個文本。優化

3、建站數據準備

按照個人需求,應該創建如下三張表:

  1. 標籤表:存放該書所對應標籤,多對多的關係。
  2. 書籍表:存放書籍的信息,以及該書的提到總次數。
  3. 標籤-書籍對應關係表:存放該標籤下該書籍被提到的次數信息。

將步驟二獲得的文本,導入到數據庫中去。

爲了獲得書籍的詳細信息,此時還須要將書名放到一些書籍網站,如我去了亞馬遜進行搜索,而後將獲得的信息寫到數據庫中去,原理同步驟一。固然,這裏也引入了一些偏差,因爲是模糊匹配,致使一些書籍的信息錯誤(後面人工審覈了一部分數據)。

到此,建站數據準備好了。

4、建站

建站就比較簡單了,後臺用Restful風格把接口寫好,前端就可使用了。
使用Vue構建了一版單頁應用,可是搜索引擎不能抓取,因而又作了一版ssr的,使用了Nuxt.js。

網站差很少4天就寫好了,大部分時間都花在了步驟一和步驟二上了。因此,若是你也想作一個相似網站,不妨先從寫爬蟲開始。


還想作的事情:

  1. 情感分析。一本書被提到,其評價有多是正面的也有多是負面的,但願加入一個情感分析的功能,而後加權到最終結果。
  2. 提升書籍信息準確度。 原本能夠申請亞馬遜或者淘寶之類的網站的api,經過api能夠獲取商品數據,能夠利用來查詢書籍信息,可是申請很麻煩,最後仍是採用了爬蟲+人工的方式。
  3. 移動端優化。 目前網站的排版在移動端表現不是太好。

總結

綜上,寫的比較簡略,固然,不具有直接可操做性,由於不涉及到具體的代碼。可是,我想表達的是,整個流程就在這裏,你能夠用你熟悉的編程語言或者工具來實現它,就算不會Python,你仍然能夠利用Java、C#來寫爬蟲或者作分析;還有一個重要的原則是,儘可能複用別人的東西,如python爬蟲相關的庫功能很是強大,直接拿來用就能夠,同理,使用Java,你須要去調查該語言相關的庫,哪些能實現你的目的,而後去使用它吧。另外,一些省略的內容,將後續補充。

相關文章
相關標籤/搜索