Crawl4AI旧版系统:同步爬虫与Selenium集成兼容层
旧版系统架构概述
Crawl4AI旧版系统采用同步架构设计,核心实现位于crawl4ai/legacy/web_crawler.py文件中。该系统提供了基于Selenium的网页抓取能力,支持缓存机制、内容提取和多线程处理,适用于需要模拟真实浏览器行为的场景。
系统主要包含以下组件:
- WebCrawler类:核心爬虫控制器,协调缓存、内容提取和策略执行
- CrawlerStrategy接口:定义爬虫行为规范,支持不同抓取策略实现
- LocalSeleniumCrawlerStrategy:基于Selenium的本地浏览器抓取策略
- 缓存系统:通过SQLite数据库实现网页内容缓存,减少重复请求
Selenium集成实现
Selenium集成是旧版系统的核心功能,具体实现位于crawl4ai/legacy/crawler_strategy.py文件中。LocalSeleniumCrawlerStrategy类通过以下方式实现浏览器自动化:
浏览器配置优化
self.options = Options()
self.options.headless = True
self.options.add_argument("--disable-gpu")
self.options.add_argument("--window-size=1920,1080")
self.options.add_argument("--no-sandbox")
self.options.add_argument("--disable-dev-shm-usage")
self.options.add_argument("--disable-blink-features=AutomationControlled")
系统默认启用无头模式(Headless)以提高性能,但提供了智能降级机制:当检测到页面无法在无头模式下加载时,会自动切换到有头模式:
if html == "<html><head></head><body></body></html>":
print("[LOG] 🙌 Page could not be loaded in headless mode. Trying non-headless mode...")
options = Options()
options.headless = False
driver = webdriver.Chrome(service=self.service, options=options)
核心抓取流程
抓取流程主要通过crawl方法实现,包含以下关键步骤:
- 执行前置钩子函数(before_get_url)
- 加载目标URL并等待页面完全加载
- 执行页面滚动以触发动态内容加载
- 执行后置钩子函数(after_get_url)
- 获取并处理页面HTML内容
- 缓存抓取结果
self.driver.get(url)
WebDriverWait(self.driver, 20).until(
lambda d: d.execute_script("return document.readyState") == "complete"
)
self.driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
html = sanitize_input_encode(self._ensure_page_load())
反检测机制
为避免被网站识别为自动化程序,系统实现了多项反检测措施:
- 禁用自动化控制特征(
--disable-blink-features=AutomationControlled) - 设置真实浏览器User-Agent
- 实现页面加载状态检测而非固定等待
- 支持自定义HTTP头和Cookie注入
缓存系统设计
旧版系统采用文件系统+SQLite的混合缓存策略,位于WebCrawler类的初始化方法中:
self.crawl4ai_folder = os.path.join(
os.getenv("CRAWL4_AI_BASE_DIRECTORY", Path.home()), ".crawl4ai"
)
os.makedirs(self.crawl4ai_folder, exist_ok=True)
os.makedirs(f"{self.crawl4ai_folder}/cache", exist_ok=True)
init_db()
缓存键基于URL的MD5哈希生成,实现如下:
url_hash = hashlib.md5(url.encode()).hexdigest()
cache_file_path = os.path.join(
os.getenv("CRAWL4_AI_BASE_DIRECTORY", Path.home()),
".crawl4ai",
"cache",
url_hash,
)
缓存系统支持三种操作模式:
- 强制抓取(绕过缓存)
- 优先使用缓存
- 条件更新缓存
内容处理流程
系统提供完整的内容提取和处理流程,位于WebCrawler的process_html方法中:
- HTML内容清洗与标准化
- Markdown转换
- 语义块提取
- 媒体资源识别
- 结果缓存
核心代码如下:
result = scrapping_strategy.scrap(
url,
html,
word_count_threshold=word_count_threshold,
css_selector=css_selector,
only_text=kwargs.get("only_text", False),
image_description_min_word_threshold=kwargs.get(
"image_description_min_word_threshold",
IMAGE_DESCRIPTION_MIN_WORD_THRESHOLD,
),
**extra_params,
)
多线程支持
系统通过ThreadPoolExecutor实现多URL并行抓取,位于fetch_pages方法:
with ThreadPoolExecutor() as executor:
results = list(
executor.map(
fetch_page_wrapper,
url_models,
[provider] * len(url_models),
[api_token] * len(url_models),
[extract_blocks_flag] * len(url_models),
[word_count_threshold] * len(url_models),
[css_selector] * len(url_models),
[screenshot] * len(url_models),
[use_cached_html] * len(url_models),
[extraction_strategy] * len(url_models),
[chunking_strategy] * len(url_models),
*[kwargs] * len(url_models),
)
)
迁移指南
如果需要从旧版同步爬虫迁移到新版异步架构,建议参考以下资源:
- 官方文档:PROGRESSIVE_CRAWLING.md
- 异步示例:docs/examples/async_webcrawler_multiple_urls_example.py
- API变更:CHANGELOG.md
典型使用场景
基础网页抓取
from crawl4ai.legacy.web_crawler import WebCrawler
from crawl4ai.legacy.extraction_strategy import BasicExtractionStrategy
crawler = WebCrawler()
result = crawler.run(
url="https://example.com",
extraction_strategy=BasicExtractionStrategy(),
word_count_threshold=100
)
print(result.markdown)
带截图功能的抓取
result = crawler.run(
url="https://example.com",
screenshot=True
)
# 保存截图
with open("screenshot.jpg", "wb") as f:
f.write(base64.b64decode(result.screenshot))
多URL并行抓取
from crawl4ai.legacy.models import UrlModel
url_models = [UrlModel(url="https://example.com"), UrlModel(url="https://example.org")]
results = crawler.fetch_pages(url_models)
性能优化建议
- 合理设置缓存策略:根据内容更新频率调整缓存过期策略
- 优化线程池大小:根据目标网站并发限制调整线程数量
- 使用自定义CSS选择器:通过css_selector参数只提取关键内容
- 调整滚动策略:对于长页面,可通过JS代码实现分段滚动
- 启用用户代理轮换:减少被目标网站封禁的风险
常见问题解决
1. 页面加载不完整
解决方案:启用等待条件或增加滚动次数
result = crawler.run(
url="https://example.com",
wait_for="#content" # 等待特定CSS选择器出现
)
2. 被网站识别为机器人
解决方案:
from crawl4ai.user_agent_generator import generate_user_agent
crawler = WebCrawler()
crawler.run(
url="https://example.com",
user_agent=generate_user_agent()
)
3. 内存占用过高
解决方案:定期清理缓存并限制并发数
# 限制最大并发数为5
with ThreadPoolExecutor(max_workers=5) as executor:
# 执行抓取任务
总结
Crawl4AI旧版同步爬虫系统通过Selenium实现了强大的网页抓取能力,提供了缓存机制、内容提取和反检测功能,适用于需要模拟真实浏览器行为的场景。虽然新版已转向异步架构,但旧版系统仍然在兼容性和稳定性方面具有优势,特别是对于需要与现有同步代码集成的项目。
如需了解更多细节,请参考以下资源:
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



