菜鸟科技网

如何获取网站JS中的动态图片?

下面我将为你详细分解这个过程,从简单到复杂,并提供多种方法和工具。

如何获取网站JS中的动态图片?-图1
(图片来源网络,侵删)

核心思路

获取JS图片的关键在于理解图片是如何被加载的,然后在加载的时机“截获”它,主要有以下几种情况:

  1. 直接存在于HTML中:最简单的情况,图片的src属性直接写在HTML标签里,这种图片不算JS图片,但可以先尝试获取。
  2. 通过<script>标签加载:图片的URL或数据被硬编码在某个.js文件里。
  3. 通过JavaScript动态创建:页面加载后,JS代码会动态创建<img>标签,并设置其src
  4. 通过JavaScript异步加载:JS代码会使用fetchaxiosXMLHttpRequest等技术,从服务器获取图片数据。
  5. 懒加载:图片初始时没有src,当用户滚动到特定位置时,JS才会设置src来加载图片。

使用浏览器开发者工具(最常用、最直接)

这是最推荐的方法,因为它能让你直观地看到网页的加载过程和网络请求。

步骤详解:

  1. 打开目标网站:在浏览器中打开你想要获取图片的网页。

  2. 打开开发者工具

    如何获取网站JS中的动态图片?-图2
    (图片来源网络,侵删)
    • F12 键。
    • 或者右键点击页面,选择“检查”。
  3. 切换到“网络”标签页:在开发者工具的工具栏中找到并点击“Network”。

  4. 筛选请求类型:在“网络”标签页的筛选器中,点击“JS”按钮,这样列表中只会显示JavaScript文件相关的请求,你也可以勾选“Img”来显示图片请求,方便对比。

  5. 刷新页面:按 F5Ctrl+R 刷新页面,这一步至关重要,因为它会重新加载所有资源,包括动态加载的JS和图片,你会看到网络请求列表中充满了各种请求。

  6. 定位JS文件:在筛选后的JS文件列表中,找到你可能感兴趣的文件,如果你不确定是哪个,可以:

    如何获取网站JS中的动态图片?-图3
    (图片来源网络,侵删)
    • 按名称猜测:文件名可能包含image, slider, gallery, avatar等关键词。
    • 按大小排序:包含大量图片数据的JS文件通常会比较大。
    • 按时间排序:查看在页面加载后期才发起的请求,这些很可能是动态加载的。
  7. 检查JS文件内容:点击一个可疑的JS文件,在弹出的窗口中切换到“标头”、“预览”或“响应”标签页,查看其内容。

    • 在“响应”或“预览”标签页中,直接搜索图片URL的常见模式,如 httphttps.jpg.png 等。
    • 你可能会找到类似这样的URL:https://example.com/images/item_12345.webp
  8. 查找动态创建的图片请求

    • 回到“网络”标签页,这次不要筛选“JS”,而是筛选“All”或“Img”。
    • 在页面上进行一些操作,比如点击一个按钮、滚动页面等,观察网络请求列表中是否突然出现了新的图片请求,这个请求的来源很可能就是某个JS文件触发的。
  9. 从DOM中查找

    • 切换到“元素”标签页。
    • Ctrl+F (或 Cmd+F on Mac) 打开搜索框。
    • 搜索 <img,你会看到页面中所有的<img>
    • 检查这些标签的src属性,如果某个<img>标签是后来才出现的,它的src很可能就是JS动态设置的,你可以右键点击这个元素,选择“复制” -> “复制图片地址”。

使用命令行工具(适合批量下载)

如果你已经通过方法一找到了图片URL的模式,并且需要批量下载,那么使用命令行工具会更高效。

常用工具:wgetcurl

假设你已经发现图片URL的格式是 https://example.com/data/img_<number>.jpg,其中<number>是从1到100的数字。

使用 wget (推荐):

# 使用通配符下载
wget -r -l1 -nd -A "jpg" -R "html" "https://example.com/data/img_*.jpg"
# 或者更精确地,先构建URL列表再下载
for i in {1..100}; do
  wget "https://example.com/data/img_${i}.jpg"
done

