詳解AI采集框架Crawl4AI,打造智能網絡爬蟲

大家好,Crawl4AI作為開源Python庫,專門用來簡化網頁爬取和數據提取的工作。它不僅功能強大、靈活,而且全異步的設計讓處理速度更快,穩定性更好。無論是構建AI項目還是提升語言模型的性能,Crawl4AI都能幫您簡化工作流程。它可以直接在Python項目中使用,或者將其集成到REST API中,實現快速、穩定的數據爬取和處理。這樣,無論是數據的實時獲取還是后續的分析處理,都能更加得心應手。

1.快速使用

以下是個簡單的例子,展示了Crawl4AI強大的異步能力:

import?asyncio
from?crawl4ai?import?AsyncWebCrawlerasyncdef?main():# 初始化異步網頁爬蟲asyncwith?AsyncWebCrawler(verbose=True)?as?crawler:# 爬取指定的 URLresult =?await?crawler.arun(url="https://www.nbcnews.com/business")# 以 Markdown 格式顯示提取的內容print(result.markdown)# 執行異步主函數
if?__name__ ==?"__main__":asyncio.run(main())

解釋:

  • 導入庫:從crawl4ai庫中導入AsyncWebCrawlerasyncio模塊。

  • 創建異步上下文:使用異步上下文管理器實例化AsyncWebCrawler

  • 運行爬蟲:使用arun()?法異步爬取指定的 URL 并提取有意義的內容。

  • 打印結果:輸出提取的內容,格式化為 Markdown。

  • 執行異步函數:使用asyncio.run()執行異步的main函數。

2.特性亮點

Crawl4AI具備以下核心特性,讓網頁爬取和數據提取工作更加高效:

  • 開源免費:無額外費用,開源可信賴。

  • 快速性能:速度超越許多付費工具。

  • 多樣輸出:支持JSON、清潔HTML、Markdown格式。

  • 多URL并發:一次性處理多個網頁,提升效率。

  • 媒體提取:全面抓取圖片、音頻、視頻等。

  • 鏈接全收集:不遺漏任何內外鏈接。

  • 元數據抽取:深入提取網頁信息。

  • 自定義操作:自定義請求頭、認證,修改頁面后再爬取。

  • 用戶代理模擬:模擬不同設備訪問。

  • 頁面截圖:快速獲取網頁視覺快照。

  • JavaScript支持:執行JS獲取動態內容。

  • 數據結構化:精確提取結構化數據。

  • 智能提取技術:使用余弦聚類和LLM技術。

  • CSS選擇器:精準定位數據。

  • 指令優化:通過指令提升提取效果。

  • 代理配置:增強訪問權限和隱私保護。

  • 會話管理:輕松處理多頁爬取。

  • 異步架構:提升性能和可擴展性。

3.安裝指南

Crawl4AI提供了多種安裝方式,以適應不同的使用場景。以下是幾種常用的安裝方法:

3.1 基本安裝(推薦)

對于大多數網頁爬取和數據抓取任務,可以直接使用pip進行安裝:

pip install crawl4ai

這樣,默認安裝的是Crawl4AI的異步版本,使用Playwright進行網頁爬取。

如果安裝時遇到Playwright相關錯誤,可以通過以下命令手動安裝Playwright:

playwright install

或者,安裝特定版本的Chromium:

python -m playwright install chromium

3.2 同步版本安裝

如果需要使用Selenium的同步版本,可以使用以下命令:

pip install crawl4ai[sync]

3.3 開發者安裝

對于想要參與項目開發,修改源代碼的貢獻者,可以通過以下步驟進行安裝:

git clone https://github.com/unclecode/crawl4ai.git
cd crawl4ai
pip install -e .

4.高級應用

要想充分發揮Crawl4AI的能力,可以看看這些高級功能和應用案例:

4.1 執行JavaScript和使用CSS選擇器

可以利用Crawl4AI執行自定義JavaScript代碼,以及通過CSS選擇器精準定位頁面元素,從而提升爬取任務的效率和精確度。這讓你能夠更靈活地處理復雜的網頁數據抓取需求。

import?asyncio
from?crawl4ai?import?AsyncWebCrawlerasyncdef?main():asyncwith?AsyncWebCrawler(verbose=True)?as?crawler:js_code = ["const loadMoreButton = Array.from(document.querySelectorAll('button')).find(button => button.textContent.includes('Load More')); loadMoreButton && loadMoreButton.click();"]result =?await?crawler.arun(url="https://www.nbcnews.com/business",js_code=js_code,css_selector="article.tease-card",bypass_cache=True)print(result.extracted_content)if?__name__ ==?"__main__":asyncio.run(main())

