PHP CURL无法获取纳斯达克API数据问题求助
问题:PHP CURL无法获取纳斯达克接口数据,但Postman可正常请求
我尝试从接口 https://www.nasdaq.com/api/v1/loadmore/content_feed_2_3?content_types=article&title=Latest%20News&load_more_text=See%20More%20News&total_limit=40&base_nid=7456&offset=0 获取数据,用Postman(Chrome扩展)能正常拿到结果,但用下面的PHP CURL脚本却请求失败:
error_reporting(E_ALL); $curl = curl_init(); curl_setopt_array($curl, array( CURLOPT_URL => 'https://www.nasdaq.com/api/v1/loadmore/content_feed_2_3?content_types=article&title=Latest%20News&load_more_text=See%20More%20News&total_limit=40&base_nid=7456&offset=0', CURLOPT_RETURNTRANSFER => true, // CURLOPT_ENCODING => '', CURLOPT_USERAGENT => 'Mozilla/5.0 (Windows NT 6.3; WOW64; rv:38.0) Gecko/20100101 Firefox/38.0', CURLOPT_HTTPHEADER => array('Content-type: text/plain'), // CURLOPT_MAXREDIRS => 10, CURLOPT_TIMEOUT => 0, CURLOPT_FOLLOWLOCATION => true, CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, CURLOPT_CUSTOMREQUEST => 'GET', // CURLOPT_HTTPHEADER => array( // 'Cookie: ak_bmsc=0A6F4EE1A61A153AF8CEACFCF215E5B6~000000000000000000000000000000~YAAQJ1stF9zG2kKDAQAAbw2EdBGJ660iRvYwu0OI1LbOUohUTyzwtnMcOXf1u3pf889WVJC69C2Jg7d7STDNE/jUR1BgOo8uoPCyJ/LY9d9ZCZu2zgSUOBNy5yeRkkONEcQigyuKK+9BnLnlJZWPgWNOIvCcZjPz4sUxrUDndRWL4z0eW7Cz/lwwZoaN1da85i+AwvwEUNbJEH+GgqcxUDo3Yur5d0dyPVrmnmDSeHYJojGC9Rc7HtFMGqa7M3+yIeFqGE4sLG2Jdc3ekb9ma0lCLuE+UF7sZtSmuEBNiGe08RqN5gCFWPnbxf44Sn479BfPN68HLY3JGVNaly5344Mk7QdHEuP29uuTAAmrYsLEsYaj2S1kzNeROZMQ' // ), )); $response = curl_exec($curl); curl_close($curl); echo $response;
问题排查与修复方案
核心问题点
- 多余的请求头:GET请求不需要设置
Content-type: text/plain,这个头会被服务器判定为异常请求,而Postman默认不会添加该字段。 - 缺失验证Cookie:纳斯达克接口依赖
ak_bmsc这类反爬Cookie验证请求合法性,你注释掉了Cookie头,而Postman会自动携带浏览器的有效Cookie。 - UA版本过旧:脚本里的Firefox 38 UA太老旧,容易被反爬机制拦截。
修复后的脚本
error_reporting(E_ALL); $curl = curl_init(); // 替换成你从浏览器/Postman获取的有效Cookie(Cookie会过期,需实时获取) $validCookie = 'ak_bmsc=你的实时有效Cookie值~000000000000000000000000000000~YAAQ...'; curl_setopt_array($curl, array( CURLOPT_URL => 'https://www.nasdaq.com/api/v1/loadmore/content_feed_2_3?content_types=article&title=Latest%20News&load_more_text=See%20More%20News&total_limit=40&base_nid=7456&offset=0', CURLOPT_RETURNTRANSFER => true, CURLOPT_ENCODING => 'gzip, deflate', // 开启压缩,匹配Postman默认行为 CURLOPT_USERAGENT => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36', CURLOPT_HTTPHEADER => array( 'Cookie: ' . $validCookie, 'Accept: application/json, text/plain, */*' // 明确接受响应类型 ), CURLOPT_MAXREDIRS => 10, CURLOPT_TIMEOUT => 30, CURLOPT_FOLLOWLOCATION => true, CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, CURLOPT_CUSTOMREQUEST => 'GET', )); $response = curl_exec($curl); // 增加错误调试 if(curl_errno($curl)) { echo 'CURL错误:' . curl_error($curl); } curl_close($curl); echo $response;
额外说明
- Cookie必须是当前有效的,你可以从浏览器开发者工具的请求头里复制最新的
ak_bmsc值; - 去掉多余的
Content-type头,GET请求无需设置该字段; - 添加
Accept头,明确告诉服务器接受的响应格式,和Postman请求行为保持一致。
内容的提问来源于stack exchange,提问作者Muhammad Hadi Qureshi
相关产品推荐
相关产品推荐

