Python爬蟲:十分鐘實現從資料抓取到資料API提供
阿新 • • 發佈:2019-01-01
依舊先從爬蟲的基本概念說起,你去做爬蟲做資料抓取,第一件事想必是去檢視目標網站是否有api。有且可以使用的話,皆大歡喜。
假如目標網站自身不提供api,但今天你心情不好就想用api來抓資料,那怎麼辦。有個長者說,沒api創造api也要上,所以,那就創造api吧~
關於Toapi
很多時候你需要經歷抓取資料->儲存資料->構建API的基本步驟,然後在去定時更新資料。然而你的目的並不是想去學習搭建穩定可靠自動更新的API服務,你只是想用這個網站的資料而已。Toapi就是為此實現,可以自動化的完成前述任務,達到使用網站實時資料的目的。
先看效果圖http://gk.chengdu.gov.cn/govInfoPub/list.action?classId=07170201020202&tn=2&p=1
如你所見,Toapi會讓資料變成一塊蛋糕,你只需要將它切下來吃了(雖然中文的顯示是unicode)。那麼話不多說,看程式碼。
from toapi import XPath, Item, Api
from toapi import Settings
class MySettings(Settings):
web = {
# 是否需要使用phantomjs載入
"with_ajax": False
}
# 需要構建api的目標網址
api = Api('http://gk.chengdu.gov.cn/govInfoPub/' , settings = MySettings)
class Post(Item):
# api服務返回json的欄位:網頁上欄位所對應Xpath
# 這裡Xpath是用列表識別自動識別的 可以看我以前的文章
url = XPath('/html/body/div[2]/div/div[3]//a/@href')
title = XPath('/html/body/div[2]/div/div[3]//a/span[2]/text()')
class Meta:
# source :包含單個數據結構的HTML部分。
source = XPath('/html' )
# 一個正則表示式,定義API服務的路徑。理解成flask中路由就好了
route = {"/test?page=:page":"list.action?classId=07170201020202&tn=2&p=:page"}
# 註冊該服務
api.register(Post)
#執行伺服器
api.serve()
# Visit: http://127.0.0.1:5000/
滿打滿算10行程式碼吧,你就可以實現資料的api,心動不如行動還不給我打錢,啊呸,不好意思,串場了。下面還是解釋下上面的程式碼。希望對你有幫助。
對了對了,你寫這些程式碼不用十分鐘吧,不要算我標題黨。
- 安裝:
pip install toapi
- Toapi基於flask,希望這點有助於理解框架的執行。
- Toapi僅支援python3,這點非常遺憾,但是你一定會python3.
- Item.Meta.route:支援正則。上面說了等同於flask中路由解析。其中上述程式碼中使用
:page
進行翻頁。也就是說Key中的:xx
於value中的:xx
值保持一致,藉此實現翻頁效果。 - Item.Meta.source:包含單個數據結構的HTML部分(你可以精確到比如
source = XPath('//div[@id='xxx']')
)。 - api.register():註冊服務準確的說是註冊路由。
- api.server():執行一個伺服器,提供API服務。