《Learning Scrapy》(中文版)第4章 從Scrapy到移動應用


序言
第1章 Scrapy介紹
第2章 理解HTML和XPath
第3章 爬蟲基礎
第4章 從Scrapy到移動應用
第5章 快速構建爬蟲
第6章 Scrapinghub部署
第7章 配置和管理
第8章 Scrapy編程
第9章 使用Pipeline
第10章 理解Scrapy的性能
第11章(完) Scrapyd分布式抓取和實時分析


有人問,移動app開發(fā)平臺Appery.io和Scrapy有什么關系?眼見為實。在幾年前,用Excel向別人展示數(shù)據(jù)才可以讓人印象深刻?,F(xiàn)在,除非你的受眾分布很窄,他們彼此之間是非常不同的。接下來幾頁,你會看到一個快速構建的移動應用,一個最小可行產(chǎn)品。它可以向別人清楚的展示你抓取的數(shù)據(jù)的力量,為源網(wǎng)站搭建的生態(tài)系統(tǒng)帶來回報。

我盡量讓這個挖掘數(shù)據(jù)價值的例子簡短。要是你自己就有一個使用數(shù)據(jù)的應用,你可以跳過本章。本章就是告訴你如何用現(xiàn)在最流行的方式,移動應用,讓你的數(shù)據(jù)面向公眾。

選擇移動應用框架

使用適當?shù)墓ぞ呦蛞苿討脤霐?shù)據(jù)是相當容易的??缙脚_開發(fā)移動應用的框架很多,例如PhoneGap、Appcelerator和Appcelerator云服務、jQuery Mobile和Sencha Touch。

本章會使用Appery.io,因為它可以讓我們用PhoneGap和jQuery Mobile快速開發(fā)iOS、Android、Windows Phone、HTML5移動應用。我并不是要為Appery.io代言,我鼓勵你自己去調(diào)研下它是否符合你的需求。Appery.io是一個付費服務,但有14天的試用期。在我看來,即使是外行也可以用Appery.io快速創(chuàng)建一個應用。我選擇它的原因是,它提供了移動和后端兩個服務,所以我們不用配置數(shù)據(jù)庫、寫REST APIs、或在服務器和移動端使用不同的語言。你將看到,我們根本不用寫任何代碼!我們會使用它的在線工具,你可以隨時下載app作為PhoneGap項目,使用PhoneGap的全部特性。

使用Appery.io,你需要連接網(wǎng)絡。另外,因為它的網(wǎng)站可能會發(fā)生改變,如果和截圖不同不要驚訝。

創(chuàng)建數(shù)據(jù)庫和集合

第一步是注冊Appery.io,并選擇試用。提供名字、Emai密碼之后,你的賬戶就創(chuàng)立了。登錄Appery.io工作臺,你就可以創(chuàng)建數(shù)據(jù)庫和集合了:

步驟如下:
1.點擊Databases標簽(1)。
2.然后點擊綠色的Create new database按鈕(2)。將新數(shù)據(jù)庫命名為scrapy(3)。
3.現(xiàn)在點擊Create按鈕(4)。自動打開Scrapy數(shù)據(jù)庫工作臺,在工作臺上可以新建集合。

在Appery.io中,數(shù)據(jù)庫是集合的整合。粗略的講,一個應用使用一個數(shù)據(jù)庫,這個數(shù)據(jù)庫中有許多集合,例如用戶、特性、信息等等。Appery.io已經(jīng)有了一個Users集合,用來存儲用戶名和密碼(Appery.io有許多內(nèi)建的功能)。

讓我們添加一個用戶,用戶名是root,密碼是pass。顯然,密碼可以更復雜。在側邊欄點擊Users(1),然后點擊+Row(2)添加user/row。在彈出的界面中輸入用戶名和密碼(3,4)。

再為Scrapy抓取的數(shù)據(jù)創(chuàng)建一個集合,命名為properties。點擊Create new collection綠色按鈕(5),命名為properties(6),點擊Add按鈕(7)?,F(xiàn)在,我們需要自定義這個集合。點擊+Col添加列(8)。列有一些數(shù)據(jù)類型可以幫助確認值。大多數(shù)要填入的是字符串,除了價格是個數(shù)字。點擊+Col(8)再添加幾列,填入列的名字(9)、數(shù)據(jù)類型(10),然后點擊Create column按鈕(11)。重復五次這個步驟以創(chuàng)建下表:

創(chuàng)建好所有列之后,就可以導入數(shù)據(jù)了。

用Scrapy導入數(shù)據(jù)

首先,我們需要API key,在Settings中可以找到(1)。復制它(2),然后點擊Collections標簽返回集合(3):

