Project Icon

flyscrape

高效精准的开源网页数据采集工具

flyscrape是一款开源的命令行网页数据采集工具,专为非专业程序员设计。它提供jQuery风格的数据提取、JavaScript脚本支持、系统cookie访问和浏览器模式渲染等功能。作为单一可执行文件,flyscrape配置简便,可精准提取网站数据。此外,它还支持多URL采集、分页跟踪和代理设置等高级特性,是一款兼具简易性和功能性的网页数据采集解决方案。



Flyscrape 是一款为不具备高级编程技能的用户设计的命令行网页抓取工具,
可以精确提取网站数据。


安装 · 文档 · 发布版本

演示

特性

  • 独立运行: Flyscrape 以单个可执行二进制文件的形式提供。
  • 类似 jQuery: 使用熟悉的 API 从 HTML 页面提取数据。
  • 可脚本化: 使用 JavaScript 编写数据提取逻辑。
  • 系统 Cookie: 允许 Flyscrape 访问您的浏览器 cookie 存储。
  • 浏览器模式: 使用无头浏览器渲染 JavaScript 密集型页面。

概览

示例

这个示例抓取 Hacker News 的前几页,特别是 New、Show 和 Ask 部分。

export const config = {
    urls: [
        "https://news.ycombinator.com/new",
        "https://news.ycombinator.com/show",
        "https://news.ycombinator.com/ask",
    ],

    // 缓存请求以供后续使用。
    cache: "file",

    // 启用 JavaScript 渲染。
    browser: true,
    headless: false,

    // 跟随分页链接 5 次。
    depth: 5,
    follow: ["a.morelink[href]"],
}

export default function ({ doc, absoluteURL }) {
    const title = doc.find("title");
    const posts = doc.find(".athing");

    return {
        title: title.text(),
        posts: posts.map((post) => {
            const link = post.find(".titleline > a");

            return {
                title: link.text(),
                url: link.attr("href"),
            };
        }),
    }
}
$ flyscrape run hackernews.js
[
  {
    "url": "https://news.ycombinator.com/new",
    "data": {
      "title": "New Links | Hacker News",
      "posts": [
        {
          "title": "Show HN: flyscrape - An standalone and scriptable web scraper",
          "url": "https://flyscrape.com/"
        },
        ...
      ]
    }
  }
]

查看 examples 文件夹 获取更详细的示例。

安装

推荐方式

安装 flyscrape 最简单的方法是通过其安装脚本。

curl -fsSL https://flyscrape.com/install | bash

Homebrew

对于 macOS 用户,flyscrape 也可以通过 homebrew 安装:

brew install flyscrape

预编译二进制文件

flyscrape 为 MacOS、Linux 和 Windows 提供可下载的二进制文件,可从发布页面获取。

从源代码编译

要从源代码编译 flyscrape,请按以下步骤操作:

  1. 安装 Go:确保您的系统已安装 Go。如果没有,可以从 https://go.dev/ 下载。

  2. 安装 flyscrape:打开终端并运行以下命令:

    go install github.com/philippta/flyscrape/cmd/flyscrape@latest
    

使用方法

用法:

    flyscrape run 脚本 [配置标志]

示例:

    # 运行脚本。
    $ flyscrape run example.js

    # 将 URL 作为参数设置。
    $ flyscrape run example.js --url "http://other.com"

    # 启用代理支持。
    $ flyscrape run example.js --proxies "http://someproxy:8043"

    # 跟随分页链接。
    $ flyscrape run example.js --depth 5 --follow ".next-button > a"

    # 将输出格式设置为 ndjson。
    $ flyscrape run example.js --output.format ndjson

    # 将输出写入文件。
    $ flyscrape run example.js --output.file results.json

配置

以下是一个展示 flyscrape 功能的抓取脚本示例。有关所有配置选项的完整文档,请访问文档页面

export const config = {
    // 指定开始抓取的 URL。
    url: "https://example.com/",

    // 指定多个开始抓取的 URL。                             (默认 = [])
    urls: [                          
        "https://anothersite.com/",
        "https://yetanother.com/",
    ],

    // 启用无头浏览器渲染。                                 (默认 = false)
    browser: true,

    // 指定浏览器是否应该是无头模式。                       (默认 = true)
    headless: false,

    // 指定应该跟随链接的深度。                             (默认 = 0,不跟随)
    depth: 5,                        

    // 指定要跟随的 CSS 选择器。                            (默认 = ["a[href]"])
    follow: [".next > a", ".related a"],                      
 
    // 指定允许的域名。['*'] 表示所有。                     (默认 = url 中的域名)
    allowedDomains: ["example.com", "anothersite.com"],              
 
    // 指定阻止的域名。                                     (默认 = 无)
    blockedDomains: ["somesite.com"],              

    // 指定允许的 URL 正则表达式。                          (默认 = 全部允许)
    allowedURLs: ["/posts", "/articles/\d+"],                 
 
    // 指定阻止的 URL 正则表达式。                          (默认 = 无)
    blockedURLs: ["/admin"],                 
   
    // 指定每分钟请求的速率。                               (默认 = 无速率限制)
    rate: 60,                       

    // 指定并发请求数。                                     (默认 = 无限制)
    concurrency: 1,                       

    // 指定单个 HTTP(S) 代理 URL。                          (默认 = 无代理)
    // 注意:与浏览器模式不兼容。
    proxy: "http://someproxy.com:8043",

    // 指定多个 HTTP(S) 代理 URL。                          (默认 = 无代理)
    // 注意:与浏览器模式不兼容。
    proxies: [
      "http://someproxy.com:8043",
      "http://someotherproxy.com:8043",
    ],                     

    // 启用基于文件的请求缓存。                             (默认 = 无缓存)
    cache: "file",                   

    // 指定 HTTP 请求头。                                   (默认 = 无)
    headers: {                       
        "Authorization": "Bearer ...",
        "User-Agent": "Mozilla ...",
    },

    // 使用本地浏览器的 cookie 存储。                       (默认 = 关闭)
    // 选项:"chrome" | "edge" | "firefox"
    cookies: "chrome",

    // 指定输出选项。
    output: {
        // 指定输出文件。                                   (默认 = stdout)
        file: "results.json",
        
        // 指定输出格式。                                   (默认 = json)
        // 选项:"json" | "ndjson"
        format: "json",
    },
};

