instagram爬虫记录
in 默认分类 with 0 comment

instagram爬虫记录

in 默认分类 with 0 comment

目标

根据关键词爬取用户信息,并将1000粉丝以上的用户存入数据库。

思路

爬虫实际上就是利用程序按照一定的URL规律去访问页面,并从页面中解析出有用的数据。
关键词页面是一个照片列表,但是无用户信息,打开图片的详情后才有用户的信息。所以如果想爬取用户信息,访问的路径为

关键词搜索页 -> 照片详情页 -> 用户主页

实现

关键词搜索页

hkmodel关键词为例子,链接:instagram搜索页
可以看到搜索页的内容都是照片,分页是通过页面滚动到一定的高度后自动加载的。
打开浏览器开发者工具的Network窗口,滚动窗口让页面自动加载下一页,可以拿到加载照片列表的接口地址:
接口地址.png

拿到接口地址,由于地址通过URL编码过,所以我们需要去解码转成能看懂的URL链接,解码后链接如下:

https://www.instagram.com/graphql/query/?query_hash=174a5243287c5f3a7de741089750ab3b&variables={"tag_name":"hkmodel","first":7,"after":"QVFEeU9UMFpSYmFBNlBpRnZzVnVlWWtDX3Y0d0RLd1luQlBqRXZ6Y2JLcWhkYllCYjNSWHVYLVR2VXlCUGdIODBxbzlYWUU4OXVfb0FRTEQxQlMxNXM1Yg=="}

可以看到有两个参数,分别是query_hashvariables

query_hash

这个参数是利用关键词进行某种加密算法生成的,因为从翻页的过程中可以发现,每一页的这个参数都是一样的,一旦换个关键词搜索这个参数就会发生改变。这里我们不需要关心这个是如何生成的,因为我们已经拿到了。

variables

这个参数的值是一个json对象

{"tag_name":"hkmodel","first":7,"after":"QVFEeU9UMFpSYmFBNlBpRnZzVnVlWWtDX3Y0d0RLd1luQlBqRXZ6Y2JLcWhkYllCYjNSWHVYLVR2VXlCUGdIODBxbzlYWUU4OXVfb0FRTEQxQlMxNXM1Yg=="}

里面有三个参数,对三个参数逐个分析后可以得到:

tag_name:关键词。

first:没找到有什么特别的规律,但是无论哪个接口,这个属性的值都是数字,所以应该只一是随机数。

after:这个参数从名字中大致可以分析出,instagram的搜索页面的分页逻辑,是利用照片发布时间倒叙,这个after指明了上一页加载到了哪张照片,在下一页中这个参数可以作为列表的分割线,以保证分页过程中不会重复加载同一张照片。

所以我们把重点放在after参数上,利用上面的思路,检查前一页接口返回的数据里是否包含后一页接口的请求参数,结果发现思路是正确的。
接口参数.png

照片详情页

https://www.instagram.com/p/B3uZMyQp8gh/
这是照片详情页的URL,很容易发现后面的B3uZMyQp8gh就是照片对应的ID。
这个照片ID可以从上面翻页的接口中获得
照片ID.png

访问照片详情页后可以获取用户的ID,进入下一步。
照片详情页中的用户ID.png

用户主页

https://www.instagram.com/andreyychan/
和照片详情页一样,用户主页的URL规则也十分简单,在这个页面需要用正则表达式提取用户的信息,例如帖子、粉丝、关注数、昵称和头像,粉丝数低于1000则过滤,将1000粉丝数以上的用户存入数据库

instagram反爬虫策略

问题

在爬取的过程中,发现instagram有一定的反爬虫机制,在同个IP下一旦访问频率过高,则要求登陆后才能继续访问。
于是模拟登录,将登陆后的cookie设置进程序的请求头中,继续爬一小段时间后发现账号暂时被禁用了。
封.png

解决方法

既然登陆后频繁访问也会被禁,那就只能尝试通过代理IP去访问页面了。
在victoria帮助下找到了个免费提供代理IP的网站:https://www.proxy-list.download/HTTP
但是免费的一般质量参差不齐,需要在程序里过滤掉失效的IP。

结果

instagram的搜索页似乎只会展示最近发布的一千多张照片,因为在程序中循环跑了一段时间后,发现前面说到分页用的after参数返回的是null,也就是意味着没有下一页了。
最后一页.png

虽然比较懵,但是想了下这也算是合理的,毕竟一个公司不会将所有的数据都开放出来,若想爬取大量高于1000粉丝的用户信息,需要隔几天去跑一下这个程序,因为搜索页面是通过时间倒序排序的。

Responses