结果展示与格式化
可用的结果保存格式
在 A-Parser 中,使用 Template Toolkit 模板引擎来格式化结果,这使得将数据抓取结果保存为各种格式变得非常容易:
- 保存为文本文件列表:每行一个结果,使用分隔符,支持自定义格式
- 保存为
CSV文件,以便后续导入 Excel、Google Docs 等 - 保存为
XML、JSON以及其他数据存储格式 - 实时生成
HTML页面 - 保存为
SQL转储格式以便直接导入数据库,或直接写入 SQLite 数据库 - 保存为二进制格式,用于存储图像(
jpg, png, gif,...)、文档(pdf, docx,...)、可执行文件和压缩包(exe, dmg, zip,...)以及任何其他类型的数据
编辑结果格式
Result format (结果格式) - 允许使用模板将结果格式化为所需的样式,应用于每个“查询-结果”组合。

- 通用结果格式在
Result format字段中设置 - 每个爬虫工具的独立结果格式可以在爬虫工具设置的
Result format中单独设置
A-Parser 支持在一个任务中使用多个爬虫工具,在通用结果格式中需要指明输出哪个爬虫工具的结果:
$p1- 第一个爬虫工具的结果(截图中的
SE::Google),$p2- 第二个爬虫工具的结果(截图中的
SE::Bing)- 爬虫工具的序号显示在爬虫工具选择框的左侧
$p1.preset和$p2.preset表示需要从相应爬虫工具的设置中获取结果格式值- 在本例中,
$p1.preset可以替换为$p1.serp.format('$link\n'),效果相同,此时将不再使用设置中的结果格式
点击编辑字段中的相应图标,可以在便捷的多行编辑器中指定Result format (结果格式):

在通用结果格式中,可以使用以下变量:
$query- 格式化后的查询$query.*- 所有与查询相关的变量,详见查询模板一文$p1, $p2, ...- 用于单独访问每个爬虫工具数据抓取结果的变量(参见每个爬虫工具的查看可能的结果)$p1.query, $p2.query, ...- 考虑到每个爬虫工具设置中指定的查询格式后的格式化查询
起始和结束文本
可以为每个结果文件指定单独的起始/结束文本:
- 用于生成 CSV 文件的表头
- 用于 XML 文件的起始和结束标签
- 用于 HTML 文件的 Header、头部和 Footer
- 用于任何其他应用场景
要激活此功能,需要点击任务编辑器底部的 More options (更多选项) 按钮

起始和结束文本支持使用 Template Toolkit 模板引擎,可用变量包括:
$query- 格式化后的查询$query.*- 所有与查询相关的变量,详见查询模板一文
重要!仅当将每个查询保存到单独的文件中,或者在结果文件名格式中使用这些变量时,这些变量才可用。
结果文件名格式
A-Parser 同样允许在结果文件名中使用模板,从而可以根据当前日期、查询序号、查询本身或任何其他格式自动创建文件和文件夹。

在File name (文件名)字段中支持以下变量:
- 通用结果格式中可用的所有变量
$queriesfile- 查询文件的路径和名称,如果查询是通过表单输入的,则包含 queries_from_text.txt$datefile- Template Toolkit 模板引擎的 date 插件对象,配置为日期格式%b-%d_%H-%M-%S,格式化后输出当前时间和日期,如 May-08_20-08-38,格式可在附加设置中修改
默认情况下,文件名根据任务启动时的日期和时间创建
综合示例
reports/$queriesfile/${query}.txt
- 将创建 reports 文件夹
- 将创建以查询文件名命名的子文件夹
- 在子文件夹中,将根据任务中使用的查询数量创建相应数量的文件,文件名将使用查询本身并带有
.txt扩展名
变量 $query 写成 ${query} 的形式是为了防止将 .txt 扩展名误插值为变量的一部分,详见 Template Toolkit 模板引擎文档。
⏩ 视频:结果文件命名
在本视频中,我们将展示几个结果文件命名的示例:
- 根据查询对结果文件进行编号。
- 结果文件编号 + 查询名称的一部分。
- 根据查询命名结果文件(如果查询是链接)。
查看可用结果
每个爬虫工具都有自己的一套结果,可以通过将鼠标悬停在爬虫工具上来查看可用结果列表,在弹出的提示框中将显示简单结果和数组列表,以及嵌套元素的列表:
黄色 标记的是所有爬虫工具通用的结果:$query- 格式化后传递给爬虫工具的查询$query.orig- 原始查询(在文件或查询输入框中的原始样式)$query.first- 使用嵌套数据抓取选项(Parse all results 或 Parse to level)时的第一个查询$info.success- 关于该查询数据抓取是否成功的信息$info.retries- 该查询使用的重试次数$info.stats- 爬虫工具针对该查询的工作统计数据$pages.$i.data- 包含来自服务器的原始响应的数组,以便自行提取额外信息
SE::Bing 的结果:$totalcount- 搜索结果的数量$ads包含元素$link,$anchor,$visiblelink,$snippet,$position和$page- 广告列表数组$related.$i.key- 相关关键词列表数组$serp包含元素$link,$anchor,$snippet,$cache- 搜索引擎主要结果数组
请注意,对于数组,会明确指定变量 $i,这意味着有多个元素,可以通过索引(位置编号)访问它们,或者在循环中遍历每个元素。
结果 $pages.$i.data 将自动更改为 $data,适用于那些不会在一次请求内“逐页翻页”的爬虫工具。例如
DeepL::Translator。
结果展示
A-Parser 旨在抓取各种类型的信息,为此引入了 2 种结果类型:
- 简单结果 (Flat)
- 结果数组 (Array)
让我们以爬虫工具
SE::Google 为例查看每种类型,搜索结果截图如下:

