首页 > 解决方案 > Instagram 用户页面解析(带代理,不带 API)

问题描述

我需要在没有 API 和代理的情况下解析 instagram 用户页面,我使用如下代码

def client(options = {})
  Faraday.new('https://www.instagram.com', ssl: { verify: false }, request: { timeout: 10 }) do |conn|
    conn.request :url_encoded
    conn.proxy options[:proxy]
    conn.adapter :net_http
  end
end

response = client.get('some_username/', proxy: URI('//111.111.111.111:8080'))

response.status # 302
response['location'] # "https://www.instagram.com/accounts/login/"

但就在几天前,上面的代码按预期工作,即返回 200 状态和带有用户页面的正文。此外Faraday.get('https://www.instagram.com/some_username/'),没有代理的代码可以正常工作,即返回 200 状态和带有用户页面的正文。我也尝试过其他客户端,结果相同,没有代理成功并使用它重定向。

客户端需要一些额外的特定配置来使用代理,也许?

更新

我不确定,但它看起来像代理的问题,即 instagram 以某种方式检测到购买/免费代理,也许,并重定向来自代理的请求(我使用购买的代理包),因为我尝试使用我自己的代理,它的作品。

标签: rubyparsingproxyinstagram

解决方案


Instagram 最近做出了一些改变。他们很可能有一些特殊的 AI 或使用某些服务来审查您的 IP 地址、您使用的 ISP、它是否属于 Digitalocean、OVH 等组织或住宅、您向哪些端点发出了多少请求、您好吗制作它们,您在其上使用了多少个帐户,以及更改它们的速度等。

现在,如果您达到抓取​​ instagram 的限制,您将被重定向到LoginAndSignupPage(您可以在源代码中找到它)。请注意,此时登录将不起作用 - instagram 只会返回429 error code,这意味着请求太多。同样,在每个这样的块之后,您的 IP 地址很可能更不可靠,因此如果您在块后再次开始抓取,它将被更快地阻止。

我想最简单的方法就是使用住宅 ip,请求之间有足够高的延迟——比如 3-5 秒,如果你能以某种方式使用真实帐户,并且不要过度使用它们,以及尝试发出任何其他请求,那就更好了同时,例如获取一些帖子,打开单个帖子或其他内容。

您几乎可以忽略谷歌上可用的任何免费 IP 代理列表,其中 99% 的 ip 被禁止,与 Digitalocean、OVH 等的 ip 几乎相同,其中许多也被阻止。


推荐阅读