使用cURL获取Instagram用户页面仅返回加载页的问题求助
解决Instagram页面仅返回加载页的cURL爬取问题
问题根源分析
你的代码存在几个直接错误,再加上Instagram的反爬机制,导致仅能获取到加载页面(SPA骨架屏),无法提取到window._sharedData中的内容:
1. 代码中的明显错误
- User-Agent配置失效:HTTP头里写死了
"User-Agent: USERAGENT"字符串,没有替换成定义好的$useragent变量,同时CURLOPT_USERAGENT设置被注释,导致请求的UA无效,直接被识别为非浏览器请求。 - 多余的请求头:GET请求中添加了
content-type: application/x-www-form-urlencoded头,GET请求无请求体,这个头会暴露爬虫特征。 - JSON分割符错误:
explode(';</script>', $data[1])使用了HTML转义后的实体,实际响应中是原始的;</script>,导致无法正确分割出JSON数据。
2. Instagram反爬机制限制
Instagram对未登录/特征异常的请求会返回仅包含加载骨架的页面,不会直接输出window._sharedData,需要模拟真实浏览器的请求特征才能获取完整内容。
修复步骤
1. 修正User-Agent配置
移除HTTP头中的无效UA设置,启用CURLOPT_USERAGENT:
// 修改HTTP头数组,删除错误的User-Agent行 $arrSetHeaders = array( 'origin: https://www.instagram.com', 'authority: www.instagram.com', 'upgrade-insecure-requests: 1', 'Host: www.instagram.com', 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 'accept-language:ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7,uk;q=0.6', "Referer: https://www.instagram.com", 'Connection: keep-alive', 'cache-control: max-age=0', ); // 取消注释并启用CURLOPT_USERAGENT curl_setopt($ch, CURLOPT_USERAGENT, $useragent);
2. 移除多余请求头
删除content-type: application/x-www-form-urlencoded这一行,GET请求不需要该头。
3. 修复JSON分割逻辑
将scrape方法中的分割代码改为:
$data_json = explode(';</script>', $data[1]);
4. 启用Cookie支持(推荐)
Instagram对未登录请求限制严格,使用自己浏览器中提取的有效Cookie(需从已登录的Instagram会话中获取)可以大幅提高成功率:
// 取消注释Cookie代码,替换为自己的有效Cookie值 $cookies[] = 'sessionid=' . '你的sessionid'; $cookies[] = 'ig_did=' . '你的ig_did'; $cookies[] = 'mid=' . '你的mid'; $cookies[] = 'csrftoken=' . '你的csrftoken'; curl_setopt($ch, CURLOPT_COOKIE, implode(';', $cookies) );
注意:Cookie会定期过期,需及时更新;不要泄露
sessionid,否则账号存在被盗风险。
5. 应对动态渲染(若上述步骤无效)
如果仍然仅返回加载页,说明内容是JavaScript动态渲染的,此时需要使用无头浏览器模拟真实加载:
例如使用PHP的spatie/browsershot库(依赖Node.js和Puppeteer):
use Spatie\Browsershot\Browsershot; // 模拟浏览器加载页面,等待网络空闲 $html = Browsershot::url('https://www.instagram.com/maria43/') ->waitUntilNetworkIdle() ->html(); // 后续从$html中提取window._sharedData
修复后的getUrl方法示例
public static function getUrl($url) { $ch = curl_init(); $useragent= 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36'; curl_setopt($ch, CURLOPT_URL, $url); // 启用有效Cookie $cookies[] = 'sessionid=' . '你的sessionid'; $cookies[] = 'ig_did=' . '你的ig_did'; $cookies[] = 'mid=' . '你的mid'; $cookies[] = 'csrftoken=' . '你的csrftoken'; $arrSetHeaders = array( 'origin: https://www.instagram.com', 'authority: www.instagram.com', 'upgrade-insecure-requests: 1', 'Host: www.instagram.com', 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 'accept-language:ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7,uk;q=0.6', "Referer: https://www.instagram.com", 'Connection: keep-alive', 'cache-control: max-age=0', ); curl_setopt($ch, CURLOPT_HTTPHEADER, $arrSetHeaders); curl_setopt($ch, CURLOPT_COOKIE, implode(';', $cookies) ); curl_setopt($ch, CURLOPT_VERBOSE, 0); curl_setopt($ch, CURLOPT_HEADER, 1); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); curl_setopt($ch, CURLOPT_USERAGENT, $useragent); $response = curl_exec($ch); if ($response === false) { throw new Exception(curl_error($ch)); } curl_close($ch); return $response; }
注意事项
- Instagram反爬机制会持续更新,基于
window._sharedData的爬取方法可能随时失效。 - 频繁爬取会导致IP被封禁,建议添加请求延迟(比如
sleep(2)),控制请求频率。 - 严格遵守Instagram服务条款,避免用于未经授权的爬取行为。
内容的提问来源于stack exchange,提问作者Peter Czask
相关产品推荐
相关产品推荐