简单结果
Simple results (简单结果) - 当一个查询对应一个结果时,例如:
- 根据查询得到的结果数量 ($totalcount)
- 查询是否为拼写错误 ($misspell,截图中未展示)
其他示例:
- 爬虫工具
DeepL::Translator 中已翻译文本的值 ($translated) - 爬虫工具
Rank::MajesticSEO 中的引用域名数量 ($domains)、信任流值 ($trustflow)、反向链接 ($backlinks) 等
单个结果保存在普通变量中(前缀 $ + 英文名称)
结果数组
结果数组 - 当一个查询对应一个结果列表时,列表中的每个元素又可以包含多个嵌套元素。以 Google 搜索结果为例 - 它在爬虫工具中由数组 $serp 表示,为了直观起见,我们使用表格记录前 5 个搜索结果:
| 链接 ($link) | 锚点 ($anchor) | 摘要 ($snippet) |
|---|---|---|
| http://www.speedtest.net/ | Speedtest.net by Ookla - The Global Broadband Speed Test | Test your Internet connection bandwidth to locations around the world with this interactive broadband speed test from Ookla. |
| http://en.wikipedia.org/wiki/Test_cricket | Test cricket - Wikipedia, the free encyclopedia | Test cricket is the longest form of the sport of cricket. Test matches are played between national representative teams with "Test status", as determined by the ... |
| http://www.speakeasy.net/speedtest/ | Speakeasy Speed Test | Saturday 03-May 2014, 11:04:29 AM Your IP: The Speakeasy Speed Test requires Flash v7 or higher. Please update your browser. See Pricing Or Call Today |
| http://www.humanmetrics.com/cgi-win/jtypes2.asp | Personality test based on C. Jung and I. Briggs Myers type theory | Humanmetrics Jung Typology Test™ instrument uses methodology, questionnaire, scoring and software that are proprietary to Humanmetrics, and shall not be ... |
| http://test-ipv6.com/ | Test your IPv6. | This will test your browser and connection for IPv6 readiness, as well as show you your current IPV4 and IPv6 address. ... Test your IPv6 connectivity. JavaScript ... |
每个搜索位置都记录在具有 3 个嵌套元素的数组中 - 链接 ($link)、锚点 ($anchor)、摘要 ($snippet)
另一个例子 - 相关关键词列表,保存在数组 $related 中:
| 关键词 ($key) |
|---|
| test wwe |
| depression test |
| test my speed |
| wonderlic test |
| test personality |
| act test |
| jiggle test |
| bipolar test |
如你所见,该数组中只有一个嵌套元素 - 关键词 ($key)
数组元素的编号从 0 开始,访问单个数组元素的示例:
$serp.0.link- 搜索结果中的第一个链接$serp.3.anchor- 搜索结果中的第四个锚点$related.0.key- 第一个相关关键词
下面将详细介绍简单结果和数组的格式化
格式化原则
在爬虫工具收集了简单结果和数组中的数据后,需要以所需的格式显示(保存到文件)它们。为了方便和功能性,A-Parser 使用了 Template Toolkit 模板引擎。让我们通过 模板测试 工具来了解常用的结构。选择爬虫工具
SE::Google 的项目:

