使用HTTParty获取/设置会话:部分页面报404需会话头问题
嘿,我之前也遇到过Instagram这种“部分页面能访问、部分返回404”的情况,大概率是它的反爬机制在搞鬼——有些页面会校验会话相关的请求头,哪怕看起来是公开内容。咱们来一步步搞定:
解决Instagram地点页面404的会话头处理方案
1. 先抓出浏览器正常访问时的关键请求头
首先你得从浏览器里拿到能正常打开那个404页面的请求头,步骤很简单:
- 打开Chrome/Firefox的开发者工具(按F12就行)
- 手动访问那个返回404的地点页面
https://www.instagram.com/explore/locations/295648950/trio-salon-spa/ - 切换到「Network」标签,找到第一个GET请求(就是这个页面的请求)
- 复制「Request Headers」里的内容,重点盯这几个字段:
Cookie、User-Agent、Referer
2. 用HTTParty带上这些请求头发起请求
把刚才复制的请求头整理成Ruby哈希,传给HTTParty的:headers参数就行。示例代码如下:
# 替换成你从浏览器复制的真实请求头内容 custom_headers = { 'User-Agent' => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36', 'Cookie' => 'ds_user_id=xxx; sessionid=xxx; ig_did=xxx; ...', # 这里放完整的Cookie字符串 'Referer' => 'https://www.instagram.com/explore/locations/' } # 发起请求 response = HTTParty.get( 'https://www.instagram.com/explore/locations/295648950/trio-salon-spa/', headers: custom_headers ) puts response.code # 正常的话会返回200
3. 为啥有些页面不需要这些头?
那些能直接访问的页面,要么是Instagram对这类公开热门地点放宽了校验,要么是你之前的请求无意中带上了一些默认的会话痕迹(比如HTTParty的缓存?不过概率不大)。但像小众商家、有隐私设置的地点页面,Instagram会强制校验会话有效性,所以必须带上正确的请求头。
4. 踩坑提醒
- Cookie会过期:过几天如果又返回404,记得重新从浏览器复制最新的Cookie
- 别频繁请求:Instagram的反爬很严,频繁请求会被封IP,建议加个请求间隔(比如
sleep 2) - 别用默认User-Agent:HTTParty的默认User-Agent太容易被识别,一定要用真实浏览器的UA
内容的提问来源于stack exchange,提问作者99miles
相关产品推荐
相关产品推荐

