Scrapy+Flask+Mongodb+Swift開發全攻略(2)

發表於2015-05-18

好的,這期開始之前,我們先要幹兩件事。第一件事是找到spiders資料夾裡的dbmeizi_scrapy.py。開啟他,上一篇教程裡,這個爬蟲檔案是這麼寫的。

現在我們需要改成這樣.

why?

很簡單,因為用extract這個方法得到的是一個陣列,而我們的每一個欄位實際上是一個string而非一個array,如果不取第一個值,那麼存入mongodb之後,title這個key對應的value是一個陣列,這會導致我們將mongodb裡的資料轉換成json之後需要在客戶端再進行分解。很麻煩。

第二件事,是刪除我們上一個爬蟲爬取的資料。
如圖:

ok,重新執行我們的爬蟲,scrapy crawl dbmeiziSpider,現在,check一下資料庫裡的內容,是不是以前的每個欄位對應的內容已經從陣列變成了string了。

開始編寫伺服器

激動人心的時刻要開始了,我們要從iOS程式設計師變成一個菜鳥級別的server端選手。不過能用自己編寫的iOS客戶端從自己寫的server下載資料,也挺爽的,不是麼?

在編寫伺服器端的時候確保你用pip安裝了下面幾個庫。
1.pymongo

2.Flask

我們的服務端程式碼如下。

以上程式碼就是我們的服務端程式碼,只有短短28行,python的強大之處也在於此。

好的,我來一行一行的解釋一下。

前面5行就是import各種我們需要的庫,如果後面你使用python server.py執行的時候提示錯誤,很可能是你的機子上缺少上述的庫。

app = Flask(__name__)這句話就是利用Flask的構造方法生成一個Flask例項,name是什麼?簡單來說,你建立的任何python檔案(.py),都會有一個內建屬性,叫做__name__,他有兩個用途,如果你在命令列狀態下直接執行python .py的時候,這個時候這個python檔案裡的__name__就是__main__,如果你是在別的python檔案裡import *.py,那麼這個name的東西就是這個Python檔案的檔名。so,這個東西常常用來判斷,你是在import還是直接在命令列裡執行這個檔案。

所以,上一行,我們生成了一個Flask例項並且把這個例項賦給了app這個變數。

這兩句很簡單,就是用pymongo這個第三方庫,開啟我們的mongodb資料庫,並且拿到我們的dbmeizi這個database。

這句話,我們定義了一個函式,用來把mongodb裡的資料轉換為json格式。用來返回給我們的ios客戶端。

@app.route('/meizi/', methods=['GET'])
這句話的意思就是Flask的一種寫法,意思就是當我們發起了一個request,並且這個request的方法是get,url是"localhost:5000/meizi/"這種的的時候,我們就執行findmeizi()這個方法。

這個方法就是我們的http server監測到使用者發起get請求,並且URL是形如’http://127.0.0.1:5000/sightings/?offset=0&limit=3’的時候,我們取出limit這個值,賦給lim這個變數,然後取出offset這個值,賦給off。

然後呢?利用我們的db(就是剛才利用pymongo獲取的mongodb例項),取出‘meizi’這個collection,skip(off)的意思就是跳過前面多少行,limit(lim)表示從資料庫取出多少個值。

整句話的意思就是,從meizi這個collection裡跳過前off個值,取後面的lim個值。

現在取到的資料都在results變數裡,我們遍歷results,放入json_results這個陣列裡,然後把陣列轉換成json格式返回給客戶端。

我們執行一下試試。

python server.py

perfect!
資料已經返回給瀏覽器了。

這時候我們編寫一個簡單的iOS客戶端,驗證一下。

我們建立一個swift的iOS程式,用cocoapods安裝下列庫。

執行一下。

哈哈,大功告成。資料返回正確。

github地址:https://github.com/zangqilong198812/MeiziServer

但是,這樣就結束了麼?

遠遠沒有,爬蟲完全是個半成品,服務端簡直就是個玩笑,客戶端什麼炫酷特效互動都沒有,做這樣的東西簡直是打自己的臉。

現在,萬里長征只開始了一小步。

1.爬蟲如何自己定時執行?
2.Mongodb如何避免插入重複資料?
3.Server如何提供多個介面。
4.如何Put,delete,Post,Get
5.POP,AsyncDisplaykit,collectionviewlayout,Custom Transition,Bézier curve,Private Cocoapods,Continuous integration,Unit Test.

現在,到了我展現真正實力的時候了。

相關文章