截图中显示了 3 个字段:
- JSON - 爬虫工具内部的数据表示
- Template - 用于格式化结果的模板
- Result - 根据指定模板直接转换后的数据,结果将以此形式写入文件
通过修改模板,我们可以改变结果的样式,考虑以下模板:

Template (模板)字段中的文本:
查询报告:$query
竞争程度:$totalcount
链接、锚点和摘要列表:
$serp.format('$link $anchor\n$snippet\n\n')
总结基本规则:
- 普通文本按原样输出到结果中,不作更改
- 要输出简单结果,需要在所需位置输出包含所需结果且带有
$前缀的变量 - 格式化数组使用
.format方法,稍后介绍 \n负责换行
格式化数组
解析以下结构:
$serp.format('$link $anchor\n$snippet\n\n')
此记录意味着需要为数组 $serp 调用带有参数 '$link $anchor\n$snippet\n\n' 的 .format 方法。.format 方法根据参数中指定的模板将数组的所有元素连接成一个字符串,模板本身意味着:对于数组 $serp 的每个元素,输出链接和锚点(中间用空格隔开),然后换行输出摘要,接着再换行两次,从而在结果之间形成一个空行。
使用模板引擎
输出变量
要使用模板引擎,需要插入标签 [% %],并在标签内部输入要执行的逻辑。


遍历数组
要输出数组元素,需要使用 FOREACH 结构:
[% FOREACH i IN p1.list;
i.cms _ "\n";
END %]
有关模板引擎的更多信息和示例,请参阅 A-Parser 中模板工作的特性。
示例
输出竞争程度
输出所有搜索引擎爬虫工具(
SE::Google、
SE::Yandex...)的查询竞争度(查询结果数量)。
结果格式:
$query: $totalcount\n
结果示例:
test: 3910000000
viagra: 278000000
塑钢窗: 3220000
...
抓取链接
输出搜索引擎结果中的链接。
结果格式:
$serp.format('$link\n')
结果示例:
http://www.speedtest.net/
http://www.speakeasy.net/speedtest/
http://en.wikipedia.org/wiki/Test_cricket
http://www.humanmetrics.com/cgi-win/jtypes2.asp
http://html5test.com/
http://test-ipv6.com/
...
抓取搜索建议
输出搜索引擎的搜索建议。
结果格式:
$results.format('$suggest\n')
结果示例:
坦克世界在线测试服务器
俄语国家统一考试测试
薄饼面糊配方
睾丸
牛奶披萨面团
输出查询相关数据
在
Net::HTTP 及其基础上的爬虫工具中,还可以额外输出:
$proxy- 执行查询时使用的代理$headers- 响应头$code- 响应代码$reason- 响应状态

以 JSON 格式输出变量值
输出查询的所有重定向
对于此任务,可以使用变量 $response,它允许获取查询的任何变量,包括所有之前的重定向。
结果格式:
$response.Redirects.format('$URI\n--> ')$response.URI
爬虫工具工作结果:

使用模板引擎记录日期的 JSON 输出
示例显示了以 JSON 格式输出爬虫工具
Net::Whois 的结果。

结果将包含检查的域名、检查时的日期和检查结果。如结果格式中所示,日期是使用 Template Toolkit 模板引擎获取的。
结果格式:
{
"domain": "$query",
"date": "[% USE d = date(format = '%d.%m.20%y', locale = 'C');d.format() %]",
"expire": "$p1.expire_date",
},
结果示例:
[{
"domain": "a-parser.com",
"date": "05.05.2021",
"expire": "25.02.2022",
},
{}]
下载示例
eJxtVG1v2jAQ/ivWCUQrZaxM2pdM+0BRkTYx6ErRPgQ0efWFeXXszHYYVZT/3nMS
EtruQyTf23P33EtK8Nw9uluLDr2DOCkhr98QwxJ9HP/4baRj79jNkWe5QjaBCHJu
HdrgnZw5kUFgygvlYbeLgFDo6ebGZjyglVvNGNuCMBmXegsxvQd/C7RPW4hONu6x
sSRDtlnfMME+s6C8SGsYkkZDMR5m4w9Xw6dRxJR54FQUqWejy09i3LhdXLLhrkfF
Yy5tizvIJ+NG/tkkI6eKPugKXvMD3hsqOJUKe/WcpCXPkAyDEBmsXbqxP3py5UJI
L43mqmEdOtR3YqMl0aV4bcg3MJfo5tZkfa66HaeOJW17gCCKOvZ7EwNxypXDCByV
OucUKl5bpEfLvbGrPNRD+hKMniq1wAOq3q3Gvy6kEjTOaUpBX9rA/7us3mBUHb3z
VAe0/yzVALG3BYHUwvXqWx8kzMLsibj4RbSVzKQn2c1MocOuXJHyETHvWrYMLcuM
xS5LA9zmpvXNUQtyTPqJTfNWV1Y7eEXkxWBeKh+MTuV+RRSsFHjyLPQ93clKz0y4
gsBMF0rRYBze9Qsyde0ggtC18E3wrE4R2Lf3EoE3Rrmva9KF+7KSFvBjKDCjXp5n
bSFp69XmbnFugbOlqrMnJ/F9c3Ku3tLAkNZ3b2ixiFq16865+weU50cdlxWN64+7
bZwCdK2MgDrkaBYQT6pnHsF5pA==
根据关键词检查网站是否在 Google 新闻中

