Flutter网页数据抓取插件dart_web_scraper的使用

发布于 1周前 作者 wuwangju 来自 Flutter

Flutter网页数据抓取插件dart_web_scraper的使用

插件简介

dart_web_scraper 是一个基于配置文件、可复用的网页和API抓取工具。它允许用户通过简单的键值对配置来抓取和解析网页或API,而无需为每个页面编写解析逻辑。

  • 内置解析器:提供常用抓取任务的内置解析器。
  • 配置驱动:无需从零开始编写解析逻辑。
  • 数据清洗:在添加到最终结果前清理数据。
  • 并发处理:支持并发模式下解析多个解析器。
  • CSS选择器:使用CSS选择器从HTML中提取数据。
  • API抓取:通过HTTP请求获取数据。
  • 传递Cookie:向抓取器或HTTP解析器传递Cookie。
  • JSON解析:解码JSON字符串或使用JSON路径提取数据。
  • JSON-LD:提取所有ld+json对象并放入列表。
  • JSON5:解码JSON5语法。
  • 字符串之间提取:提取两个字符串之间的内容。
  • 兄弟元素:当目标元素没有有效选择器但兄弟有。
  • 表格:以Map形式从HTML/JSON表中提取数据。
  • 属性:从HTML元素中提取属性值。
  • 数据注入:通过解析器选择器注入之前解析的数据。
  • 基于URL的代理:为HTTP请求使用基于URL的代理。

快速开始

添加依赖

pubspec.yaml 文件中添加 dart_web_scraper 作为依赖项:

dependencies:
  dart_web_scraper:

或者使用Flutter命令安装:

$ flutter pub add dart_web_scraper

或者使用Dart命令安装:

$ dart pub add dart_web_scraper

导入包

在Dart文件中导入 dart_web_scraper 包:

import 'package:dart_web_scraper/dart_web_scraper.dart';

使用示例

下面是一个完整的示例代码,展示如何使用 dart_web_scraper 抓取 https://quotes.toscrape.com 网站的数据。

示例代码

import 'dart:convert';

import 'package:dart_web_scraper/dart_web_scraper.dart';
import 'configs.dart'; // 假设这是你的配置文件

void main() async {
  /// 初始化 WebScraper
  WebScraper webScraper = WebScraper();

  /// 根据 configMap 抓取网站
  Map<String, Object> result = await webScraper.scrape(
    url: Uri.parse("https://quotes.toscrape.com"),
    configMap: configMap,
    configIndex: 0,
    cookies: {
      "foo": "bar",
    },
    debug: true,
    concurrentParsing: false,
  );

  print(jsonEncode(result));
}

配置文件示例 (configs.dart)

假设你有一个名为 configs.dart 的配置文件,内容如下:

final configMap = {
  "quotes.toscrape.com": [
    Config(
      parsers: {
        "home": [
          Parser(
            id: "quote",
            parent: ["_root"],
            type: ParserType.text,
            selector: [".text"],
            multiple: true,
          ),
          Parser(
            id: "author",
            parent: ["_root"],
            type: ParserType.text,
            selector: [".author"],
            multiple: true,
          ),
          Parser(
            id: "tags",
            parent: ["_root"],
            type: ParserType.text,
            selector: [".tag"],
            multiple: true,
          ),
        ],
      },
      urlTargets: [
        UrlTarget(
          name: "home",
          where: ["/"],
        ),
      ],
    ),
  ],
};

解释

  1. 初始化 WebScraper:创建一个 WebScraper 实例。
  2. 抓取网站:调用 scrape 方法,传入目标URL、配置映射、配置索引、Cookies等参数。
  3. 打印结果:将抓取到的结果转换为JSON格式并打印出来。

类和方法

Config 类

用于配置一个域名的抓取规则。

Config Config({
  bool forceFetch = false,
  UserAgentDevice userAgent = UserAgentDevice.mobile,
  bool usePassedHtml = true,
  bool usePassedUserAgent = false,
  required Map<String, List<Parser>> parsers,
  required List<UrlTarget> urlTargets,
})

UrlTarget 类

用于定位网站的不同部分。

UrlTarget UrlTarget({
  required String name,
  required List<String> where,
  bool needsHtml = true,
  UrlCleaner? urlCleaner,
})

Parser 类

用于定义具体的解析规则。

Parser Parser({
  required String id,
  required List<String> parent,
  required ParserType type,
  List<String> selector = const [],
  bool isPrivate = false,
  bool multiple = false,
  Optional? optional,
  Object? Function(Data, bool)? cleaner,
})

Parser Types

