ruby - 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 以某种方式检测到购买/免费代理,也许,并重定向来自代理的请求(我使用购买的代理包),因为我尝试使用我自己的代理,它的作品。
解决方案
Instagram 最近做出了一些改变。他们很可能有一些特殊的 AI 或使用某些服务来审查您的 IP 地址、您使用的 ISP、它是否属于 Digitalocean、OVH 等组织或住宅、您向哪些端点发出了多少请求、您好吗制作它们,您在其上使用了多少个帐户,以及更改它们的速度等。
现在,如果您达到抓取 instagram 的限制,您将被重定向到LoginAndSignupPage
(您可以在源代码中找到它)。请注意,此时登录将不起作用 - instagram 只会返回429 error code
,这意味着请求太多。同样,在每个这样的块之后,您的 IP 地址很可能更不可靠,因此如果您在块后再次开始抓取,它将被更快地阻止。
我想最简单的方法就是使用住宅 ip,请求之间有足够高的延迟——比如 3-5 秒,如果你能以某种方式使用真实帐户,并且不要过度使用它们,以及尝试发出任何其他请求,那就更好了同时,例如获取一些帖子,打开单个帖子或其他内容。
您几乎可以忽略谷歌上可用的任何免费 IP 代理列表,其中 99% 的 ip 被禁止,与 Digitalocean、OVH 等的 ip 几乎相同,其中许多也被阻止。
推荐阅读
- java - 运行 maven 全新安装时出错。我正在使用 CDI。有人能帮我吗?
- marklogic - 运行 gradle mlExportBatchesToDirectory 时出现“超出 GC 开销限制”错误
- python - pip install windows 后无法使用 coockiecutter 命令
- r - 匹配字符前的数字或第一个字母 - 正则表达式
- static-analysis - 如何打包 .NET 应用程序以进行验证码扫描
- c++ - 问:如何在 main 中使用 std::vector 调用模板类?
- vim - 光标一直自动跳到下一行
- snowflake-cloud-data-platform - 从外部阶段加载数据 - 将阶段名称传递给参数
- amazon-web-services - 在 Lambda 中将 AWS 弹性 IP 分配给 EC2 实例
- python - 将 Outlook 电子邮件拖放到 Python 脚本中