结果格式:
[% linksToOneString = p1.serp.format('$link. ');
matches = linksToOneString.match('.+?(' _ p1.query.domain _ ').+?');
IF matches.0;
p1.query.orig _';yes' _ "\n";
ELSE;
p1.query.orig _';no' _ "\n";
END %]
结果示例:
谷歌爬虫工具|a-parser.com;no
谷歌爬虫工具|forbes.ru;yes
下载示例
eJylVVFv2jAQ/iuR1YpWo1EQ7UuqaaIMpk6stKV9AoRccqQeju3aCQVR/vvOTkjS
ruNlEoq4u+++O9+dz1uSUrM0txoMpIaE4y1R7j8JyagXhj+kjDl4Z173GeZLL5IJ
ZcLDX2EQ8Go8WNNEcSBNoqg2oC3PuOaOhggWNOMpaW5JulGA7HIFWrPIGlmEsqIx
zGUmEENWlGeIae3+DccwqkIS8WrIATRnYmkUumCQGn9wwCXmNfr7x0Psz3Wozg4m
omtQTkU8O4xXWq43GlLNwNQ8W0EQkN102iTYLKyr6UudUNu08fFEuNM+yKGAETqK
2PvqqZZvK+YvHO6kcWQxvtc4vZwIVMyfwSDqo6PvTCcN/8u3k4Y3sywvGeiNX8zB
DAnQ5lg+CTvzJmSCFuLM132viOQHqCi5pGYIbVxuwDTeufQGo95nQCE/4G6+T8Tx
lJTFGNEVPEgsxoK54dvXCKUbmtj6HUU0BWvdF+TUT9d28mgUsZRJQXleUTvKVZUf
BXvJx00i1maFbelrmaAqBUfgUt13Y0yOnEyQInO+d7kPCReUG2gSg6n2KSYSlZZU
Z2hgKWiaSj1UNh1Ub4kUHc4HsAJe+Tv6q4zxCK9dZ4FO14Xj55DhXxy78nT1UDiG
rxpzKFmcdDX8VXlFciBjPHj0hMfmLGEpyqbrrnBIAlQuAVRZshtbskRqKMMUzEV0
XEEKhJ35qmMdVaneHcMtKiMzPbfUeY2b+ztk3PSNFGe2IQZwKeUFIW8WJG1f9i75
IJPprmpyLQYq51IsWDwsruV+HDLxgGtzKLrSLj5bJpFxjk02cF8NW8cUTbVCdd6P
zl0XwlZyvyQxScnNz1F+cqUZ5nxhE0ywMfWoBeWccv54P6hbSDWgKEyy4Ly9cN/A
fs/zb8tpLnKN54S2E9rV//bTGz3L97o/lwneuf/iwvv2hBsAt55NO4VYYh9sN939
CUkvf0vssoO1oiKCKL8SO9ej4oEp36tt/ZkJtzucy9/mNgfZqlsI6rB9BofOPil/
AGn6WSM=
以日期格式输出时间戳值
有时结果中没有普通日期,但有类似爬虫工具
Social::Instagram::Tag 中的时间戳值。可以使用 Template-Toolkit 模板引擎 将此值表示为日期格式。

