ai agent(智能体)开发 python高级应用7: crawl4ai 0.6.3 加re正则表达式 获取百度中含有 韩立的图片要求横屏图片

遗憾本来想用ollama 本地模型 deepseek-r1:8b来获取 百度中含有 韩立的图片要求横屏图片 可惜“deepseek-r1:8b” 能力有限 只能换成 用Python re 正则表达式来解决问题了。

1. 直接处理 Markdown字符串 的优化代码,完美适配 crawl4ai 返回的字符串格式:

import asyncio
from crawl4ai import *
import re


def parse_crawl4ai_md(md_content: str):
    """
    解析 crawl4ai 返回的Markdown字符串
    参数:
        md_content (str): Markdown字符串
    返回:
        list: 前5个含"韩立"且宽>高的图片地址
    """
    # 匹配图片地址和标题(适配crawl4ai结构)
    pattern = r'\* \[!\[\]\(([^)]+)\)[^\[]*?\[([^\]]+)\]'
    matches = re.findall(pattern, md_content)

    # 双重过滤(标题含"韩立" + 宽高比)
    results = []
    for url, title in matches:
        if '韩立' not in title:
            continue

        # 从URL参数解析尺寸(兼容多种格式)
        size_match = re.search(r'[?&](?:w|width)=(\d+).*?[?&](?:h|height)=(\d+)', url)
        if not size_match:
            continue

        try:
            w, h = map(int, size_match.groups())
            if w > h:  # 核心筛选条件
                results.append(url.split('?')[0])  # 移除参数保留干净URL
        except:
            pass

    # 去重并返回前5个
    return list(dict.fromkeys(results))[:5]

async def main():
    print("\n--- Using CSS Selectors ---")
    browser_config = BrowserConfig(headless=False)
    crawler_config = CrawlerRunConfig(
        #waterfall_Pq6qh
        cache_mode=CacheMode.BYPASS,
        css_selector=".page-content_11Pd_"
    )
    async with AsyncWebCrawler(config=browser_config) as crawler:

        result = await crawler.arun(
            url='https://image.baidu.com/search/index?tn=baiduimage&fm=result&ie=utf-8&word=%E9%9F%A9%E7%AB%8B%E5%9B%BE%E7%89%87',
           config=crawler_config,
        )
        print(result.markdown)
        # 调用解析函数
        images = parse_crawl4ai_md(result.markdown)

        # 打印结果
        print("解析结果:")
        for i, url in enumerate(images, 1):
            print(f"{i}. {url}")


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

2. 代码重点说明:

  1. 零文件依赖
    直接处理内存中的Markdown字符串,无需生成临时文件

  2. 智能尺寸解析
    正则 r'[?&](?:w|width)=(\d+).*?[?&](?:h|height)=(\d+)' 支持多种参数格式:

    • ?w=800&h=600
    • &width=1200&height=800
    • ?h=300&w=400(顺序无关)
  3. 工业级健壮性

    • try-except 防御非法尺寸参数
    • dict.fromkeys() 去重同时保留顺序
    • url.split('?')[0] 清理跟踪参数
  4. 高性能处理
    单次正则扫描完成数据提取,时间复杂度 O(n)


3. 结果展示:

解析结果:
1. https://img1.baidu.com/it/u=457309065,2031518686&fm=253&fmt=auto&app=120&f=JPEG
2. https://img0.baidu.com/it/u=4284382542,1530607746&fm=253&fmt=auto&app=120&f=JPEG
3. https://img1.baidu.com/it/u=937583500,4077626415&fm=253&fmt=auto&app=120&f=JPEG
4. https://img2.baidu.com/it/u=2235209624,3474576670&fm=253&fmt=auto&app=120&f=JPEG
5. https://img0.baidu.com/it/u=1099097691,2461365158&fm=253&fmt=auto&app=120&f=JPEG

4. 进阶优化方向:

  1. 动态尺寸验证
    添加HTTP HEAD请求验证实际图片尺寸:

    import requests
    def verify_real_size(url):
        try:
            resp = requests.head(url, timeout=2, allow_redirects=True)
            if resp.status_code == 200:
                content_type = resp.headers.get('Content-Type', '')
                if 'image/' in content_type:
                    # 从Header或解析二进制获取真实尺寸
                    return (width, height) 
        except:
            return (0, 0)
    
  2. 异步处理(非必需)
    使用 asyncio + aiohttp 加速批量验证:

    import aiohttp
    async def async_verify(url):
        async with aiohttp.ClientSession() as session:
            async with session.head(url) as resp:
                # 获取尺寸逻辑
                return await process_response(resp)
    
  3. 缓存机制(非必需)
    lru_cache 缓存已解析的URL尺寸信息:

    from functools import lru_cache
    @lru_cache(maxsize=1000)
    def get_cached_size(url):
        return verify_real_size(url)
    

    4. 要是能升级显卡硬件的话,本地:deepseek-r1 就会更聪明

    比如:rtx4090 48G

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一刀到底211

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值