环境:dify 14.2 docker 版本;

工具:craw4ai

模型:glm-4-flash

一、背景

Dify 中内置了知名的页面爬取工具 jina,该工具可用于爬取网页内容,并进行清洗以及转化为 markdown 格式,用于后续的大模型处理。不过,在国内的网络环境中,其使用体验不尽如人意,常常会因超时问题而导致页面内容爬取失败。

二、解决思路

采用本地化部署开源爬虫工具 craw4ai,并借助 flask 提供 api 接口服务。在 dify 中以自定义工具或者代码工具的方式读取网页链接,取代 jina,以此完成工作流中的网页爬取任务,进而增强工作流的稳定性。

三、准备工作
  1. 安装 flask,craw4ai 和 aiohttp 包;

    pip install flask aiohttp crawl4ai
    
  2. 自定义 craw4ai 接口服务,端口指定为 20009,记得开启防火墙端口:

    创建文件 craw4.py:

    from flask import Flask, request, jsonify
    import asyncio
    from crawl4ai import AsyncWebCrawler
    import aiohttp
    import urllib.parse
    
    app = Flask(__name__)
    
    # 设置响应头部,确保返回的JSON是UTF-8编码
    app.config['JSON_AS_ASCII'] = False
    app.config['JSONIFY_MIMETYPE'] = 'application/json; charset=utf-8'
    
    @app.route('/fetch_content', methods=['GET'])
    def fetch_content():
        url = request.args.get('url')
        if not url:
            return jsonify({'error': 'URL参数是必需的'}), 400
    
        # 验证URL是否有效(简单的检查,实际应用中可能需要更复杂的验证)
        try:
            result = urllib.parse.urlparse(url)
            if not all([result.scheme, result.netloc]):
                return jsonify({'error': '无效的URL'}), 400
        except ValueError:
            return jsonify({'error': '无效的URL'}), 400
    
        try:
            loop = asyncio.new_event_loop()
            asyncio.set_event_loop(loop)
            result = loop.run_until_complete(fetch_url_content(url))
            return jsonify({'content': result}), 200
        except aiohttp.ClientError as e:
            return jsonify({'error': '网络错误:' + str(e)}), 500
        except Exception as e:
            return jsonify({'error': '发生错误:' + str(e)}), 500
    
    async def fetch_url_content(url):
        try:
            async with AsyncWebCrawler(verbose=True) as crawler:
                result = await crawler.arun(
                    url=url,
                    bypass_cache=True,
                    magic=True,
                    word_count_threshold=10,        # Minimum words per block
                    exclude_external_links=True,    # Remove external links
                    exclude_external_images=True,   # Remove external images
                    excluded_tags=['form', 'nav'],   # Remove specific HTML tags)
                    remove_overlay_elements=True
                    )
                # 确保返回的文本是UTF-8编码
                # return result.markdown.encode('utf-8').decode('utf-8')
                return result.markdown
        except Exception as e:
            raise Exception(f"从{url}获取内容失败:{str(e)}")
    
    if __name__ == '__main__':
        app.run(debug=True, host='0.0.0.0', port=20009)
    
  3. 启动服务:

    python craw4.py
    
  4. 测试接口:可以直接用浏览器访问地址:http://你的 ip 地址:20009/fetch_content?url=爬取地址;

    例如:http://192.168.3.86:20009/fetch_content?url=https://www.36kr.com/p/3018968349779203

四、Dify 工作流应用
  1. 我们以使用代码工具为例,介绍如何在 dify 中使用 craw4ai 接口服务;

    import requests
    import re
    
    def main(arg1: str) -> dict:
        try:
            # 构造请求的URL和参数
            url = 'http://192.168.3.86:20009/fetch_content'
            test_url = arg1
    
            # 发送GET请求
            response = requests.get(url, params={'url': test_url})
    
            # 检查响应状态码
            if response.status_code == 200:
                # 请求成功,处理结果
                result = response.json()
                # 将结果转换为字符串
                result_str = str(result)
    
                # 移除字符串中的所有链接格式
                result_str = re.sub(r'http\S+', '', result_str)
    
                # 检查结果长度并截断至80000字以内
                if len(result_str) > 80000:
                    result_str = result_str[:80000] + '... (截断)'
                return {
                    "result": result_str
                }
            else:
                # 请求失败,返回错误信息
                error_msg = response.json().get('error', 'Unknown error')
                return {
                    "result": str(error_msg)
                }
        except requests.RequestException as e:
            # 网络请求异常,返回异常信息
            error_msg = f"请求失败:{str(e)}"
            return {
                "result": error_msg
            }
    
  2. 通过代码调用 craw4ai 接口服务,并在下一步中将获取到的内容传递给大模型,让大模型进行分析和输出。

五、应用效果

关注微信公众号【红岸解码室】,发送“网页助理”,获取网页助理 DSL 文件!

Logo

GitCode 天启AI是一款由 GitCode 团队打造的智能助手,基于先进的LLM(大语言模型)与多智能体 Agent 技术构建,致力于为用户提供高效、智能、多模态的创作与开发支持。它不仅支持自然语言对话,还具备处理文件、生成 PPT、撰写分析报告、开发 Web 应用等多项能力,真正做到“一句话,让 Al帮你完成复杂任务”。

更多推荐