logo科技微讯

爬取微博的 API

作者:科技微讯
日期:2021-08-05
📝 笔记

下面这条 url 可以获取指定用户最近发布的微博,count 指定获取多少条微博,uid 就是用户 id。

const api = `https://weibo.com/ajax/statuses/mymblog?uid=${uid}&count=${count}&page=${page}`;

不过大家都建议爬移动端 m.weibo.cn。获取某位用户最新的微博:

const count = 5;
const page = 1;
const uid = "2106855375";
const url = `https://m.weibo.cn/api/container/getIndex?uid=${uid}&t=0&luicode=10000011&containerid=107603${uid}&page=${page}&count=${count}`;
//https://m.weibo.cn/api/container/getIndex?uid=1729382834&t=0&luicode=10000011&containerid=1076031729382834&page=1&count=5

其中 107603 是特殊的数字,如果换成 100505 可以只获取这位用户的 userinfo,例如:

const uid = "2106855375";
const url = `https://m.weibo.cn/api/container/getIndex?containerid=100505${uid}`;

有人分享了这个 api 的限制

限制还是有的,如果不登陆直接请求,短时间会出现 403,加上 Cookies 会解决 403 问题,小规模单机单 job 爬取没问题,如果增加 job 数,每秒达到约 10 次左右会出现 414,此时需要切换代理解决。

获取用户最新微博的 API 返回的关键字段:

  • ok:1 表示成功,0 表示没有内容,可能是 uid 输错了;
  • data:除了 ok 就是 data,所有数据在 data;
  • data.cards:几乎所有 data 在 cards;
  • cards 是一个数组,card_type 为 11 表示标签,为 9 表示微博,为 1 表示可能感兴趣的人,11 表示粉丝群;
  • card.mblog.mblogtype 为 2 表示原创置顶?为 0 表示普通原创微博?为 1 表示热门原创?
  • 我发现 count=1 时,可能会获得多个 card,这里的 1 只是最新的那条微博的 card,除了这个 card,可能还会有 card_type 为 11、1、11 的 card,这些 card 不计入 count 中,另外置顶微博可能也不算入 count 中,也许这条置顶微博也是最新微博才会算入;
  • card.mblog.page_info.type 为 video 表示包含视频,为 search_topic 表示含有标签,
  • 根据 card.mblog.isLongText 判断是不是长微博;
  • 根据 card.mblog.retweeted_status 判断是不是转发;
  • 根据 mid 可以在微博小程序查看这条微博;
  • 获取博主昵称,可以找出第一个 9 类型的 card,然后 mblog.user.screen_name
  • card.mblog.page_info.type 有 video、topic(超话)、search_topic、webpage(例如绿洲推广横幅)、wenda,需要注意不是所有微博都有 page_info,page_info 是微博中的一块特定区域特定信息;
  • 任何一条微博的唯一 id:mblog.id 或者 mblog.mid,拿到 uid 和 mid 就可以访问这条微博,例如
  • 文字 + 图片的微博,可以通过 card.mblog.text 获取文字,通过 card.mblog.pics 获取图片,pics 是一个数组,每个元素包含大小两个尺寸的图片信息,文字如果显示可直接访问这条微博的链接(看上一条说明)提取;
  • 文字 + 视频的微博,可以通过 page_info.page_pic.url 获取视频封面图;
donation赞赏
thumbsup0
thumbsdown0
暂无评论