Flutter网页数据抓取插件dart_web_scraper的使用
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: ["/"],
),
],
),
],
};
解释
- 初始化 WebScraper:创建一个
WebScraper
实例。 - 抓取网站:调用
scrape
方法,传入目标URL、配置映射、配置索引、Cookies等参数。 - 打印结果:将抓取到的结果转换为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.table
和 ParserType.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
更多关于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),
),
),
);
}
}
在这个示例中,我们做了以下几件事:
- 使用
http
包从指定的URL获取网页的HTML内容。 - 使用
dart_web_scraper
的WebScraper
类来解析HTML内容。 - 定义了一个简单的选择器来抓取网页的标题和所有段落。
- 将抓取到的数据以JSON格式显示在Flutter应用的UI上。
请注意,dart_web_scraper
的实际用法可能略有不同,具体取决于其API设计。上述代码提供了一个基本的框架,你可以根据dart_web_scraper
的文档和实际需求进行调整。
此外,抓取网页数据时请遵守目标网站的robots.txt规则以及相关法律法规,不要进行恶意抓取或滥用资源。