搜索

php爬网页图片相对地址怎么改

发表于 2026-10-17 07:02:34 来源:力不从心网

抓下来的网页网页里,图片地址是图片相对路径,比如 images/logo.png 或者 ../uploads/photo.jpg。相对你直接存进数据库,地址回头页面一换域名,网页图全裂。图片这问题不复杂,相对但处理不好能让你半夜爬起来改代码。地址

核心就一句话:把相对地址拼成绝对地址。网页但拼之前你得弄清楚——这个相对路径是图片相对于哪个基准的?

拿真实案例说。我爬某个新闻站,相对HTML 里写着 <img src="/upload/2024/01/abc.jpg">。地址注意开头有个斜杠,网页这叫根相对路径,图片意思是相对相对于域名根目录。这时候拼法很简单:https://目标域名 + src 就行。但麻烦的是另一种,像 <img src="images/pic.jpg"> 这种没斜杠的,它相对的是当前页面 URL 的目录。假设页面地址是 https://site.com/news/detail.php,那图片真实地址就是 https://site.com/news/images/pic.jpg,不是 https://site.com/images/pic.jpg。很多人栽在这。

我这有个更阴间的例子。某网站用 <base href="https://cdn.example.com/assets/"> 声明了全局基准。所有相对路径都指向那个 CDN。你要是傻乎乎用页面 URL 拼,全错。所以爬的时候得先查 HTML 里有没有 <base> 标签,有就优先用它当基准。

代码实现上,PHP 里我习惯这么干:

function resolveUrl($base, $rel) {  if (preg_match('#^https?://#i', $rel)) return $rel; // 已经是绝对地址 $parts = parse_url($base); $root = $parts['scheme'] . '://' . $parts['host']; if (isset($parts['port'])) $root .= ':' . $parts['port']; if ($rel[0] === '/') return $root . $rel; // 根相对 // 目录相对 $dir = isset($parts['path']) ? dirname($parts['path']) : '/'; return $root . $dir . '/' . $rel; }

这函数处理了三种情况。但你别急着抄,还有个坑——路径里的 ../。比如 ../images/a.jpg 从 /news/detail.php 出发,正确结果是 /images/a.jpg。上面那个简单拼接会得出 /news/../images/a.jpg。浏览器能解析,但你存数据库里看着难受,万一哪天做字符串匹配就出鬼了。要彻底解决得用栈来规范化路径。

我一般直接调 PHP 的 realpath()?不行,那是文件系统的。网上有现成的 RFC 3986 解析库,但为了爬虫引个库不值当。手写个循环处理 .. 也就十几行,网上搜"php resolve relative url"第一个结果就能用。

最后提醒一句——别忘了图片 URL 里的中文和空格。有些站图片名带中文,抓下来得 rawurlencode() 处理,不然存 MySQL 没事,输出到 HTML 浏览器自动编码,但你要是拿去请求下载就会 404。空格得编码成 %20,别直接拼。

改完地址,建议你顺手验证一下。写个循环用 get_headers() 测几个图片 URL,看返回 200 不。我上次爬了个站,图片路径带 session 验证,直接拼绝对地址访问是 403,后来发现得带 cookie。这种边缘情况,不实测永远发现不了。

处理完这些,图片地址就干干净净了。存库的存库,下载的下载,不会再出幺蛾子。

随机为您推荐
友情链接
版权声明:本站资源均来自互联网,如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

Copyright © 2016 Powered by php爬网页图片相对地址怎么改,力不从心网   sitemap

回顶部