如何抓取图片链接_PHP提取网页图片链接技巧【教程】

1次阅读

php抓取网页图片链接应优先使用file_get_contents配合domdocument解析,而非正则匹配;需处理data-src与src、相对路径补全、base标签、user-agent及referer等防盗链措施。

如何抓取图片链接_PHP提取网页图片链接技巧【教程】

PHP 抓取网页图片链接,核心不是“能不能”,而是“用对方法”——file_get_contents + DOMDocument 是最稳的组合,正则匹配 <img alt="如何抓取图片链接_PHP提取网页图片链接技巧【教程】" > 标签在大多数真实网页中会漏掉或错抓。

为什么别用正则解析 <img alt="如何抓取图片链接_PHP提取网页图片链接技巧【教程】" > 标签

HTML 不是正则友好的格式:标签可能跨行、属性顺序不固定、有自闭合写法、含 js 动态插入内容。常见错误现象包括:

  • 漏掉 <img src="..." alt="如何抓取图片链接_PHP提取网页图片链接技巧【教程】" > 中换行后的 src 属性
  • 把 CSS 背景图 URL(如 style="background:url(...)")误判为 <img alt="如何抓取图片链接_PHP提取网页图片链接技巧【教程】" >
  • 抓到注释里的假链接,比如 <!-- <img src="xxx" alt="如何抓取图片链接_PHP提取网页图片链接技巧【教程】" > -->
  • 遇到 html5 自定义属性(如 data-src)直接忽略

DOMDocument 安全提取 srcdata-src

DOMDocument 能真正解析 HTML 结构,兼容性好、容错强。关键点:

  • 务必调用 $dom->loadHTML($html, LIBXML_NOERROR | LIBXML_NOWARNING) 屏蔽解析警告
  • $dom->getElementsByTagName('img') 遍历所有 <img alt="如何抓取图片链接_PHP提取网页图片链接技巧【教程】" > 元素
  • 优先读 $img->getAttribute('data-src')(懒加载常见), fallback 到 src
  • filter_var($url, FILTER_VALIDATE_URL) 过滤掉相对路径或无效值,再补全协议和域名

示例片段:

立即学习PHP免费学习笔记(深入)”;

$dom = new DOMDocument(); @$dom->loadHTML($html, LIBXML_NOERROR | LIBXML_NOWARNING); $imgs = $dom->getElementsByTagName('img'); $urls = []; foreach ($imgs as $img) {     $url = $img->getAttribute('data-src') ?: $img->getAttribute('src');     if ($url && filter_var($url, FILTER_VALIDATE_URL) === false) {         $url = rtrim($base_url, '/') . '/' . ltrim($url, '/');     }     if (filter_var($url, FILTER_VALIDATE_URL)) {         $urls[] = $url;     } }

处理 httpS、相对路径和 base 标签

网页里 src="/images/a.jpg"src="images/b.png" 必须转成完整 URL,否则下载会 404。不能硬拼 https://domain.com/ —— 页面可能含 <base href="https://cdn.example.com/">。实操建议:

  • 先用 $dom->getElementsByTagName('base')href,存在则作为基准
  • <base> 就用请求该网页时的原始 URL(即 $base_url
  • parse_url() 拆解基准 URL,再用 dirname() 处理相对路径层级
  • 避免用 str_replacesubstr 手动拼接,容易出错

注意防盗链和 User-Agent

很多图床(如微博、知乎、头条)返回空响应或 403,不是代码问题,是服务端校验了 User-AgentReferer。调试时可加:

  • stream_context_set_default(['http' => ['header' => "User-Agent: Mozilla/5.0 (X11; linux x86_64) AppleWebKit/537.36"]]);
  • 必要时补 Referer: https://example.com/(需与目标站同源或允许)
  • 有些站点还校验 Accept 头,设成 image/webp,image/apng,image/*,*/*;q=0.8 更稳妥

真正难的不是提取链接,是让服务器愿意把图片给你——URL 对了,头不对,照样拿不到。

text=ZqhQzanResources