scrape-it-now

clemlesneApache-2.0长期未更新

面向 AI 场景的命令行网页抓取工具,可并行运行,把网页内容转成高质量 Markdown,方便喂给大模型或做知识库。

Web scraper made for AI and simplicity in mind. It runs as a CLI that can be parallelized and outputs high-quality markdown content.

v3.0.4发布于 2024-12-05 15:19 UTC542star21fork同步于 2026-11-07 07:34 UTC

怎么上手

由 README 提炼,执行前请确认
python3 -m pip install scrape-it-now
scrape-it-now --help
硬件要求按 README 说明

README 未说明显存或 GPU 要求;抓取依赖 Playwright 与 Chromium 渲染页面,源码运行需 Python 3.13 或更高版本。

下载:源码 zip·GitHub Releases(安装包)本站不镜像安装包

项目说明

由 README 自动翻译提炼

面向 AI 的网页抓取 CLI,把网站转成高质量 markdown 并可直接建语义索引

面向 AI 场景的命令行网页抓取工具,可并行运行,把网页内容转成高质量 Markdown,方便喂给大模型或做知识库。

核心能力

  • 用 Pandoc 将页面正文抽取为 markdown
  • 用 Playwright 加 Chromium 渲染动态 JavaScript 内容
  • 检测并去重链接,按深度递归抓取整站
  • 用 sqlite 或 Azure Queue 解耦任务,支持并行幂等运行
  • 用 OpenAI embedding 分块嵌入并写入 Azure AI Search

容易踩的坑

索引功能依赖 Azure OpenAI 与 Azure AI Search,需先配置对应环境变量;默认走 Azure Blob/Queue,本地运行要显式设 BLOB_PROVIDER=local_disk 和 QUEUE_PROVIDER=local_disk;首次运行会提示安装依赖,可能耗时数分钟。

内容由模型根据 README 生成,可能不完整或不准确,以官方文档为准。看原文 README

最近发版

5 个版本v3.0.4
  1. v3.0.4scrape-it-now v3.0.4最新正式版2024-12-05 · 2024-12-05 15:19 UTC
  2. v3.0.3scrape-it-now v3.0.32024-12-04 · 2024-12-04 22:37 UTC
    查看更新说明
  3. v3.0.2scrape-it-now v3.0.22024-11-09 · 2024-11-09 12:56 UTC
    查看更新说明
  4. v3.0.1scrape-it-now v3.0.12024-11-09 · 2024-11-09 12:40 UTC
    查看更新说明
  5. v3.0.0scrape-it-now v3.0.02024-11-09 · 2024-11-09 12:23 UTC
    查看更新说明

用户点评

