爬取简书全站文章并生成 API(三)
admin
2023-07-30 21:45:39
0


简书

前两节介绍了从分析网页源码到爬取文章并将其保存在 MySQL 中的过程,如有不明白的,请务必看完前几节的介绍:

  • 爬取简书全站文章并生成 API(一)

  • 爬取简书全站文章并生成 API(二)

  • 爬取简书全站文章并生成 API(四)

  • 爬取简书全站文章并生成 API(五)

  • 简书 API 测试地址 : http://222.24.63.118:8080/

  • github 项目地址:https://github.com/strugglingyouth/jianshu/

本节将介绍 API 的生成

Django 有自己的 Django REST framework 框架可以直接生成 API,在 Django 中生成 API 从复杂到简单有以下几种方式:

  • 使用 Serializer 编写 API:使用 Serializer 类来编写 API 视图,这里我们不使用任何 REST framewrok 的其他特性,仅使用 Django 的常规方法编写视图。

  • 使用基于函数视图的 @api_view 重构代码:类视图中的装饰器提供了少许功能,比如确保在视图中接收 Request 实例,添加 contextResonse 对象来决定返回类型。

  • 使用类视图重写 API :更清晰的分离了 HTTP 的请求方法,将 method 封装成了函数,不再需要使用 if 进行判断。

  • 使用 Mixins 重构代码:mixin 类则提供了 list()ctreae() 等行为,会显式绑定 GET 方法和 POST 方法对应的功能。

  • 使用类的通用视图重构代码:让代码更简洁。

  • 使用 ViewSetsRouters 重构代码:REST framework 提供了一种叫做 ViewSets 的抽象行为,它可以使开发人员聚焦于 API 的状态和实现,通过使用 Router 类来自动生成 URL 配置信息。

我使用的是 ViewSetsRouters 的方法,当然,这也是最常用的。以下是生成 API 的几个步骤:

  • 编写 models:存储数据使用的字段

  • 编写需要进行序列化的字段:将字段序列化为 JSON 的形式输出

  • 编写 views:对数据进行的各种存取操作

  • 编写 URL:访问 API 所使用的 URL

models 在上一节中已经写好,此处不再赘述。

编写需要进行序列化的字段

jianshu 目录下创建 serializers.py 文件,对应的目录结构如下所示:


目录树

创建 serializers 和创建 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): 
    \"\"\"
        新上榜文章详细信息
    \"\"\"
    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): 
    \"\"\"
        热门文章详细信息
    \"\"\"
    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 仅在被调用的时候才会和对应的方法进行绑定,当它被实例化时通常是在使用 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):
    \"\"\"
        新上榜文章详细信息
    \"\"\"
    queryset = ArticleDetail.objects.all().order_by(\"-created\")[:18]
    serializer_class = ArticleDetailSerializer

class HotArticleViewSet(viewsets.ReadOnlyModelViewSet):
    \"\"\"
        热门文章详细信息
    \"\"\"
    queryset = HotArticle.objects.all().order_by(\"-created\")[:18]
    serializer_class = HotArticleSerializer

ReadOnlyModelViewSet 自动提供了“只读”方法,然后按时间排序取出数据库中相应数量的文章。

编写 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)),
]

测试

启动服务:

# python  manage.py runserver 222.24.63.118:8080

在浏览器中访问:


简书 API

相关内容

热门资讯

Mobi、epub格式电子书如... 在wps里全局设置里有一个文件关联,打开,勾选电子书文件选项就可以了。
500 行 Python 代码... 语法分析器描述了一个句子的语法结构,用来帮助其他的应用进行推理。自然语言引入了很多意外的歧义,以我们...
定时清理删除C:\Progra... C:\Program Files (x86)下面很多scoped_dir开头的文件夹 写个批处理 定...
scoped_dir32_70... 一台虚拟机C盘总是莫名奇妙的空间用完,导致很多软件没法再运行。经过仔细检查发现是C:\Program...
65536是2的几次方 计算2... 65536是2的16次方:65536=2⁶ 65536是256的2次方:65536=256 6553...
小程序支付时提示:appid和... [Q]小程序支付时提示:appid和mch_id不匹配 [A]小程序和微信支付没有进行关联,访问“小...
pycparser 是一个用... `pycparser` 是一个用 Python 编写的 C 语言解析器。它可以用来解析 C 代码并构...
微信小程序使用slider实现... 众所周知哈,微信小程序里面的音频播放是没有进度条的,但最近有个项目呢,客户要求音频要有进度条控制,所...
Apache Doris 2.... 亲爱的社区小伙伴们,我们很高兴地向大家宣布,Apache Doris 2.0.0 版本已于...
python清除字符串里非数字... 本文实例讲述了python清除字符串里非数字字符的方法。分享给大家供大家参考。具体如下: impor...