处理延迟加载的图像

现在很多网站都会在滚动时延迟加载图片。如果你需要确保它们出现在最终抓取的页面中(以及result.media), 考虑:

1.wait_for_images=True – 等待图像完全加载。2.scan_full_page – 强制爬虫滚动整个页面,触发延迟加载。3.scroll_delay – 在滚动步骤之间添加小的延迟。

注意:如果网站需要多个“加载更多”触发器或复杂的交互,请参阅页面交互文档。对于具有虚拟滚动(Twitter/Instagram 风格)的网站,请参阅虚拟滚动文档

示例:确保延迟图像出现

import asyncio
from crawl4ai import AsyncWebCrawler, CrawlerRunConfig, BrowserConfig
from crawl4ai.async_configs import CacheMode

async def main():
    config = CrawlerRunConfig(
        # Force the crawler to wait until images are fully loaded
        wait_for_images=True,

        # Option 1: If you want to automatically scroll the page to load images
        scan_full_page=True,  # Tells the crawler to try scrolling the entire page
        scroll_delay=0.5,     # Delay (seconds) between scroll steps

        # Option 2: If the site uses a 'Load More' or JS triggers for images,
        # you can also specify js_code or wait_for logic here.

        cache_mode=CacheMode.BYPASS,
        verbose=True
    )

    async with AsyncWebCrawler(config=BrowserConfig(headless=True)) as crawler:
        result = await crawler.arun("https://www.example.com/gallery", config=config)

        if result.success:
            images = result.media.get("images", [])
            print("Images found:", len(images))
            for i, img in enumerate(images[:5]):
                print(f"[Image {i}] URL: {img['src']}, Score: {img.get('score','N/A')}")
        else:
            print("Error:", result.error_message)

if __name__ == "__main__":
    asyncio.run(main())

解释:

  • 爬虫程序会尝试确保图像在完成 HTML 之前已完成加载。
  • 指示爬虫尝试从上向下滚动。每次滚动都会触发延迟加载。
  • 每次滚动之间暂停半秒钟。这有助于网站在继续之前加载图片。

何时使用:

  • 延迟加载:如果图片仅在用户滚动到视图时显示,scan_full_page +scroll_delay帮助爬虫看到它们。
  • 页面过大:如果页面过长,请注意扫描整个页面可能会比较慢。调整scroll_delay或根据需要最大滚动步数。

您仍然可以将延迟加载逻辑与通常的 exclude_external_images、exclude_domains 或链接过滤相结合:

config = CrawlerRunConfig(
    wait_for_images=True,
    scan_full_page=True,
    scroll_delay=0.5,

    # Filter out external images if you only want local ones
    exclude_external_images=True,

    # Exclude certain domains for links
    exclude_domains=["spammycdn.com"],
)

这种方法可确保您看到来自主域的所有图像,同时忽略外部图像,并且爬虫程序会物理滚动整个页面,从而触发延迟加载。


提示和疑难解答

1. 长页 - 设置scan_full_page=True在极长或无限滚动的页面上可能会占用大量资源。 - 考虑使用钩子或专门的逻辑来重复加载特定部分或“加载更多”触发器。

2. 图像混合行为 - 有些网站会在滚动时批量加载图像。如果缺少图像,请增加scroll_delay或者使用 JS 代码或钩子循环调用多个部分滚动。

3. 与动态等待相结合 - 如果网站有一个占位符,只有在特定事件发生后才会变为真实图像,那么你可以这样做wait_for="css:img.loaded"或者自定义 JSwait_for

4. 缓存 - 如果cache_mode启用后,重复抓取可能会跳过一些网络抓取。如果您怀疑缓存丢失了新图片,请设置cache_mode=CacheMode.BYPASS获取新鲜内容。


借助延迟加载支持、wait_for_images 和 scan_full_page 设置,您可以捕获所需的整个图库或图片源,即使网站仅在用户滚动时加载它们。将这些设置与标准媒体过滤和域名排除功能结合使用,即可获得完整的链接和媒体处理策略。


> Feedback