我需要在没有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个状态和带有用户页面的正文。此外,代码<代码>法拉第。得到('https://www.instagram.com/some_username/)不使用代理可以正常工作,即返回200个状态和带有用户页的正文。我也在其他客户机上尝试过同样的方法,结果也是一样的,没有代理就成功了,并用它重定向。
客户端可能需要一些额外的特定配置来使用代理?
使现代化
我不确定,但这看起来像是代理的问题,即instagram可能会以某种方式检测到购买/免费的代理,并重定向来自代理的请求(我使用了购买的代理包),因为我尝试使用自己的代理,而且效果很好。
现在,如果你达到了抓取instagram的极限,你将被重定向到LoginAndSignupPage
(你可以在源代码中找到它)。请注意,在这一点上登录是行不通的——instagram只会返回429个错误代码,这意味着太多的请求。同样,在每个这样的块之后,很可能你的IP地址就更不可靠了,所以如果你在块之后再开始刮,它会被更快地阻塞。
我想最简单的方法是使用住宅ip,请求之间有足够高的延迟——比如3-5秒,如果你能使用真实的账户,并且不要过度使用它们,以及尝试同时提出任何其他请求,比如获得一些帖子,开单贴什么的。
你可以忽略谷歌上几乎所有可用的免费IP代理列表,其中99%的IP被禁止,与Digitalocean、OVH等的IP几乎相同,其中许多也被阻止。
instagram确实很难绕过,您需要经常旋转代理以避免阻塞。尝试https://rapidapi.com/neotank/api/instagram130为了缓解这种情况,它会为您旋转代理。。