4.2 使用代理

通過將爬取任務路由到代理,增強隱私和訪問權限。

import?asyncio
from?crawl4ai?import?AsyncWebCrawlerasync?def?main():async?with?AsyncWebCrawler(verbose=True, proxy="http://127.0.0.1:7890")?as?crawler:result =?await?crawler.arun(url="https://www.nbcnews.com/business",bypass_cache=True)print(result.markdown)if?__name__ ==?"__main__":asyncio.run(main())

4.3 不使用 LLM 提取結構化數據

使用JsonCssExtractionStrategy精確提取使用 CSS 選擇器的結構化數據。

import?asyncio
import?json
from?crawl4ai?import?AsyncWebCrawler
from?crawl4ai.extraction_strategy?import?JsonCssExtractionStrategyasyncdef?extract_news_teasers():schema = {"name":?"News Teaser Extractor","baseSelector":?".wide-tease-item__wrapper","fields": [{"name":?"category",?"selector":?".unibrow span[data-testid='unibrow-text']",?"type":?"text"},{"name":?"headline",?"selector":?".wide-tease-item__headline",?"type":?"text"},{"name":?"summary",?"selector":?".wide-tease-item__description",?"type":?"text"},{"name":?"time",?"selector":?"[data-testid='wide-tease-date']",?"type":?"text"},{"name":?"image","type":?"nested","selector":?"picture.teasePicture img","fields": [{"name":?"src",?"type":?"attribute",?"attribute":?"src"},{"name":?"alt",?"type":?"attribute",?"attribute":?"alt"},],},{"name":?"link",?"selector":?"a[href]",?"type":?"attribute",?"attribute":?"href"},],}extraction_strategy = JsonCssExtractionStrategy(schema, verbose=True)asyncwith?AsyncWebCrawler(verbose=True)?as?crawler:result =?await?crawler.arun(url="https://www.nbcnews.com/business",extraction_strategy=extraction_strategy,bypass_cache=True,)assert?result.success,?"Failed to crawl the page"news_teasers = json.loads(result.extracted_content)print(f"Successfully extracted?{len(news_teasers)}?news teasers")print(json.dumps(news_teasers[0], indent=2))if?__name__ ==?"__main__":asyncio.run(extract_news_teasers())

4.4 使用 OpenAI 提取結構化數據

利用 OpenAI 的能力動態提取和結構化數據:

import?os
import?asyncio
from?crawl4ai?import?AsyncWebCrawler
from?crawl4ai.extraction_strategy?import?LLMExtractionStrategy
from?pydantic?import?BaseModel, Fieldclass?OpenAIModelFee(BaseModel):model_name: str = Field(..., description="Name of the OpenAI model.")input_fee: str = Field(..., description="Fee for input token for the OpenAI model.")output_fee: str = Field(..., description="Fee for output token for the OpenAI model.")asyncdef?main():asyncwith?AsyncWebCrawler(verbose=True)?as?crawler:result =?await?crawler.arun(url='https://openai.com/api/pricing/',word_count_threshold=1,extraction_strategy=LLMExtractionStrategy(provider="openai/gpt-4
o",api_token=os.getenv('OPENAI_API_KEY'),?schema=OpenAIModelFee.schema(),extraction_type="schema",instruction="""From the crawled content, extract all mentioned model names along with their fees for input and output tokens.?Do not miss any models in the entire content. One extracted model JSON format should look like this:?{"model_name": "GPT-4", "input_fee": "US$10.00 / 1M tokens", "output_fee": "US$30.00 / 1M tokens"}."""), ? ? ? ? ? ?bypass_cache=True,)print(result.extracted_content)if?__name__ ==?"__main__":asyncio.run(main())

4.5 會話管理 & 動態內容爬取

處理復雜的場景,如爬取通過 JavaScript 加載動態內容的多個頁面:

import?asyncio
import?re
from?bs4?import?BeautifulSoup
from?crawl4ai?import?AsyncWebCrawlerasyncdef?crawl_typescript_commits():first_commit =?""asyncdef?on_execution_started(page):nonlocal?first_commit?try:whileTrue:await?page.wait_for_selector('li.Box-sc-g0xbh4-0 h4')commit =?await?page.query_selector('li.Box-sc-g0xbh4-0 h4')commit =?await?commit.evaluate('(element) => element.textContent')commit = re.sub(r'\s+',?'', commit)if?commit?and?commit != first_commit:first_commit = commitbreakawait?asyncio.sleep(0.5)except?Exception?as?e:print(f"Warning: New content didn't appear after JavaScript execution:?{e}")asyncwith?AsyncWebCrawler(verbose=True)?as?crawler:crawler.crawler_strategy.set_hook('on_execution_started', on_execution_started)url =?"https://github.com/microsoft/TypeScript/commits/main"session_id =?"typescript_commits_session"all_commits = []js_next_page =?"""const button = document.querySelector('a[data-testid="pagination-next-button"]');if (button) button.click();"""for?page?in?range(3): ?# Crawl 3 pagesresult =?await?crawler.arun(url=url,session_id=session_id,css_selector="li.Box-sc-g0xbh4-0",js=js_next_page?if?page >?0elseNone,bypass_cache=True,js_only=page >?0)assert?result.success,?f"Failed to crawl page?{page +?1}"soup = BeautifulSoup(result.cleaned_html,?'html.parser')commits = soup.select("li.Box-sc-g0xbh4-0")all_commits.extend(commits)print(f"Page?{page +?1}: Found?{len(commits)}?commits")await?crawler.crawler_strategy.kill_session(session_id)print(f"Successfully crawled?{len(all_commits)}?commits across 3 pages")if?__name__ ==?"__main__":asyncio.run(crawl_typescript_commits())

5.性能對比

Crawl4AI在設計上注重速度和效率,性能持續超越許多付費服務。以下是性能測試結果:

要點總結:

  • 簡單爬取:Crawl4AI的速度是Firecrawl的4倍以上。

  • 帶JavaScript執行:即使在執行JavaScript加載更多內容的情況下(圖片數量增加一倍),Crawl4AI的速度依然遠超Firecrawl的簡單爬取。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/74727.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/74727.shtml
英文地址,請注明出處:http://en.pswp.cn/web/74727.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

從零開始玩python--python版植物大戰僵尸來襲

大家好呀,小伙伴們!今天要給大家介紹一個超有趣的Python項目 - 用pygame制作植物大戰僵尸游戲的進階版本。相信不少小伙伴都玩過這款經典游戲,今天我們就用Python來實現它,讓編程學習變得更加有趣!🌟 一、…

圖解AUTOSAR_SWS_FlashTest

AUTOSAR Flash Test模塊詳解 基于AUTOSAR 4.4.0規范的Flash測試模塊分析與圖解 目錄 概述 1.1 Flash Test模塊的作用 1.2 工作原理架構設計 2.1 整體架構 2.2 依賴關系狀態管理 3.1 狀態轉換圖 3.2 前臺與后臺測試模式配置結構 4.1 配置類圖 4.2 關鍵配置參數交互流程 5.1 序列…

【mongodb】mongodb的字段類型

目錄 1. 基本數據類型1.1 String1.2 Number1.3 Boolean1.4 Date1.5 Null1.6 ObjectId1.7 Array1.8 Binary Data1.9 Object 2. 特殊數據類型2.1 Regular Expression2.2 JavaScript2.3 Symbol2.4 Decimal1282.5 Timestamp2.6 MinKey/MaxKey2.7 DBPointer 3. 常用字段類型示例4. 注…

MySQL篇(五)MySQL主從同步原理深度剖析

MySQL篇(五)MySQL主從同步原理深度剖析 MySQL篇(五)MySQL主從同步原理深度剖析一、引言二、MySQL主從同步基礎概念主庫(Master)從庫(Slave)二進制日志(Binary Log&#x…

論文學習16:Learning Transferable Visual Models From Natural Language Supervision

代碼來源 Learning Transferable Visual Models From Natural Language Supervisionhttps://arxiv.org/pdf/2103.00020 模塊作用 當前最先進的計算機視覺系統被訓練用于預測一組固定的、預先定義的目標類別。這種受限的監督方式限制了它們的通用性和可用性,因為要…

[MySQL初階]MySQL(9)事務機制

標題:[MySQL初階]MySQL(9)事物機制 水墨不寫bug 文章目錄 一、認識事務1、多線程訪問數據庫出現的問題2、對CURD的限制是通過事務機制實現的3、事務的四個屬性4、哪些引擎支持事務 二、事務的提交與autocommit設置三、事務的隔離性和隔離級別…

spring-cloud-alibaba-nacos-config使用說明

一、核心功能與定位 Spring Cloud Alibaba Nacos Config 是 Spring Cloud Alibaba 生態中的核心組件之一,專為微服務架構提供動態配置管理能力。它通過整合 Nacos 的配置中心功能,替代傳統的 Spring Cloud Config,提供更高效的配置集中化管理…

SonarQube數據庫配置

SonarQube部署完成后,在瀏覽器地址欄輸入http://IP:9000可以進入登錄頁面,以本機運行為例,地址為http://127.0.0.1:9000/,默認登錄名:admin,登錄密碼也是admin。登錄后會要求設置密碼: 按要求設…

醫藥檔案區塊鏈系統

1. 醫生用戶模塊?? ??目標用戶??:醫護人員 ??核心功能??: ??檢索檔案??:通過關鍵詞或篩選條件快速定位患者健康檔案。??請求授權??:向個人用戶發起檔案訪問權限申請,需經對方確認。??查看檔案?…

CSS3學習教程,從入門到精通, 化妝品網站 HTML5 + CSS3 完整項目(26)

化妝品網站 HTML5 CSS3 完整項目 下面是一個完整的化妝品網站項目,包含主頁、登錄頁面和注冊頁面。我將按照您的要求提供詳細的代碼和注釋。 1. 網站規劃與需求分析 需求分析 展示化妝品產品信息提供用戶注冊和登錄功能響應式設計,適配不同設備美觀…

ROS2 多機時間同步(Chrony配置簡明指南)

適用場景: 主機運行 ROS2 Humble(發布 /scan 等),板子運行 ROS2 Foxy(發布 /tf 等),兩邊通過 ROS_DOMAIN_ID 跨平臺通訊。需要保證系統時間對齊,避免 TF 插值失敗、建圖抖動等問題。…

Nginx配置偽靜態,URL重寫

Nginx配置偽靜態,URL重寫 [ Nginx ] 在Nginx低版本中,是不支持PATHINFO的,但是可以通過在Nginx.conf中配置轉發規則實現: location / { // …..省略部分代碼if (!-e $request_filename) {rewrite ^(.*)$ /index.php?s/$1 l…

電路筆記(元器件):ADC LTC系列模數轉換器的輸出范圍+滿量程和偏移調整

LTC1740(LTC1740官方文檔)是Analog Devices(原Linear Technology)公司生產的一款高性能、低功耗的14位模數轉換器(ADC)。它通常用于需要高精度和快速采樣率的應用中,如通信系統、數據采集設備等。同類產品 LTC1746:一款14位、40Ms…

續-算法-數學知識

3、歐拉函數 1、定義: 1~n 中與 n 互質的數的個數 例如:6 的有 1 2 3 4 5 6 其中,與 n 互質 的 數的個數為 2個分別是:1、5 2、計算: $ N p_1^{a1} p_2^{a2} p_3^{a3} … p_k^{ak} $(例如&#x…

C/C++測試框架googletest使用示例

文章目錄 文檔編譯安裝示例參考文章 文檔 https://github.com/google/googletest https://google.github.io/googletest/ 編譯安裝 googletest是cmake項目,可以用cmake指令編譯 cmake -B build && cmake --build build將編譯產物lib和include 兩個文件夾…

LintCode第974題-求矩陣各節點的最短路徑(以0為標準)

描述 給定一個由0和1組成的矩陣,求每個單元格最近的0的距離。 兩個相鄰細胞之間的距離是1。 給定矩陣的元素數不超過10,000。 在給定的矩陣中至少有一個0。 單元格在四個方向上相鄰:上,下,左和右。 樣例 例1: 輸入: [[0,0,0],[0,0,0],[0…

Redis核心機制-緩存、分布式鎖

目錄 緩存 緩存更新策略 定期生成 實時生成 緩存問題 緩存預熱(Cache preheating) 緩存穿透(Cache penetration) 緩存雪崩(Cache avalanche) 緩存擊穿(Cache breakdown) 分…

CF每日5題(1300-1500)

最近急速補練藍橋杯中,疏于cf練習。 感覺自己過題還是太慢了。 今日水題,我水水水水。 1- 1979C lcm 水 1400 第 i i i局贏了,1個硬幣頂 k [ i ] k[i] k[i]個貢獻,所以每局分硬幣 x i 1 k [ i ] x_i{1\over k[i]} xi?k[i]1?個…

從代碼學習深度學習 - LSTM PyTorch版

文章目錄 前言一、數據加載與預處理1.1 代碼實現1.2 功能解析二、LSTM介紹2.1 LSTM原理2.2 模型定義代碼解析三、訓練與預測3.1 訓練邏輯代碼解析3.2 可視化工具功能解析功能結果總結前言 深度學習中的循環神經網絡(RNN)及其變種長短期記憶網絡(LSTM)在處理序列數據(如文…

easy-poi 一對多導出

1. 需求: 某一列上下兩行單元格A,B值一樣且這兩個單元格, 前面所有列對應單元格值一樣的話, 就對A,B 兩個單元格進行縱向合并單元格 1. 核心思路: 先對數據集的國家,省份,城市...... id 身份證進行排序…