结果格式:
[% USE date;
query.orig _ ": total posts - " _ postscount _ "\nPosts:\n";
FOREACH i IN posts;
d = date.format(i.time, format => '%d.%m.20%y');
i.link _ " - " _ d _ ":\n";
i.text _ "\n";
END %]
结果示例:
sport: total posts - 96500663
Posts:
https://www.instagram.com/p/COfJHshAkeD/ - 05.05.2021:
Quelques exemples de notre nouvelle campagne de communication personnalisable avec le nom des clubs 😀
Vous préférez quel visuel : 1, 2, 3, 4, 5 ? 🤔
#clubnormand #tennis #padel #beachtennis #tenniscourt #padelcourt #beachtenniscourt #lnt #LigueNormandieTennis #🎾 #sport #normandie #normandietourisme
https://www.instagram.com/p/COfJG7olavg/ - 05.05.2021:
💥 Sau màn lật đổ “Bà già” thành công, Nửa xanh thành Milan chính thức vượt qua Nửa đỏ về số lần lên đỉnh nước Ý nhiều nhất lịch sử.
-----------------------------
➖ Website: https://webthethao247.com/
➖ https://g.page/webthethao247?share
#wtt247 #webthethao247 #thethao #sport #bongda #SerieA #InterMilan #Juventus #ACMilan
https://www.instagram.com/p/COfJG1Hg7ax/ - 05.05.2021:
Which Skill was better 1 or 2? 🤔👇
Follow @ftb4ll for more 💥
Follow @ftb4ll for more 💥
Follow @ftb4ll for more 💥
________________________________________
Leave a Like 👍🏽
Subscribe for more 🔔
Leave your thoughts in the Comments 💬
________________________________________
❌Ignore the Tags ❌
#football #soccer #fussball #futbol #fifa #championsleague #bundesliga #ucl #footballmemes #goal #transfer #sports #penalty #ultimateteam #pacybits #fut #ultras #laliga #freekick #referee #sport #calcio #messi #ronaldo #skills #premierleague #foul #footballseason
https://www.instagram.com/p/COfIlXqhfAa/ - 05.05.2021:
Be Fuckin’ Ready 🤣🤣🤣
Get ready to fly!!!! 🏐🏐🏐🏐
Follow - @crackonkings
#beachball #nalin&kane #trance #music #90s #onyerhead #festival #party #afterparty #love #summer #uk #happy #sesh #crackon #football #sport #festivaloutfit #festivalfashion #sun #dj #dancing #club #festivalgirl #house #techno #rave
...
下载示例
eJx1VNtuGjEQ/RXLCkoj0VVSqS9bpRKhoFJRNuXyxKLKxQa58dqO7aVBiH/vjPeW
pM0+7RzPzDlzsU80MP/g753wIniark/Uxn+a0oXZSqbSdKJ9YHvHijRdsj15T5ay
EAAVlgRDOAuCiCewlKB9apnzwmGm9RsJwImLHStVoP0TDUcrgMschHOSYwbJwd4Z
V7AASqIbPTBVotu6R1aLUeT8lOtcP5bCHRPj5J78JDlNQVBgiljjgwehOQU4GltT
6hB98lzfI5LCT05jlnE2Hw2GX4kkk1nljnDg5DYyJZWYdzIJUHifVCa5/Uwuezzp
FcmH697x8gpiCHwyUVI/RKpGAa/ENYSVVxBPraAIj2ZfSG9Dz5tNn1aF+3Fkgrov
7E1Sz6U9XLCDWBrslYydb2LAmrECu3WB6vG0qeAqCU+YgXEugzSaqYoBx9WxrrR8
jN3WBnyxxVL4sTMFQKi6Bo+NujW9iDaFFGWM/VHF0HTHlBd96kHqmIEQ/vpEBuFY
MC6zqAfwEzV6oNRUHITq3GL+u1IqDrs12EHQpA78v0v2T45zW95zKti6Pw40tFmi
dZd976K4mZo9VM5/Qd1KFjKA7Ye4T4BeA/gghG17NsOeFcaJlqbOXLPDTbNC44p3
IxvYDnpRxouxvAS3Ru/kPquvTeNZ6iVc50wPDV5HrEuXSsFYvJh36zHw9RjQ6AS+
Dh5GCiy9ua40GKP8t0Ul1ToJ6/cRBRbQyeesdcotU2o1nz4/wUAfjM30yLlX44uL
Qb01Drm2sLx7A2sFpZ037cvSPlWnt96X9HSGuf3291UAFonugEG3PAyFpjfnvwdy
t1Y=