Python高级应用之AI Agent开发详解:并行处理、Bug修复与最新crawl4ai 0.6.3及Deepseek-R1:8b网络图片获取实战指南

搞了两天把crawl4ai 0.6.3(最新版) 对ollama 本地大模型比如:deepseek-r1:8b 的bug 给解决了(Issues1035)

先针对 crawl4ai 0.6.3 中四个核心类的作用、关系及结合本地 Ollama 模型抓取百度图片的示例解析说了,
再顺道把,Issues1035 的bug也解决一下


1. 5个核心类的作用和关系

(1) BrowserConfig
  • 作用: 配置浏览器行为,控制爬虫的“浏览器环境”。
  • 关键参数:
  • headless: 是否启用无头模式(默认 True,生产环境建议开启)。
  • user_agent: 模拟浏览器标识,避免被反爬。
  • javascript_enabled: 启用 JavaScript(动态页面必需)。
  • proxy: 代理设置(本示例不需要)。
  • 场景: 配置浏览器模拟真人操作,加载动态内容(如百度图片的懒加载)。
  • (2) CrawlerRunConfig
  • 作用: 定义爬虫的全局运行策略,整合其他组件的配置。
  • 关键参数:
  • browser_config: 绑定 BrowserConfig 实例。
  • llm_config: 绑定 LLMConfig 实例。
  • llm_extraction_strategy: 绑定 LLMExtractionStrategy 实例。
  • timeout: 超时时间,防止卡死。
  • 场景: 将浏览器、LLM 和提取策略组装成完整的爬虫逻辑。
  • (3) LLMExtractionStrategy
  • 作用: 定义如何用大语言模型(LLM)从网页内容中提取信息。
  • 关键参数:
  • extraction_type: 提取类型(如 TEXT, JSON, MARKDOWN)。
  • extraction_instructions: 自然语言指令,指导 LLM 过滤内容。
  • llm_chain: 自定义处理链(如预处理、后处理)。
  • 场景: 让 LLM 理解“需要提取含‘韩立’的图片链接”。
  • (4) LLMConfig
  • 作用: 配置 LLM 的连接方式和参数。
  • 关键参数:
  • model_name: 模型名称(如 deepseek-r1:8b)。
  • base_url: Ollama 本地 API 地址(默认 http://localhost:11434/v1)。
  • temperature: 控制生成结果的随机性。
  • 场景: 连接本地 Ollama 服务,指定使用 deepseek-r1:8b 模型。
  • 类间关系:
    AsyncWebCrawler
      └─ CrawlerRunConfig
          ├─ BrowserConfig
          ├─ LLMConfig
          └─ LLMExtractionStrategy
    

    2. 抓取百度图片示例

    (1) 完整代码
    from crawl4ai import AsyncWebCrawler
    from crawl4ai.models import (
        BrowserConfig,
        CrawlerRunConfig,
        LLMExtractionStrategy,
        LLMConfig
    )
    
    # 1. 配置浏览器环境
    browser_config = BrowserConfig(
        headless=True,  # 生产环境建议开启无头模式
        user_agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36",
        javascript_enabled=True,
        proxy=None  # 无需代理
    )
    
    # 2. 配置本地 Ollama 的 LLM
    llm_config = LLMConfig(
    		#这个地方很重要不能错
            provider="ollama/deepseek-r1:8b",
            base_url="http://localhost:11434",
            api_token="no-token",
    )
    
    # 3. 定义 LLM 提取策略(关键!)
    extraction_strategy = LLMExtractionStrategy(
        extraction_type="TEXT",  # 从文本中提取
        extraction_instructions="提取所有包含‘韩立’的图片的URL,并去重。",
        llm_chain=[
            {
                "step": "extract",
                "instructions": "分析页面内容,找到所有百度图片搜索结果中alt文本或描述包含‘韩立’的图片链接。"
            }
        ]
    )
    
    # 4. 组装爬虫配置
    crawler_config = CrawlerRunConfig(
        browser_config=browser_config,
        llm_config=llm_config,
        llm_extraction_strategy=extraction_strategy,
        timeout=30
    )
    
    # 5. 执行爬取
    
     try:
         async with AsyncWebCrawler(config=browser_config) as crawler:
             print("Starting crawl...")
             result = await crawler.arun("https://image.baidu.com/search/index?tn=baiduimage&word=韩立", config=crawler_config)
             if result.success:
    		    print("提取到的图片链接:")
    		    for img_url in result.extracted_content.get('urls', []):
    		        print(img_url)
             else:
                 print("\nCrawl failed:", result.error_message)
             #显示token 等使用情况    
             llm_strategy.show_usage()
     except Exception as e:
         print(f"\nAn error occurred during crawling: {str(e)}")
    
    
    
    (2) 关键点解释
    1. 浏览器配置:

    2. 启用 JavaScript 以加载动态内容(百度图片依赖懒加载)。
    3. 设置合理的 User-Agent 避免被反爬。
    4. LLM 指令设计:

    5. 明确要求提取“含韩立的图片 URL”,并去重。
    6. 通过分步指令引导模型分析页面文本和图片上下文。
    7. 动态内容处理:

    8. 百度图片的链接通常隐藏在 data-json 属性或 JavaScript 渲染后的 DOM 中,需要确保浏览器完全加载页面。
    9. 如果实际效果不佳,可在 BrowserConfig 中添加自定义 JavaScript 代码触发滚动加载更多图片。
    (3) 常见问题
  • 反爬规避: 如果频繁被封,可增加 delay 参数或随机化 User-Agent。
  • 链接提取失败: 检查 extraction_instructions 是否清晰,或改用正则表达式直接从 HTML 中匹配图片 URL。
  • Ollama 连接问题: 确保本地服务运行且 base_url 正确。

  • 3. 扩展优化

  • 自定义 JavaScript 滚动加载:
    browser_config = BrowserConfig(
        # 其他参数...
        run_js=[
            "window.scrollTo(0, document.body.scrollHeight);",
            "setTimeout(() => {}, 2000);"  # 等待2秒加载
        ]
    )
    
  • 结果后处理:
    # 在提取后过滤非图片链接
    cleaned_urls = [url for url in result.extracted_content['urls'] if url.endswith(('.jpg', '.png'))]
    
  • 通过合理配置这四个类,您可以高效结合本地 LLM 的语义理解能力和爬虫的动态页面处理能力。

    4.crawl4ai 0.6.3 bug Issues1035 解决方法

    “”1. 这个类:utils.py 的def perform_completion_with_backoff 方法 要加上 api_base=base_url,代码**:

    这样我们在LLMConfig 中配置的 base_url就能起到作用,否则我们就会得到 OllamaException 连接错误
    bug解决办法

    2. 把extraction_strategy.py 注释掉一行

    把类 class LLMExtractionStrategy(ExtractionStrategy)
    的方法 def extract(self, url: str, ix: int, html: str) -> List[Dict[str, Any]]:
    中的:response = response.choices[0].message.content #注释掉就可以了。
    否则就会出现:[LOG] Error in LLM extraction: ‘str’ object has no attribute ‘choices’

    作者:AI懒虫

    物联沃分享整理
    物联沃-IOTWORD物联网 » Python高级应用之AI Agent开发详解:并行处理、Bug修复与最新crawl4ai 0.6.3及Deepseek-R1:8b网络图片获取实战指南

    发表回复