处理延迟加载的图像
现在很多网站都会在滚动时延迟加载图片。如果你需要确保它们出现在最终抓取的页面中(以及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 设置,您可以捕获所需的整个图库或图片源,即使网站仅在用户滚动时加载它们。将这些设置与标准媒体过滤和域名排除功能结合使用,即可获得完整的链接和媒体处理策略。