用 python 爬取 instagram 图片

内容纲要

检察长大人镇楼

检察长大人

检察长大人 ins 传送门

概述

几年前我就用 python 写过一版 instagram 爬虫,当时能做到下载我收藏的图片到本机。后来某天不能用了,调试后发现是 instagram 修改了登录接口的数据格式,导致爬虫无法登录,也就不能下载图片了

最近我在 github 上找了几个 instagram 爬虫的代码,很幸运的在 instaloader 里找到了登录 instagram 的正确数据格式,基于在个人博客上展示的需求,重新开发了爬虫

instagram 爬取流程

  1. 访问 instagram 首页
  2. 从 首页的 html 代码,或者 cookie 里获取 csrf token
  3. 访问登录接口,需要把上个步骤得到的 csrf token 作为 header 参数发送到接口,登录成功会得到用户的 user_id,后续接口需要 user_id 作为参数
  4. 获取收藏夹首页,该接口会返回 12 个最近的收藏,同时还会返回 是否有下一页下一页的游标
  5. 循环访问收藏夹下一页,直到返回结果里的 是否有下一页=False
  6. 此时已经得到了所有的收藏,每个收藏都有一个唯一的 shortcode,接下来就是基于这个 shortcode 获取对应的媒体,包括 jpg 图片 和 mp4 视频
    • 用户在 instagram 投稿时,可以一次上传一个图片/视频,也可以一次上传多个图片和视频,所以收藏夹里的每个 shortcode 都可能对应着多个图片/视频
  7. 有两种方式可以获得 shortcode 包含的媒体信息
    • 访问帖子详情页面,该页面里有一段 js 代码,包含了这个 shortcode 所包含的全部媒体信息
    • 访问一个接口,该接口以 json 格式返回了这个 shortcode 包含的全部媒体信息
  8. 得到 shortcode 包含的全部媒体信息后,下载媒体文件
  9. 把下载的媒体文件存储到我的 OSS 上,如果是图片的话,还会生成一个 280 像素宽度的缩略图存储到 OSS

注意:instagram 会监控用户的行为,如果你的两次访问之间间隔太快,或者调用接口次数太多,会冻结你的访问,此时接口会返回 429 状态码,大概要等 24 小时才会解冻
我的解决方案是在两次访问之间随机休眠 2——4 秒,而且每 15 次访问额外休眠 60——90 秒,这样触发冻结的概率比较小

爬虫代码

美图欣赏

NataLee:360 度无死角,完美的性感女神


makenzie_raine: 青春洋溢,美少女


theanastasiah: hotter than your ex better than your next, 很符合国人审美的俄罗斯模特


nicolaca_: YOU NEVER LOSE. EITHER YOU WIN or YOU LEARN. 来自德国的模特


realbarbarapalvin: 维密超模

用 python 爬取 instagram 图片

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

Scroll to top
粤ICP备2020114259号 粤公网安备44030402004258