PHP网页价格爬取脚本异常:同页面部分链接无结果求助
兄弟,我之前做电商爬虫的时候也碰到过这种“明明页面结构看起来一样,换个链接就爬不到内容”的坑,结合你的情况,大概率是下面这几个原因,咱们一个个来排查:
反爬机制拦截了你的请求
很多电商网站会检测请求的User-Agent标识,默认PHP的file_get_contents或者curl请求用的是类似PHP/7.4.x这种一眼就能识别的UA,网站可能直接返回空内容或者假页面。你可以手动设置一个浏览器的UA试试:// 用file_get_contents的写法 $context = stream_context_create([ 'http' => [ 'header' => '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 = file_get_contents('https://www.exito.com/products/0000225183192526/Carne+Res+Molida+En+Bandeja', false, $context); // 如果用curl的话,记得加这行 // curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36");价格是JS动态渲染出来的
你在浏览器里看到的价格,可能是页面加载后通过JavaScript动态插入到<p>标签里的,而原始的HTML响应里根本没有这个价格内容。这种情况下普通的HTTP请求拿不到数据,得用支持JS渲染的工具。纯PHP的话可以试试spatie/browsershot包(它依赖Puppeteer),能模拟浏览器加载页面并执行JS,拿到最终渲染后的HTML。链接处理或重定向问题
你替换的链接里有+这类特殊字符,虽然浏览器能正常解析,但PHP的请求可能没处理好重定向。先检查下请求的返回状态码,看看是不是触发了302重定向但没跟进:$url = 'https://www.exito.com/products/0000225183192526/Carne+Res+Molida+En+Bandeja'; $headers = get_headers($url, 1); print_r($headers); // 看看有没有Location字段,确认是否有重定向如果有重定向,记得开启自动跟进:curl设置
CURLOPT_FOLLOWLOCATION => true,file_get_contents的上下文里加'follow_location' => true。页面结构存在细微差异
别太相信“看起来结构一致”——有时候两个页面的价格标签虽然都是<p>,但可能class属性变了,或者嵌套的父元素层级不同。比如第一个商品的价格是<p class="price-display">,第二个可能是<p class="price-display is-discounted">,或者被放在了一个带hidden类的容器里。你可以把两个页面的原始HTML下载下来对比:// 保存第一个页面 file_put_contents('product1.html', file_get_contents('你的原始测试链接')); // 保存第二个页面 file_put_contents('product2.html', file_get_contents('新商品链接'));然后打开这两个HTML文件,搜索价格相关的内容,看看标签结构是不是真的完全一致。
需要携带特定Cookie才能访问
有些电商网站会根据Cookie判断地区、会话状态,没带对Cookie的话可能返回无价格的页面。你可以先在浏览器里打开新商品页面,F12打开开发者工具,复制请求头里的Cookie内容,加到PHP的请求里试试:$context = stream_context_create([ 'http' => [ 'header' => "User-Agent: 你的浏览器UA\r\nCookie: 你复制的Cookie字符串" ] ]); $html = file_get_contents('新商品链接', false, $context);
内容的提问来源于stack exchange,提问作者Juan Fernandez