現(xiàn)在,修改一下上一章的代碼,以導入數(shù)據(jù)。我們把名字是easy.py的爬蟲中的代碼復制到名字是tomobile.py的爬蟲中:

$ ls
properties  scrapy.cfg
$ cat properties/spiders/tomobile.py
...
class ToMobileSpider(CrawlSpider):
    name = 'tomobile'
    allowed_domains = ["scrapybook.s3.amazonaws.com"]
    # Start on the first index page
    start_URL = (
        'http://scrapybook.s3.amazonaws.com/properties/'
        'index_00000.html',
    )
...

你可能注意到了,我們沒有使用網(wǎng)絡服務器http://web:9312。我們用的是我托管在http://scrapybook.s3.amazonaws.com上的副本。使用它,我們的圖片和URL所有人都可以訪問,更易分享我們的app。

我們使用Appery.io pipline導入數(shù)據(jù)。Scrapy的pipelines是后處理的、簡潔的、可以存儲items的很小的Python類。第8章中會詳細講解兩者?,F(xiàn)在,你可以用easy_install或pip安裝,但如果你用Vagrant開發(fā)機,因為已經(jīng)都安裝好了,你就不用再安裝了:

$ sudo easy_install -U scrapyapperyio

$ sudo pip install --upgrade scrapyapperyio

這時,要在Scrapy的設置文件中添加API key。更多關于設置的內(nèi)容會在第7章中介紹?,F(xiàn)在,我們只需在在properties/settings.py文件后面加入如下代碼:

ITEM_PIPELINES = {'scrapyapperyio.ApperyIoPipeline': 300}
APPERYIO_DB_ID = '<<Your API KEY here>>'
APPERYIO_USERNAME = 'root'
APPERYIO_PASSWORD = 'pass'
APPERYIO_COLLECTION_NAME = 'properties'

別忘了將APPERYIO_DB_ID替換為API key。還要確認你的設置有和Appery.io相同的用戶名和密碼。要進行向Appery.io注入數(shù)據(jù),像之前一樣用Scrapy抓?。?/p>

$ scrapy crawl tomobile -s CLOSESPIDER_ITEMCOUNT=90
INFO: Scrapy 1.0.3 started (bot: properties)
...
INFO: Enabled item pipelines: ApperyIoPipeline
INFO: Spider opened
...
DEBUG: Crawled (200) <GET https://api.appery.io/rest/1/db/login?username=
root&password=pass>
...
DEBUG: Crawled (200) <POST https://api.appery.io/rest/1/db/collections/
properties>
...
INFO: Dumping Scrapy stats:
  {'downloader/response_count': 215,
   'item_scraped_count': 105,
  ...}
INFO: Spider closed (closespider_itemcount)

輸出的結果略有不用。你可以看到代碼的前幾行運行了ApperyIoPipeline的項目pipeline;更顯著的是,大概抓取了100個項目,有約200個請求/響應。這是因為Appery.io pipeline為寫入每個項目,都額外的做了一次請求。這些請求也出現(xiàn)在日志中,帶有api.appery.io URL。

如果返回Appery.io,我們可以properties集合(1)中填入了數(shù)據(jù)(2)。

創(chuàng)建移動應用

創(chuàng)建移動應用有點繁瑣。點擊Apps標簽(1),然后點擊Create new app(2)。將這個應用命名為properties(3),再點擊Create按鈕(4):

創(chuàng)建數(shù)據(jù)庫接入服務

創(chuàng)建應用的選項很多。使用Appery.io應用編輯器可以編寫復雜應用,但我們的應用力求簡單。讓我們的應用連接Scrapy數(shù)據(jù)庫,點擊CREATE NEW按鈕(5),選擇Datebase Services(6)。彈出一個界面讓我們選擇連接的對象。我們選擇scrapy數(shù)據(jù)庫(7)。點擊properties欄(8),選擇List(9)。這些操作可以讓我們爬到的數(shù)據(jù)可用于數(shù)據(jù)庫。最后點擊Import selected services完成導入(10)。

設定用戶界面
接下來創(chuàng)建app的界面。我們在DESIGN標簽下工作:

在左側欄中點開Pages文件夾(1),然后點擊startScreen(2)。UI編輯器會打開一個頁面,我們在上面添加空間。先修改標題。點擊標題欄,在右側的屬性欄修改標題為Scrapy App。同時,標題欄會更新。

然后,我們添加格柵組件。從左側的控制板中拖動Grid組件(5)。這個組件有兩行,而我們只要一行。選擇這個格柵組件,選中的時候,它在路徑中會變?yōu)榛疑?)。選中之后,在右側的屬性欄中編輯Rows為1,然后點擊Apply(7,8)?,F(xiàn)在,格柵就只有一行了。