export default function ({ doc, url, absoluteURL }) {
    // doc              - 包含解析后的 HTML 文档
    // url              - 包含抓取的 URL
    // absoluteURL(...) - 将相对 URL 转换为绝对 URL
}

查询 API

// <div class="element" foo="bar">Hey</div>
const el = doc.find(".element")
el.text()                                 // "Hey"
el.html()                                 // `<div class="element">Hey</div>`
el.attr("foo")                            // "bar"
el.hasAttr("foo")                         // true
el.hasClass("element")                    // true

// <ul>
//   <li class="a">Item 1</li>
//   <li>Item 2</li>
//   <li>Item 3</li>
// </ul>
const list = doc.find("ul")
list.children()                           // [<li class="a">Item 1</li>, <li>Item 2</li>, <li>Item 3</li>]

const items = list.find("li")
items.length()                            // 3
items.first()                             // <li>Item 1</li>
items.last()                              // <li>Item 3</li>
items.get(1)                              // <li>Item 2</li>
items.get(1).prev()                       // <li>Item 1</li>
items.get(1).next()                       // <li>Item 3</li>
items.get(1).parent()                     // <ul>...</ul>
items.get(1).siblings()                   // [<li class="a">Item 1</li>, <li>Item 2</li>, <li>Item 3</li>]
items.map(item => item.text())            // ["Item 1", "Item 2", "Item 3"]
items.filter(item => item.hasClass("a"))  // [<li class="a">Item 1</li>]

Flyscrape API

文档解析

import { parse } from "flyscrape";

const doc = parse(`<div class="foo">bar</div>`);
const text = doc.find(".foo").text();

文件下载

import { download } from "flyscrape/http";

download("http://example.com/image.jpg")              // 下载为 "image.jpg"
download("http://example.com/image.jpg", "other.jpg") // 下载为 "other.jpg"
download("http://example.com/image.jpg", "dir/")      // 下载为 "dir/image.jpg"

// 如果服务器通过 Content-Disposition 头提供文件名,且未提供目标文件名,
// Flyscrape 将遵循建议的文件名。
// 例如 `Content-Disposition: attachment; filename="archive.zip"`
download("http://example.com/generate_archive.php", "dir/") // 下载为 "dir/archive.zip"

问题和建议

如果您遇到任何问题或有改进建议,请提交问题

项目侧边栏1项目侧边栏2
推荐项目
Project Cover

豆包MarsCode

豆包 MarsCode 是一款革命性的编程助手,通过AI技术提供代码补全、单测生成、代码解释和智能问答等功能,支持100+编程语言,与主流编辑器无缝集成,显著提升开发效率和代码质量。

Project Cover

AI写歌

Suno AI是一个革命性的AI音乐创作平台,能在短短30秒内帮助用户创作出一首完整的歌曲。无论是寻找创作灵感还是需要快速制作音乐,Suno AI都是音乐爱好者和专业人士的理想选择。

Project Cover

有言AI

有言平台提供一站式AIGC视频创作解决方案,通过智能技术简化视频制作流程。无论是企业宣传还是个人分享,有言都能帮助用户快速、轻松地制作出专业级别的视频内容。

Project Cover

Kimi

Kimi AI助手提供多语言对话支持,能够阅读和理解用户上传的文件内容,解析网页信息,并结合搜索结果为用户提供详尽的答案。无论是日常咨询还是专业问题,Kimi都能以友好、专业的方式提供帮助。

Project Cover

阿里绘蛙

绘蛙是阿里巴巴集团推出的革命性AI电商营销平台。利用尖端人工智能技术,为商家提供一键生成商品图和营销文案的服务,显著提升内容创作效率和营销效果。适用于淘宝、天猫等电商平台,让商品第一时间被种草。

Project Cover

吐司

探索Tensor.Art平台的独特AI模型,免费访问各种图像生成与AI训练工具,从Stable Diffusion等基础模型开始,轻松实现创新图像生成。体验前沿的AI技术,推动个人和企业的创新发展。

Project Cover

SubCat字幕猫

SubCat字幕猫APP是一款创新的视频播放器,它将改变您观看视频的方式!SubCat结合了先进的人工智能技术,为您提供即时视频字幕翻译,无论是本地视频还是网络流媒体,让您轻松享受各种语言的内容。

Project Cover

美间AI

美间AI创意设计平台,利用前沿AI技术,为设计师和营销人员提供一站式设计解决方案。从智能海报到3D效果图,再到文案生成,美间让创意设计更简单、更高效。

Project Cover

稿定AI

稿定设计 是一个多功能的在线设计和创意平台,提供广泛的设计工具和资源,以满足不同用户的需求。从专业的图形设计师到普通用户,无论是进行图片处理、智能抠图、H5页面制作还是视频剪辑,稿定设计都能提供简单、高效的解决方案。该平台以其用户友好的界面和强大的功能集合,帮助用户轻松实现创意设计。

投诉举报邮箱: service@vectorlightyear.com
@2024 懂AI·鲁ICP备2024100362号-6·鲁公网安备37021002001498号