爬取簡書全站文章并生成 API(三)

簡書

前兩節(jié)介紹了從分析網(wǎng)頁源碼到爬取文章并將其保存在 MySQL 中的過程虏束,如有不明白的肩祥,請務(wù)必看完前幾節(jié)的介紹:

本節(jié)將介紹 API 的生成

Django 有自己的 Django REST framework 框架可以直接生成 API蝠嘉,在 Django 中生成 API 從復(fù)雜到簡單有以下幾種方式:

  • 使用 Serializer 編寫 API:使用 Serializer 類來編寫 API 視圖摊崭,這里我們不使用任何 REST framewrok 的其他特性忠荞,僅使用 Django 的常規(guī)方法編寫視圖钉稍。

  • 使用基于函數(shù)視圖的 @api_view 重構(gòu)代碼:類視圖中的裝飾器提供了少許功能拾弃,比如確保在視圖中接收 Request 實例烁设,添加 contextResonse 對象來決定返回類型鄙早。

  • 使用類視圖重寫 API :更清晰的分離了 HTTP 的請求方法哨毁,將 method 封裝成了函數(shù)枫甲,不再需要使用 if 進(jìn)行判斷。

  • 使用 Mixins 重構(gòu)代碼:mixin 類則提供了 list()ctreae() 等行為扼褪,會顯式綁定 GET 方法和 POST 方法對應(yīng)的功能想幻。

  • 使用類的通用視圖重構(gòu)代碼:讓代碼更簡潔。

  • 使用 ViewSetsRouters 重構(gòu)代碼:REST framework 提供了一種叫做 ViewSets 的抽象行為话浇,它可以使開發(fā)人員聚焦于 API 的狀態(tài)和實現(xiàn)脏毯,通過使用 Router 類來自動生成 URL 配置信息。

我使用的是 ViewSetsRouters 的方法幔崖,當(dāng)然食店,這也是最常用的渣淤。以下是生成 API 的幾個步驟:

  • 編寫 models:存儲數(shù)據(jù)使用的字段

  • 編寫需要進(jìn)行序列化的字段:將字段序列化為 JSON 的形式輸出

  • 編寫 views:對數(shù)據(jù)進(jìn)行的各種存取操作

  • 編寫 URL:訪問 API 所使用的 URL

models 在上一節(jié)中已經(jīng)寫好,此處不再贅述吉嫩。

編寫需要進(jìn)行序列化的字段

jianshu 目錄下創(chuàng)建 serializers.py 文件,對應(yīng)的目錄結(jié)構(gòu)如下所示:

目錄樹

創(chuàng)建 serializers 和創(chuàng)建 Django 表單類似价认,Django 提供了 Form 類和 ModelForm 類,同樣的自娩,REST framework 提供了 Serializer 類和 ModelSerializer用踩。

#!/usr/bin/env python
# coding:utf-8

from models import ArticleList, ArticleDetail, HotArticle, SearchArticle
from rest_framework import serializers

class ArticleListSerializer(serializers.ModelSerializer):
    """
        新上榜文章列表
    """
    class Meta:
        model = ArticleList
        fields = ('article_id', 'article_title', 'article_url', 'article_user', 'article_user_url') 

class ArticleDetailSerializer(serializers.ModelSerializer): 
    """
        新上榜文章詳細(xì)信息
    """
    class Meta:
        model = ArticleDetail 
        fields = ('image', 'title', 'body', 'time', 'views_count', 'public_comments_count', 'likes_count', 'total_rewards_count', 'article_abstract')

class HotArticleSerializer(serializers.ModelSerializer): 
    """
        熱門文章詳細(xì)信息
    """
    class Meta:
        model = HotArticle
        fields = ('article_id', 'article_url', 'article_user', 'article_user_url', 'article_image', 'article_title', 'article_body', 'article_time', 'article_views_count', 'public_comments_count', 'article_likes_count', 'total_rewards_count' )

編寫 views

views 中使用 rest_framework 提供的 ViewSet 類,它提供了 read 以及 update 等操作忙迁。ViewSet 僅在被調(diào)用的時候才會和對應(yīng)的方法進(jìn)行綁定脐彩,當(dāng)它被實例化時通常是在使用 Route 類管理 URL 配置的時候。

#coding:utf-8

from rest_framework import viewsets
from jianshu.serializers import ArticleListSerializer, ArticleDetailSerializer, HotArticleSerializer, SearchArticleSerializer
from jianshu.models import ArticleList, ArticleDetail, HotArticle, SearchArticle


class ArticleListViewSet(viewsets.ReadOnlyModelViewSet):
    """
        新上榜文章列表
    """
    queryset = ArticleList.objects.all().order_by("-created")[:18]
    serializer_class = ArticleListSerializer

