Skip to content

实战:爬虫每日日报

笔者认为爬虫是自己至今没有尝试的领域,想做一版与爬虫相关的实战,于是就有了每日日报这一实战

笔者的想法是爬知乎的每天60秒读懂世界 ,网易的365资讯简报,readhub 的 每日早报。然后整合在一起。这一想法主要参考了每日60秒读懂世界-文字版前后端均基于 vercel 的每日早报项目

使用技术栈:

typescript 、node serverless、vercel

正文

这样就能让 serverless 下载依赖,如此就能运行自己的爬虫代码

笔者后续改成了 typescript,安装依赖

bash
pnpm i typescript @vercel/node

创建 tsconfig.json

json
{
  "compilerOptions": {
    "target": "ESNext",
    "module": "CommonJS",
    "outDir": "dist",
    "strict": true,
    "esModuleInterop": true
  }
}

新建 api 文件夹,并在其中新建 hello.ts 文件

bash
import type { VercelRequest, VercelResponse } from "@vercel/node";

export default function (request: VercelRequest, response: VercelResponse) {
  const { name = "World" } = request.query;
  response.send(`Hello ${name}!`);
}

启动 vercel ,将其部署到线上

接着本地调试 vercel dev,如果走的通就部署到线上

  • vercel dev:本地调试
  • vercel:预览部署到预览线上
  • vercel --prod:部署到真正的线上

具体的爬虫代码,其实就是通过 cheerio 进行 API 操作

JS 版本

笔者最开始用 Javascript 来写代码,写完后部署上后,报错

服务报错

笔者查了下 log,报错信息:Error [ERR_MODULE_NOT_FOUND]: Cannot find module 'axios' ...

原因是node serverless 最开始的时候没有下载 axios 等依赖包,只要在 build 中加上即可:

{
  "build": {
    "command": "npm install",
    "src": "api",
    "use": "@vercel/node"
  }
}

报错信息:不能用import fetchNews from "../news/zhihu"; ,需要给它加上文件后缀,即import fetchNews from "../news/zhihu.js";

写在最后

笔者做这个项目的原因是为了学习node 爬虫,并在 vercel 部署 node serverless 而已

项目地址:https://github.com/johanazhu/readhub-api

预览地址:https://news-xi-ten.vercel.app/api

参考资料