爬虫实战 --- 爬取Ins新数据接口

4,312 阅读3分钟

之前写过一个文章,介绍爬取ins数据,但是最近ins接口更新了,也更简单了,干脆重写一篇。

本人之文章仅为了分享技术,对于您使用该文章中的技术造成的后果请自负。技术无罪,与我无关。

ins接口简析

最近连着做了好几个项目,都利用了ins的数据,总结一下,ins的基本接口类型。

ins的网站是一个基于React的ssr,所以为了更快的渲染界面,它们提前从服务器请求了数据,加载到页面中,变量名为 window._shareData,这是第一类接口,这类接口大部分都只需要直接get相应页面,然后找到这个变量即可。

第二类接口是JSON API,直接返回json的,这类接口对于web开放的比较少,大部分都在其官方api中,需要key才能使用。 目前已知的web可以用的就2个。

爬取第一类接口

首先打开某个人的ins主页,F12打开控制台查看元素,可以很显然的看见一行代码

从字面意思上就能看到这是加载一个初始化的数据,再点击console,敲入window._sharedData,就能看见具体数据了。
PS.从这里可以看出ins还是蛮欢迎大家使用它的数据的嘛

因此,我这里提供一种我现在用的方法

export function getShareData(str){
    return JSON.parse(str.match(/(window._sharedData\s?)(=\s?)(.*?);<\/script>/)[3]),
}

爬取第二类接口

  • 分页接口

如果你看一下首页的shareData,你会发现里面只有12张图片,这当然是不够的,咱们把页面再往下拉,然后把控制台打开network. 你会看见一个loading,network里出现一个query请求

点击旁边的preview,能看出来这里继续返回了12条记录
下来就是咱们去找query请求对应的参数了
具体过程不再赘述,就是在sources页面里每个js文件中去找queryHash,最后发现在https://www.instagram.com/static/bundles/es6/ProfilePageContainer.js/229d3e1a78c4.js这个文件中,显然最后那个js文件名是随机的,有可能根据地址,ip等变化。因此我们只需要找准关键字ProfilePageContainer就行。

//str是请求首页时返回的html字符串
export function getProfilePageContainerURL(str,type='profile'){
  let reg=''
    if(type==='profile'){
       reg=/<script.*src="(.*ProfilePageContainer.*)".*<\/script>/
    }else{
      reg=/<script.*src="(.*TagPageContainer.*)".*<\/script>/
    }
    return 'https://www.instagram.com'+str.match(reg)[1].split('"')[0]
}

这样就找到了这个文件地址,照例get一下然后我这里通过一个递归去获取所有queryId

//调用方法:getQueryHashByScript(res,'queryId')
//res是get那个script返回的内容
export function getQueryHashByScript(str,word,arr=[]){
    let i=0,str2='',key=''
    i=str.indexOf(word)  
    if(i>-1){
        key=str.substr(i+9,32)
        arr.push(key)
        str2=str.substring(i+42)  
        return getQueryHashByScript(str2,word,arr)
    }else{
        return arr
    }
}

找到queryId后,大家就可以按照格式请请求相应的query接口了

其中,id就是这个用户的ins ID,first是下一页的条数,一般默认12即可,after则是end_cursor,都是在shareData中可以找到的。

剩下了的就是直接请求了。

  • 帖子详情接口

这个接口是通过帖子的shortcode获取帖子详情的,具体的地址https://www.instagram.com/${username}/p/${shortCode}/?__a=1直接get请求即可。

目前来看,web能用的接口也就这么多了,剩下了的接口属于instagram api的都是需要key的。大家发现什么新接口也可以一起交流。

为了培养一下大家的动手能力,我特意留了一个伏笔,就是ins的hashtag接口,大家应该能猜到的吧,动手实践一下吧

2019-11更新,目前发现用户首页也能直接get了,接口如下https://www.instagram.com/${username}/?__a=1