内容纲要
检察长大人镇楼
概述
几年前我就用 python 写过一版 instagram 爬虫,当时能做到下载我收藏的图片到本机。后来某天不能用了,调试后发现是 instagram 修改了登录接口的数据格式,导致爬虫无法登录,也就不能下载图片了
最近我在 github 上找了几个 instagram 爬虫的代码,很幸运的在 instaloader 里找到了登录 instagram 的正确数据格式,基于在个人博客上展示的需求,重新开发了爬虫
instagram 爬取流程
- 访问 instagram 首页
- 从 首页的 html 代码,或者 cookie 里获取
csrf token
- 访问登录接口,需要把上个步骤得到的
csrf token
作为header
参数发送到接口,登录成功会得到用户的user_id
,后续接口需要user_id
作为参数 - 获取收藏夹首页,该接口会返回
12
个最近的收藏,同时还会返回是否有下一页
,下一页的游标
- 循环访问收藏夹下一页,直到返回结果里的
是否有下一页=False
- 此时已经得到了所有的收藏,每个收藏都有一个唯一的
shortcode
,接下来就是基于这个shortcode
获取对应的媒体,包括 jpg 图片 和 mp4 视频- 用户在 instagram 投稿时,可以一次上传一个图片/视频,也可以一次上传多个图片和视频,所以收藏夹里的每个
shortcode
都可能对应着多个图片/视频
- 用户在 instagram 投稿时,可以一次上传一个图片/视频,也可以一次上传多个图片和视频,所以收藏夹里的每个
- 有两种方式可以获得
shortcode
包含的媒体信息- 访问帖子详情页面,该页面里有一段 js 代码,包含了这个
shortcode
所包含的全部媒体信息 - 访问一个接口,该接口以 json 格式返回了这个
shortcode
包含的全部媒体信息
- 访问帖子详情页面,该页面里有一段 js 代码,包含了这个
- 得到
shortcode
包含的全部媒体信息后,下载媒体文件 - 把下载的媒体文件存储到我的 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 图片