Java URLConnection设置Cookie不生效,Instagram爬虫无法获取用户数据如何解决?
解决方案
你遇到的Cookie失效问题主要由请求头缺失、代码逻辑错误、接口规则变更三个原因导致,按以下步骤修改即可:
- 补全必填请求头,解除UA注释的同时新增必要头字段:Instagram会校验请求的UA、Accept、Referer等字段,缺失会直接触发登录拦截
- 完善Cookie字段:除sessionid外,必须同时携带从浏览器同一会话中提取的
csrftoken、ds_user_id两个Cookie值,单独的sessionid已经无法通过校验 - 修复BufferedReader读取逻辑:原有循环每次会丢弃一行返回内容,很可能导致你误判返回结果为登录页
- 给接口补充必要参数:
__a=1接口现在需要额外带上__d=dis参数,同时要在请求头中添加和Cookie内一致的X-CSRFToken值
修改后的代码示例
try { String username = txtUsername.getText(); String targetUrl = "https://instagram.com/" + username + "?__a=1&__d=dis"; System.out.println("search in " + targetUrl); URLConnection connection = new URL(targetUrl).openConnection(); // 补全请求头,所有值要和你提取Cookie的浏览器请求头保持一致 connection.setRequestProperty("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"); connection.setRequestProperty("Accept", "*/*"); connection.setRequestProperty("X-Requested-With", "XMLHttpRequest"); connection.setRequestProperty("Referer", "https://www.instagram.com/" + username + "/"); // 替换成你自己提取的csrftoken connection.setRequestProperty("X-CSRFToken", "你的csrftoken值"); // 补全Cookie字段 connection.setRequestProperty("Cookie", "sessionid=你的sessionid值; csrftoken=你的csrftoken值; ds_user_id=你的ds_user_id值"); connection.connect(); BufferedReader r = new BufferedReader(new InputStreamReader(connection.getInputStream(), Charset.forName("UTF-8"))); StringBuilder sb = new StringBuilder(); String line; // 修复读取逻辑 while ((line = r.readLine()) != null) { sb.append(line); } System.out.println(sb.toString()); } catch (MalformedURLException ex) { Logger.getLogger(MainFrame.class.getName()).log(Level.SEVERE, null, ex); } catch (IOException ex) { Logger.getLogger(MainFrame.class.getName()).log(Level.SEVERE, null, ex); }
如果修改后还是返回登录页,可以检查下你用的sessionid是否已经过期,或者IP是否被Instagram限流,切换为移动网络重试即可。
内容的提问来源于stack exchange,提问作者Conta
相关产品推荐
相关产品推荐