Type 描述 Selector Optional
ParserType.element 使用CSS选择器从HTML中提取元素节点。 CSS选择器必需 N/A
ParserType.attribute 使用CSS选择器从HTML元素中提取属性。 CSS选择器 + 属性名(用::分隔) Optional.any
ParserType.text 使用CSS选择器从HTML元素中提取文本。 CSS选择器必需 Optional.any
ParserType.image 从HTML元素中提取图片URL。 CSS选择器必需 Optional.any
ParserType.url 从HTML元素中提取URL。 CSS选择器必需 Optional.any
ParserType.urlParam 从URL中提取查询参数。 参数名 Optional.any
ParserType.table 从HTML表格中提取数据。 CSS选择器必需 Optional.table
ParserType.sibling 当目标元素没有有效选择器但兄弟有。 CSS选择器必需 Optional.sibling
ParserType.strBetween 提取两个字符串之间的内容。 不需要 Optional.strBetween
ParserType.http 使用HTTP请求获取数据。 不需要 Optional.http
ParserType.json 解码JSON字符串或提取数据。 JSON路径选择器 Optional.any
ParserType.jsonld 提取所有ld+json对象并放入列表。 不需要 N/A
ParserType.jsonTable 从JSON中提取表格数据。 JSON路径选择器 Optional.table
ParserType.json5decode 解码JSON5语法。 不需要 N/A
ParserType.staticVal 设置静态值到最终结果。 不需要 Optional.staticVal
ParserType.returnUrlParser 返回传递给WebScraper的URL。 不需要 Optional.any

可选参数

Optional.any 类

可以与任何解析器一起使用。

Optional.any({
  ApplyMethod? apply,
  String? regex,
  int? regexGroup,
  String? regexReplace,
  String? regexReplaceWith,
  Map<String, String>? replaceFirst,
  Map<String, String>? replaceAll,
  int? cropStart,
  int? cropEnd,
  String? prepend,
  String? append,
  List<Object>? match,
  int? nth,
  String? splitBy,
})

Optional.http 类

必须与 ParserType.http 一起使用。

Optional.http({
  String? url,
  HttpMethod? method,
  Map<String, Object>? headers,
  UserAgentDevice? userAgent,
  HttpResponseType? responseType,
  Object? payload,
  bool usePassedProxy = false,
  HttpPayload? payloadType,
  bool cacheResponse = false,
})

Optional.strBetween 类

必须与 ParserType.strBetween 一起使用。

Optional.strBetween({
  String? start,
  String? end,
})

Optional.sibling 类

ParserType.sibling 一起使用。

Optional.sibling({
  required SiblingDirection direction,
  List<String>? where,
})

Optional.table 类

必须与 ParserType.tableParserType.jsonTable 一起使用。

Optional.table({
  String? keys,
  String? values,
})

Optional.staticVal 类

必须与 ParserType.staticVal 一起使用。

Optional.staticVal({
  String? strVal,
  Map<String, Object>? mapVal,
})

致谢

希望这些信息能帮助你更好地理解和使用 dart_web_scraper 插件进行网页数据抓取。如果有任何问题或需要进一步的帮助,请随时提问!


更多关于Flutter网页数据抓取插件dart_web_scraper的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter网页数据抓取插件dart_web_scraper的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter项目中,如果你需要使用dart_web_scraper插件来抓取网页数据,以下是一个简单的代码示例,展示了如何使用这个插件进行网页数据抓取。请注意,这个插件的具体API和用法可能会根据版本有所不同,因此请确保你查阅了最新的文档。

首先,你需要在你的pubspec.yaml文件中添加dart_web_scraper依赖:

dependencies:
  flutter:
    sdk: flutter
  dart_web_scraper: ^最新版本号 # 替换为实际的最新版本号

然后运行flutter pub get来安装依赖。

接下来,你可以编写一个Flutter应用来抓取网页数据。以下是一个基本的示例:

import 'package:flutter/material.dart';
import 'package:dart_web_scraper/dart_web_scraper.dart';
import 'dart:convert';
import 'package:http/http.dart' as http;

void main() {
  runApp(MyApp());
}

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  String webData = '';

  @override
  void initState() {
    super.initState();
    _fetchWebData();
  }

  Future<void> _fetchWebData() async {
    try {
      // 使用http包获取网页内容
      var response = await http.get(Uri.parse('https://example.com')); // 替换为你要抓取的网页URL
      if (response.statusCode == 200) {
        String htmlContent = response.body;

        // 使用dart_web_scraper解析HTML
        var scraper = WebScraper();
        var result = scraper.scrape(htmlContent, {
          'title': {'selector': 'title', 'single': true}, // 获取网页标题
          'paragraphs': {'selector': 'p'}, // 获取所有段落
        });

        // 更新UI
        setState(() {
          webData = jsonEncode(result, toEncodable: (dynamic object) {
            if (object is Map || object is List) {
              return object;
            }
            return object.toString();
          });
        });
      } else {
        setState(() {
          webData = 'Failed to load webpage, status code: ${response.statusCode}';
        });
      }
    } catch (e) {
      setState(() {
        webData = 'Error: $e';
      });
    }
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Web Scraper Demo'),
        ),
        body: Padding(
          padding: const EdgeInsets.all(16.0),
          child: Text(webData),
        ),
      ),
    );
  }
}

在这个示例中,我们做了以下几件事:

  1. 使用http包从指定的URL获取网页的HTML内容。
  2. 使用dart_web_scraperWebScraper类来解析HTML内容。
  3. 定义了一个简单的选择器来抓取网页的标题和所有段落。
  4. 将抓取到的数据以JSON格式显示在Flutter应用的UI上。

请注意,dart_web_scraper的实际用法可能略有不同,具体取决于其API设计。上述代码提供了一个基本的框架,你可以根据dart_web_scraper的文档和实际需求进行调整。

此外,抓取网页数据时请遵守目标网站的robots.txt规则以及相关法律法规,不要进行恶意抓取或滥用资源。

回到顶部