最后,再向格柵中拖進一些組件。先在左邊添加一個圖片組件(9),然后在右側添加一個鏈接(10)。最后,在鏈接下添加一個標簽(11)。

排版結束。接下來將數(shù)據(jù)從數(shù)據(jù)庫導入用戶界面。

將數(shù)據(jù)映射到用戶界面

截止目前,我們只是在DESIGN標簽下設置界面。為了連接數(shù)據(jù)和組件,我們切換到DATA標簽(1):


我們用Service(2)作為數(shù)據(jù)源類型,它會自動選擇我們之前建立的唯一可用數(shù)據(jù)。點擊Add按鈕(3)。點擊Add之后,可以在下方看到一系列事件,例如Before send和Success。點擊Success后面的Mapping可以調(diào)用服務,我們現(xiàn)在對它進行設置。

打開Mapping action editor,在上面進行連線。編輯器有兩個部分。左邊是服務的可用響應,右邊是UI組件的屬性。兩邊都有一個Expand all,展開所有的項,以查看可用的。接下來按照下表,用從左到右拖動的方式完成五個映射(5):

映射數(shù)據(jù)字段和用戶組件

前面列表中的數(shù)字可能在你的例子中是不同的,但是因為每種組件的類型都是唯一的,所以連線出錯的可能性很小。通過映射,我們告訴Appery.io當數(shù)據(jù)庫查詢成功時載入數(shù)據(jù)。然后點擊Save and return(6)。

返回DATA標簽。我們需要返回UI編輯器,點擊DESIGN標簽(7)。屏幕下方,你會看到EVENTS區(qū)域(8)被展開了。利用EVENTS,我們讓Appery.io響應UI時間。下面是最后一步,就是加載UI時調(diào)用服務取回數(shù)據(jù)。我們打開startScreen作為組件,事件的默認選項是Load。然后選擇Invoke service作為action,然后用Datasource作為默認的restservice1選項(9)。點擊Save(10),保存這個移動應用。

測試、分享、生成app

現(xiàn)在準備測試app。我們要做的是點擊UI上方的TEST按鈕(1):

這個應用直接在瀏覽器中運行。鏈接(2)是啟動的,可以進行跳轉。你可以設置分辨率和屏幕的橫豎。你還可以點擊View on Phone,創(chuàng)建一個二維碼,用手機掃描,然后在手機上看。你剛剛創(chuàng)建了一個鏈接,別人也可以在他們的瀏覽器中查看。

只需幾次點擊,我們就用一個移動應用展示了Scrapy抓取的數(shù)據(jù)。你可以在這個網(wǎng)頁,http://devcenter.appery.io/tutorials/學習Appery.io教程,繼續(xù)定制這個應用。當你準備好之后,可以點擊EXPORT按鈕輸出這個app:

你可以輸出文檔到你喜愛的IDE繼續(xù)開發(fā),或是生成在各個平臺都能運行的app。

總結

使用Scrapy和Appery.io兩個工具,我們創(chuàng)建了一個爬蟲、抓取了一個網(wǎng)站,并將數(shù)據(jù)存到數(shù)據(jù)庫之中。我們還創(chuàng)建了RESTful API和一個簡單的移動端應用。對于更高級的特點和進一步開發(fā),你可以進一步探究這個平臺,或將這個應用用于實際或科研?,F(xiàn)在,用最少的代碼,你就可以用一個小產(chǎn)品展示網(wǎng)絡抓取的應用了。

鑒于這么短的開發(fā)時間,我們的app就有不錯的效果。它有真實的數(shù)據(jù),而不是Lorem Ipsum占字符,所有的鏈接運行良好。我們成功地制作了一個最小可行產(chǎn)品,它可以融合進源網(wǎng)站的生態(tài),提高流量。

接下來學習在更加復雜的情況下,如何使用Scrapy爬蟲提取信息。


序言
第1章 Scrapy介紹
第2章 理解HTML和XPath
第3章 爬蟲基礎
第4章 從Scrapy到移動應用
第5章 快速構建爬蟲
第6章 Scrapinghub部署
第7章 配置和管理
第8章 Scrapy編程
第9章 使用Pipeline
第10章 理解Scrapy的性能
第11章(完) Scrapyd分布式抓取和實時分析


最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,836評論 6 540
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,275評論 3 428
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,904評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,633評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,368評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,736評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,740評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,919評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,481評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 41,235評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,427評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,968評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,656評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,055評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,348評論 1 294
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,160評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,380評論 2 379

推薦閱讀更多精彩內(nèi)容