序言
第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分布式抓取和實時分析