1. 程式人生 > >Python爬蟲:十分鐘實現從資料抓取到資料API提供

Python爬蟲:十分鐘實現從資料抓取到資料API提供

  依舊先從爬蟲的基本概念說起,你去做爬蟲做資料抓取,第一件事想必是去檢視目標網站是否有api。有且可以使用的話,皆大歡喜。
  假如目標網站自身不提供api,但今天你心情不好就想用api來抓資料,那怎麼辦。有個長者說,沒api創造api也要上,所以,那就創造api吧~

關於Toapi

  很多時候你需要經歷抓取資料->儲存資料->構建API的基本步驟,然後在去定時更新資料。然而你的目的並不是想去學習搭建穩定可靠自動更新的API服務,你只是想用這個網站的資料而已。Toapi就是為此實現,可以自動化的完成前述任務,達到使用網站實時資料的目的。
  先看效果圖http://gk.chengdu.gov.cn/govInfoPub/list.action?classId=07170201020202&tn=2&p=1

(這個網站是沒有api的喲)手機點進去可能沒有資料,用pc端瀏覽器就好。
api效果圖
  如你所見,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服務。