PHP提取特定域名链接异常求助:目标链接未被抓取
问题分析与解决方案
原代码的问题点
- 仅提取
<source>标签的src属性,但目标链接https://fs1.pdisk.pro:183并不在该标签中 - 使用
file_get_contents获取页面内容时,可能因服务器反爬策略或请求头缺失无法拿到完整内容 - 最后重复调用
json_encode,导致输出的是JSON字符串的二次编码结果,不符合预期格式
修正后的实现方案
步骤1:改用CURL获取页面内容(更稳定)
添加请求头模拟浏览器访问,避免被目标服务器拦截。
步骤2:提取目标域名的所有链接
通过字符串匹配筛选出包含fs1.pdisk.pro:183的所有链接,不受限于特定HTML标签。
步骤3:输出指定格式的JSON,可选实现跳转
如果需要自动跳转,可在输出JSON前添加Location头(需确保无任何前置输出)。
完整代码示例
function extractPdiskLinks($url) { // 初始化CURL $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 模拟浏览器请求头,避免被拦截 curl_setopt($ch, CURLOPT_HTTPHEADER, [ 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36' ]); // 执行请求获取HTML内容 $html = curl_exec($ch); curl_close($ch); if (!$html) { return json_encode(['error' => 'Failed to fetch page content']); } // 匹配所有包含目标域名的链接 $pattern = '/https?:\/\/fs1\.pdisk\.pro:183[^"\']+/'; preg_match_all($pattern, $html, $matches); $links = array_unique($matches[0]); // 去重处理 $result = []; if (!empty($links)) { // 返回第一个匹配到的链接,符合{"url":"link"}格式 $result['url'] = reset($links); // 可选:自动跳转到目标链接(取消注释即可启用,需确保无前置输出) // header("Location: " . $result['url']); // exit; } else { $result['error'] = 'No matching links found'; } return json_encode($result); } // 指定目标页面URL $targetUrl = 'http://pdisk.investro1.com/how-to-buy-life-insurance-online-qfevac8cq8x4.html'; // 提取链接并输出结果 echo extractPdiskLinks($targetUrl);
代码说明
- 用CURL替代
file_get_contents,添加浏览器UA头提升请求成功率 - 通过正则表达式匹配目标域名链接,无需依赖特定HTML标签结构
- 自动对链接去重,避免重复结果
- 输出严格符合要求的JSON格式,无匹配结果时返回错误提示
- 可选开启自动跳转功能,只需取消注释
header相关代码
内容的提问来源于stack exchange,提问作者Legend Akshay
相关产品推荐
相关产品推荐