class ArticleDetailViewSet(viewsets.ReadOnlyModelViewSet):
    """
        新上榜文章詳細(xì)信息
    """
    queryset = ArticleDetail.objects.all().order_by("-created")[:18]
    serializer_class = ArticleDetailSerializer

class HotArticleViewSet(viewsets.ReadOnlyModelViewSet):
    """
        熱門文章詳細(xì)信息
    """
    queryset = HotArticle.objects.all().order_by("-created")[:18]
    serializer_class = HotArticleSerializer

ReadOnlyModelViewSet 自動提供了“只讀”方法姊扔,然后按時間排序取出數(shù)據(jù)庫中相應(yīng)數(shù)量的文章惠奸。

編寫 URL

使用 Router 類可以自動生成 URL,我們需要做的僅僅是正確的注冊 ViewRouter 中:

from rest_framework.routers import DefaultRouter
from jianshu import views


router = DefaultRouter()
router.register(r'article_news_list', views.ArticleListViewSet)
router.register(r'article_news_detail', views.ArticleDetailViewSet)
router.register(r'hot_article', views.HotArticleViewSet)

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^', include(router.urls)),
]

測試

啟動服務(wù):

# python  manage.py runserver 222.24.63.118:8080

在瀏覽器中訪問:

簡書 API
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末恰梢,一起剝皮案震驚了整個濱河市佛南,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌删豺,老刑警劉巖共虑,帶你破解...
    沈念sama閱讀 212,454評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件愧怜,死亡現(xiàn)場離奇詭異呀页,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)拥坛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評論 3 385
  • 文/潘曉璐 我一進(jìn)店門蓬蝶,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人猜惋,你說我怎么就攤上這事丸氛。” “怎么了著摔?”我有些...
    開封第一講書人閱讀 157,921評論 0 348
  • 文/不壞的土叔 我叫張陵缓窜,是天一觀的道長。 經(jīng)常有香客問我谍咆,道長禾锤,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,648評論 1 284
  • 正文 為了忘掉前任摹察,我火速辦了婚禮恩掷,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘供嚎。我一直安慰自己黄娘,他們只是感情好峭状,可當(dāng)我...
    茶點故事閱讀 65,770評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著逼争,像睡著了一般优床。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上誓焦,一...
    開封第一講書人閱讀 49,950評論 1 291
  • 那天羔巢,我揣著相機(jī)與錄音,去河邊找鬼罩阵。 笑死竿秆,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的稿壁。 我是一名探鬼主播幽钢,決...
    沈念sama閱讀 39,090評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼傅是!你這毒婦竟也來了匪燕?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,817評論 0 268
  • 序言:老撾萬榮一對情侶失蹤喧笔,失蹤者是張志新(化名)和其女友劉穎帽驯,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體书闸,經(jīng)...
    沈念sama閱讀 44,275評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡尼变,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,592評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了浆劲。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片嫌术。...
    茶點故事閱讀 38,724評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖牌借,靈堂內(nèi)的尸體忽然破棺而出度气,到底是詐尸還是另有隱情,我是刑警寧澤膨报,帶...
    沈念sama閱讀 34,409評論 4 333
  • 正文 年R本政府宣布磷籍,位于F島的核電站,受9級特大地震影響现柠,放射性物質(zhì)發(fā)生泄漏院领。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,052評論 3 316
  • 文/蒙蒙 一晒旅、第九天 我趴在偏房一處隱蔽的房頂上張望栅盲。 院中可真熱鬧,春花似錦废恋、人聲如沸谈秫。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽拟烫。三九已至该编,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間硕淑,已是汗流浹背课竣。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留置媳,地道東北人于樟。 一個月前我還...
    沈念sama閱讀 46,503評論 2 361
  • 正文 我出身青樓,卻偏偏與公主長得像拇囊,于是被迫代替她去往敵國和親迂曲。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,627評論 2 350

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

  • 簡書中的優(yōu)質(zhì)文章非常多寥袭,而且我非常喜歡 Markdown 這種語法格式路捧,所以想著能不能爬取簡書上面的文章,爬取文章...
    田飛雨閱讀 11,169評論 16 133
  • Django: csrf防御機(jī)制 csrf攻擊過程 1.用戶C打開瀏覽器传黄,訪問受信任網(wǎng)站A杰扫,輸入用戶名和密碼請求登...
    lijun_m閱讀 1,055評論 0 0
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)膘掰,斷路器章姓,智...
    卡卡羅2017閱讀 134,637評論 18 139
  • 12 構(gòu)建API 在上一章中,你構(gòu)建了一個學(xué)生注冊和課程報名系統(tǒng)炭序。你創(chuàng)建了顯示課程內(nèi)容的視圖啤覆,并學(xué)習(xí)了如何使用Dj...
    lakerszhy閱讀 2,574評論 0 6
  • # Python 資源大全中文版 我想很多程序員應(yīng)該記得 GitHub 上有一個 Awesome - XXX 系列...
    aimaile閱讀 26,454評論 6 428