登录用户的真实使用记录,可按版本和硬件筛选
共 0 条

    还没有人点评。第一个说出真实体验的人最有价值。

    README 原文

    未翻译

    🛰️ Scrape It Now!

    Web scraper made for AI and simplicity in mind. It runs as a CLI that can be parallelized and outputs high-quality markdown content.

    GitHub last release date GitHub project license PyPI package version PyPI supported Python versions

    Features

    Shared:

    Scraper:

    • 🛑 Avoid re-scraping a page if it hasn't changed
    • 🚫 Block ads to lower network costs with The Block List Project
    • 🔗 Explore pages in depth by detecting links and de-duplicating them
    • ✍️ Extract markdown content from a page with Pandoc
    • 🏷️ Extract metadata elements from the page
    • 🖥️ Load dynamic JavaScript content with Playwright and Chromium
    • 🕵️‍♂️ Preserve anonymity with a random user agent, random viewport size, and no client hints headers
    • 📊 Show progress with a status command
    • 🖼️ Store images collected on the page
    • 📸 Store screenshot of the page
    • 📡 Track progress of total network usage

    Indexer:

    • 🧠 AI Search index is created automatically
    • ✂️ Chunk markdown while keeping the content coherent
    • 📈 Embed chunks with OpenAI embeddings
    • 🔍 Indexed content is semantically searchable with Azure AI Search

    Installation

    From PyPI

    # Install the package
    python3 -m pip install scrape-it-now
    # Run the CLI
    scrape-it-now --help
    

    To configure the CLI (including authentication to the backend services), use environment variables, a .env file or command line options.

    From sources

    Application must be run with Python 3.13 or later. If this version is not installed, an easy way to install it is pyenv.

    # Download the source code
    git clone https://github.com/clemlesne/scrape-it-now.git
    # Move to the directory
    cd scrape-it-now
    # Run install scripts
    make install dev
    # Run the CLI
    scrape-it-now --help
    

    How to use

    Scrape a website

    Run a job

    Usage with Azure Blob Storage and Azure Queue Storage:

    # Azure Storage configuration
    export AZURE_STORAGE_ACCESS_KEY=xxx
    export AZURE_STORAGE_ACCOUNT_NAME=xxx
    # Run the job
    scrape-it-now scrape run https://nytimes.com
    

    Usage with Local Disk Blob and Local Disk Queue:

    # Local disk configuration
    export BLOB_PROVIDER=local_disk
    export QUEUE_PROVIDER=local_disk
    # Run the job
    scrape-it-now scrape run https://nytimes.com
    

    Example:

    ❯ scrape-it-now scrape run https://nytimes.com
    2024-11-08T13:18:49.169320Z [info     ] Start scraping job lydmtyz
    2024-11-08T13:18:49.169392Z [info     ] Installing dependencies if needed, this may take a few minutes
    2024-11-08T13:18:52.542422Z [info     ] Queued 1/1 URLs
    2024-11-08T13:18:58.509221Z [info     ] Start processing https://nytimes.com depth=1 process=scrape-lydmtyz-4 task=63dce50
    2024-11-08T13:19:04.173198Z [info     ] Loaded 154554 ads and trackers process=scrape-lydmtyz-4
    2024-11-08T13:19:16.393045Z [info     ] Queued 310/311 URLs            depth=1 process=scrape-lydmtyz-4 task=63dce50
    2024-11-08T13:19:16.393323Z [info     ] Scraped                        depth=1 process=scrape-lydmtyz-4 task=63dce50
    ...
    

    Most frequent options are:

    OptionsDescriptionEnvironment variable
    --azure-storage-access-key-asakAzure Storage access keyAZURE_STORAGE_ACCESS_KEY
    --azure-storage-account-name-asanAzure Storage account nameAZURE_STORAGE_ACCOUNT_NAME
    --blob-provider-bpBlob providerBLOB_PROVIDER
    --job-name-jnJob nameJOB_NAME
    --max-depth-mdMaximum depthMAX_DEPTH
    --queue-provider-qpQueue providerQUEUE_PROVIDER
    --save-images-siSave imagesSAVE_IMAGES
    --save-screenshot-ssSave screenshotSAVE_SCREENSHOT
    --whitelist-wWhitelistWHITELIST

    For documentation on all available options, run:

    scrape-it-now scrape run --help
    
    Show job status

    Usage with Azure Blob Storage:

    # Azure Storage configuration
    export AZURE_STORAGE_CONNECTION_STRING=xxx
    # Show the job status
    scrape-it-now scrape status [job_name]
    

    Usage with Local Disk Blob:

    # Local disk configuration
    export BLOB_PROVIDER=local_disk
    # Show the job status
    scrape-it-now scrape status [job_name]
    

    Example:

    ❯ scrape-it-now scrape status lydmtyz
    {"created_at":"2024-11-08T13:18:52.839060Z","last_updated":"2024-11-08T13:19:16.528370Z","network_used_mb":2.6666793823242188,"processed":1,"queued":311}
    

    Most frequent options are:

    OptionsDescriptionEnvironment variable
    --azure-storage-access-key-asakAzure Storage access keyAZURE_STORAGE_ACCESS_KEY
    --azure-storage-account-name-asanAzure Storage account nameAZURE_STORAGE_ACCOUNT_NAME
    --blob-provider-bpBlob providerBLOB_PROVIDER

    For documentation on all available options, run:

    scrape-it-now scrape status --help
    

    Index a scraped website

    Run a job

    Usage with Azure Blob Storage, Azure Queue Storage and Azure AI Search:

    # Azure OpenAI configuration
    export AZURE_OPENAI_API_KEY=xxx
    export AZURE_OPENAI_EMBEDDING_DEPLOYMENT_NAME=xxx
    export AZURE_OPENAI_EMBEDDING_DIMENSIONS=xxx
    export AZURE_OPENAI_EMBEDDING_MODEL_NAME=xxx
    export AZURE_OPENAI_ENDPOINT=xxx
    
    # Azure Search configuration
    export AZURE_SEARCH_API_KEY=xxx
    export AZURE_SEARCH_ENDPOINT=xxx
    
    # Azure Storage configuration
    export AZURE_STORAGE_ACCESS_KEY=xxx
    export AZURE_STORAGE_ACCOUNT_NAME=xxx
    
    # Run the job
    scrape-it-now index run [job_name]
    

    Usage with Local Disk Blob, Local Disk Queue and Azure AI Search:

    # Azure OpenAI configuration
    export AZURE_OPENAI_API_KEY=xxx
    export AZURE_OPENAI_EMBEDDING_DEPLOYMENT_NAME=xxx
    export AZURE_OPENAI_EMBEDDING_DIMENSIONS=xxx
    export AZURE_OPENAI_EMBEDDING_MODEL_NAME=xxx
    export AZURE_OPENAI_ENDPOINT=xxx
    # Azure Search configuration
    export AZURE_SEARCH_API_KEY=xxx
    export AZURE_SEARCH_ENDPOINT=xxx
    # Local disk configuration
    export BLOB_PROVIDER=local_disk
    export QUEUE_PROVIDER=local_disk
    # Run the job
    scrape-it-now index run [job_name]
    

    Example:

    ❯ scrape-it-now index run lydmtyz
    2024-11-08T13:20:37.129411Z [info     ] Start indexing job lydmtyz
    2024-11-08T13:20:38.945954Z [info     ] Start processing https://nytimes.com process=index-lydmtyz-4 task=63dce50
    2024-11-08T13:20:39.162692Z [info     ] Chunked into 7 parts           process=index-lydmtyz-4 task=63dce50
    2024-11-08T13:20:42.407391Z [info     ] Indexed 7 chunks               process=index-lydmtyz-4 task=63dce50
    ...
    

    Most frequent options are:

    OptionsDescriptionEnvironment variable
    --azure-openai-api-key-aoakAzure OpenAI API keyAZURE_OPENAI_API_KEY
    --azure-openai-embedding-deployment-name-aoednAzure OpenAI embedding deployment nameAZURE_OPENAI_EMBEDDING_DEPLOYMENT_NAME
    --azure-openai-embedding-dimensions-aoedAzure OpenAI embedding dimensionsAZURE_OPENAI_EMBEDDING_DIMENSIONS
    --azure-openai-embedding-model-name-aoemnAzure OpenAI embedding model nameAZURE_OPENAI_EMBEDDING_MODEL_NAME
    --azure-openai-endpoint-aoeAzure OpenAI endpointAZURE_OPENAI_ENDPOINT
    --azure-search-api-key-asakAzure Search API keyAZURE_SEARCH_API_KEY
    --azure-search-endpoint-aseAzure Search endpointAZURE_SEARCH_ENDPOINT
    --azure-storage-access-key-asakAzure Storage access keyAZURE_STORAGE_ACCESS_KEY
    --azure-storage-account-name-asanAzure Storage account nameAZURE_STORAGE_ACCOUNT_NAME
    --blob-provider-bpBlob providerBLOB_PROVIDER
    --queue-provider-qpQueue providerQUEUE_PROVIDER

    For documentation on all available options, run:

    scrape-it-now index run --help
    

    Architecture

    Scrape

    ---
    title: Scrape process with Azure Storage
    ---
    graph LR
      cli["CLI"]
      web["Website"]
    
      subgraph "Azure Queue Storage"
        to_chunk["To chunk"]
        to_scrape["To scrape"]
      end
    
      subgraph "Azure Blob Storage"
        subgraph "Container"
          job["job"]
          scraped["scraped"]
          state["state"]
        end
      end
    
      cli -- (1) Pull message --> to_scrape
      cli -- (2) Get cache --> scraped
      cli -- (3) Browse --> web
      cli -- (4) Update cache --> scraped
      cli -- (5) Push state --> state
      cli -- (6) Add message --> to_scrape
      cli -- (7) Add message --> to_chunk
      cli -- (8) Update state --> job
    

    Index

    ---
    title: Scrape process with Azure Storage and Azure AI Search
    ---
    graph LR
      search["Azure AI Search"]
      cli["CLI"]
      embeddings["Azure OpenAI Embeddings"]
    
      subgraph "Azure Queue Storage"
        to_chunk["To chunk"]
      end
    
      subgraph "Azure Blob Storage"
        subgraph "Container"
          scraped["scraped"]
        end
      end
    
      cli -- (1) Pull message --> to_chunk
      cli -- (2) Get cache --> scraped
      cli -- (3) Chunk --> cli
      cli -- (4) Embed --> embeddings
      cli -- (5) Push to search --> search
    

    Design

    Blob storage is organized in folders:

    [job_name]-scraping/            # Job name (either defined by the user or generated)
        scraped/                    # All the data from the pages
            [page_id]/              # Assets from a page
                screenshot.jpeg     # Screenshot (if enabled)
                [image_id].[ext]    # Image binary (if enabled)
                [image_id].json     # Image metadata (if enabled)
            [page_id].json          # Data from a page
        state/                      # Job states (cache & parallelization)
            [page_id]               # Page state
        job.json                    # Job state (aggregated stats)
    

    Page data is considered as an API (won't break until the next major version) and is stored in JSON format:

    {
      "created_at": "2024-09-11T14:06:43.566187Z",
      "redirect": "https://www.nytimes.com/interactive/2024/podcasts/serial-season-four-guantanamo.html",
      "status": 200,
      "url": "https://www.nytimes.com/interactive/2024/podcasts/serial-season-four-guantanamo.html",
      "content": "## Listen to the trailer for Serial Season 4...",
      "etag": null,
      "links": [
        "https://podcasts.apple.com/us/podcast/serial/id917918570",
        "https://music.amazon.com/podcasts/d1022069-8863-42f3-823e-857fd8a7b616/serial?ref=dm_sh_OVBHkKYvW1poSzCOsBqHFXuLc",
        ...
      ],
      "metas": {
        "description": "“Serial” returns with a history of Guantánamo told by people who lived through key moments in Guantánamo’s evolution, who know things the rest of us don’t about what it’s like to be caught inside an improvised justice system.",
        "articleid": "100000009373583",
        "twitter:site": "@nytimes",
        ...
      },
      "network_used_mb": 1.041460037231445,
      "raw": "<head>...</head><body>...</body>",
      "valid_until": "2024-09-11T14:11:37.790570Z"
    }
    

    Then, indexed data is stored in Azure AI Search:

    FieldTypeDescription
    chunck_numberEdm.Int32Chunk number, from 0 to x
    contentEdm.StringChunck content
    created_atEdm.DateTimeOffsetSource scrape date
    idEdm.StringChunck ID
    titleEdm.StringSource page title
    urlEdm.StringSource page URL

    Advanced usage

    Whitelist

    Whitelist option allows to restrict to a domain and ignore sub paths. It is a list of regular expressions:

    domain1,regexp1,regexp2 domain2,regexp3
    

    For examples:

    To whitelist learn.microsoft.com:

    learn\.microsoft\.com
    

    To whitelist learn.microsoft.com and go.microsoft.com, but ignore all sub paths except /en-us:

    learn\.microsoft\.com,^/(?!en-us).* go\.microsoft\.com
    

    Source environment variables

    To configure easily the CLI, source environment variables from a .env file. For example, for the --azure-storage-access-key option:

    AZURE_STORAGE_ACCESS_KEY=xxx
    

    For arguments that accept multiple values, use a space-separated list. For example, for the --whitelist option:

    WHITELIST=learn\.microsoft\.com go\.microsoft\.com
    

    Application cache directory

    The cache directoty depends on the operating system:

    • ~/.config/scrape-it-now (Unix)
    • ~/Library/Application Support/scrape-it-now (macOS)
    • C:\Users\<user>\AppData\Roaming\scrape-it-now (Windows)

    Broswer binary installation

    Browser binaries are automatically downloaded or updated at each run. Browser is Chromium and it is not configurable (feel free to open an issue if you need another browser), it weights around 450MB. Cache is stored in the cache directory.

    How Local Disk storage works

    Local Disk storage is used for both blob and queue. It is not recommended for production use, as it is not easily scalable, and not fault-tolerant. It is useful for testing and development or when you cannot use Azure services.

    Implementation:

    • Local Disk Blob uses a directory structure to store blobs. Each blob is stored in a file with the blob name as the file name. Lease is implemented with lock files. By default, files are stored in a directory relative to the command execution directory.
    • Local Disk Queue uses a SQLite database to store messages. Database is stored in the cache directory. SQL databases implement visibility timeout and deletion tokens to ensure consistency to the stateless queue services like Azure Queue Storage.

    Use proxies for anonymity

    Proxies are not implemented in the application. Network security cannot be achieved from the application level. Use a VPN (e.g. your, third-party) or a proxy service (e.g. residential procies, Tor) to ensure anonymity and configure the system firewall to limit the application network access to it.

    Bundle with a container

    As the application is packaged to PyPi, it can easily be bundled with a container. At every start, the application will download the dependencies (browser, etc.) and cache them. You can pre-download them by running the command scrape-it-now scrape install.

    A good technique for performance would also to parallelize the scraping and indexing jobs by running multiple containers of each. This can be achieved with KEDA, by configuring a queue scaler.