V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
Austin2035
V2EX  ›  分享创造

[ Python ] 无聊用 FastApi 框架写了个每日热点接口

  •  
  •   Austin2035 · 2020-01-26 21:53:10 +08:00 · 1330 次点击
    这是一个创建于 1762 天前的主题,其中的信息可能已经有所发展或是发生改变。

    本人大一自动化专业,热爱网络,热爱编程,偶尔写写 python, 躲避疫情,无聊之作....

    我感觉我的博客可能阅读体验好一点: https://www.lookcos.cn/?p=466

    源码 Github https://github.com/LookCos/hot-api

    1.演示网站:

    请求方法,http://cx.lookcos.cn/hot/ 后面加上你想获取的网站名字

    http://cx.lookcos.cn/hot/zhihu 获取知乎热门

    目前 有 weibo、vsite、bsite、tieba、zhihu,可扩展性强。

    2.特点:

    2.1. 多线程,能以迅雷不及掩耳之势完成对任务的抓取;

    2.2. 任务分组进行,有些网站更新频率高(如微博,百度热搜等),而有些网站只需要每天抓取一次;

    2.3. 使用 python3 threading.Timer 模块实现非阻塞定时任务;

    2.4. 使用 FastApi 框架,配合 uvicorn,效率高。

    3.说明:

    3.1 关于启动 写完 fastapi 与 Flask 启动方式不太相同,查阅资料一般是告诉你这样启动。

    uvicorn hotapi:app --reload

    hostapi: 表示 app 所在文件名 app:FastAPI 实例 reload:debug 模式,可以自动重启,相当于 Flask 里面的 debug=Ture 了,你改着代码,它就自动重启一下,当然了,部署应用的时候千万不要带着了。

    默认的端口是 8000,但是我想要 80 怎么办?

    查百度,查谷歌,可能我搜索资料没耐心,也没发现怎么教你,去 fastapi 官方查了一通,全是英文,翻译了一下也没细看。

    基本操作 –help一下…… cmd.png

    直接 uvicorn hotapi:app --reload --port 80 就行了

    无聊用 FastApi 框架写了个每日热点接口

    那么我不想通过命令行来敲这个陌生的命令,我就想 python hotapi.py 一下运行,咋搞?

    也不是没有办法,这也是所谓某些博客文章没有说的。

    if name == 'main':

    uvicorn.run(app=app,
    
    host="0.0.0.0",
    
    port=80)
    

    前提是在开头 import uvicorn 一下

    3.2 关于定时任务: 分组多线程运行爬虫,例如知乎、微博等需要频繁更新的为一组,设置为 每 15 秒更新一次,用 threading.timer 模块实现;

    B 站等日榜,只需要每日更新一次即可,单独列为一组,同样每日运行一次;

    4.启动方法:

    4.1 执行:

    python hotapi.py

    4.2 也可以在命令行执行: uvicorn hotapi:app --port 80

    5.数据格式与相应速度

    数据格式 avatar

    响应速度均在 30ms 以内,毕竟是提前抓取好的数据直接调用,看图。

    avatar

    avatar

    10 条回复    2020-01-27 13:40:26 +08:00
    wzw
        1
    wzw  
       2020-01-26 23:57:36 +08:00 via iPhone
    Fastapi 代码结构有好模版没
    Trim21
        2
    Trim21  
       2020-01-27 00:02:08 +08:00 via Android
    @wzw fastapi 的作者有一个模板项目
    wzw
        3
    wzw  
       2020-01-27 00:02:32 +08:00 via iPhone
    @Trim21 哪个?
    Trim21
        4
    Trim21  
       2020-01-27 00:06:39 +08:00 via Android
    @wzw full stack fastapi 什么的,用的是 pipenv,并且开发环境也是跑在 docker 里面的。这俩正好我都不喜欢,所以我只参考了后端的代码结构没,没用他的模板初始化项目…
    Trim21
        5
    Trim21  
       2020-01-27 00:10:18 +08:00 via Android
    启动服务器的方式,uvicorn 的建议是用 gunicorn,然后结合 uvicorn 提供的 worker class 来部署的。

    uvicorn app --reload 是开发模式用的
    dcalsky
        6
    dcalsky  
       2020-01-27 03:42:11 +08:00
    爬到的数据全放内存里不太好吧,最好找个数据库存一下,然后做个增量更新。
    Austin2035
        7
    Austin2035  
    OP
       2020-01-27 09:14:56 +08:00
    @dcalsky 考虑过这个问题,不过这点文本信息比较小,放到数据库里面还得部署数据库,个人认为就有点多余了。
    Lax
        8
    Lax  
       2020-01-27 09:38:22 +08:00
    @lookcos #7 sqlite 之类的就好了,不用额外部署。甚至可以直接存 JSON 文件
    kasusa
        9
    kasusa  
       2020-01-27 12:53:21 +08:00
    https://github.com/LookCos/spider-taotu
    我感觉你这个不是妹子图是色图……
    Austin2035
        10
    Austin2035  
    OP
       2020-01-27 13:40:26 +08:00
    @kasusa 没有露点啊 哈哈哈
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2649 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 11:30 · PVG 19:30 · LAX 03:30 · JFK 06:30
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.