参数解释:

  • -r: 递归下载。
  • -l1: 只下载一层链接。
  • -nd: 不创建目录,所有文件都下载到当前目录。
  • -A "jpg": 只接受后缀为 jpg 的文件。
  • -R "html": 排除后缀为 html 的文件。

使用 curlxargs:

# 生成URL列表,然后并行下载
seq -f "https://example.com/data/img_%03g.jpg" 1 100 | xargs -P 5 -I {} curl -O {}
  • seq: 生成序列。
  • xargs: 将URL列表作为参数传递给curl
  • -P 5: 并行执行5个任务,提高下载速度。
  • -O: 将输出保存为文件,文件名从URL中获取。

编写浏览器扩展(最强大、最灵活)

如果网站的保护非常严密,或者你需要自动化的、长期的任务,编写一个简单的浏览器扩展是最佳选择。

基本思路:

  1. 创建一个manifest.json文件:这是扩展的配置文件。
  2. 编写一个content.js脚本:这个脚本会在目标网页上运行,可以访问和修改页面的DOM。
  3. 监听图片加载事件:在content.js中,使用MutationObserver来监听DOM的变化,当发现有新的<img>标签被添加时,就获取它的src

简单示例 (manifest.json):

{
  "manifest_version": 3,
  "name": "JS Image Downloader",
  "version": "1.0",
  "description": "Extracts images loaded by JavaScript.",
  "permissions": [
    "activeTab",
    "scripting",
    "downloads"
  ],
  "host_permissions": [
    "https://*.target-website.com/*"
  ],
  "content_scripts": [
    {
      "matches": ["https://*.target-website.com/*"],
      "js": ["content.js"]
    }
  ]
}

简单示例 (content.js):

// 使用 MutationObserver 监听DOM变化
const observer = new MutationObserver((mutationsList, observer) => {
    for (const mutation of mutationsList) {
        if (mutation.type === 'childList') {
            // 检查新添加的节点
            for (const node of mutation.addedNodes) {
                // 如果新添加的是 img 标签
                if (node.nodeName === 'IMG') {
                    const imageUrl = node.src;
                    if (imageUrl && imageUrl.startsWith('http')) {
                        console.log('Found new image:', imageUrl);
                        // 调用下载函数
                        downloadImage(imageUrl);
                    }
                }
                // 如果新添加的节点包含 img 子标签
                const images = node.getElementsByTagName('img');
                for (const img of images) {
                    const imageUrl = img.src;
                    if (imageUrl && imageUrl.startsWith('http')) {
                        console.log('Found new image (child):', imageUrl);
                        downloadImage(imageUrl);
                    }
                }
            }
        }
    }
});
// 开始观察整个文档 body 的变化
observer.observe(document.body, {
    childList: true,      // 观察子节点的添加或删除
    subtree: true         // 观察所有后代节点
});
// 下载图片的函数 (需要 "downloads" 权限)
function downloadImage(url) {
    chrome.downloads.download({
        url: url,
        filename: 'downloaded_images/' + url.split('/').pop(), // 从URL中提取文件名
        saveAs: false
    });
}

总结与建议

方法 优点 缺点 适用场景
浏览器开发者工具 直观、无需安装、能实时交互 手动操作,不适合批量下载 快速检查、调试、一次性获取少量图片
命令行工具 高效、适合批量下载、可自动化 需要先手动获取URL模式 已知图片URL规律,需要大量下载
浏览器扩展 功能强大、自动化程度高、可长期运行 开发成本高,需要一定的编程知识 复杂网站、需要长期监控或自动化任务的场景

给你的建议:

  1. 先从“浏览器开发者工具”开始,这是最基础也是最重要的技能。
  2. 如果只是想下载几张图,手动复制链接用下载工具下载最快。
  3. 如果发现图片URL有规律(如 img_1.jpg, img_2.jpg...),立刻切换到wgetcurl
  4. 如果网站非常复杂,图片加载逻辑嵌套很深,或者你需要一个“一键下载”的解决方案,再考虑开发浏览器扩展。
分享:
扫描分享到社交APP
上一篇
下一篇