跳转到主要内容

结果展示与格式化

可用的结果保存格式

A-Parser 中,使用 Template Toolkit 模板引擎来格式化结果,这使得将数据抓取结果保存为各种格式变得非常容易:

  • 保存为文本文件列表:每行一个结果,使用分隔符,支持自定义格式
  • 保存为 CSV 文件,以便后续导入 Excel、Google Docs
  • 保存为 XMLJSON 以及其他数据存储格式
  • 实时生成 HTML 页面
  • 保存为 SQL 转储格式以便直接导入数据库,或直接写入 SQLite 数据库
  • 保存为二进制格式,用于存储图像(jpg, png, gif, ...)、文档(pdf, docx, ...)、可执行文件和压缩包(exe, dmg, zip, ...)以及任何其他类型的数据

编辑结果格式

Result format (结果格式) - 允许使用模板将结果格式化为所需的样式,应用于每个“查询-结果”组合。

结果格式
  • 通用结果格式Result format 字段中设置
  • 每个爬虫工具的独立结果格式可以在爬虫工具设置的 Result format 中单独设置

A-Parser 支持在一个任务中使用多个爬虫工具,在通用结果格式中需要指明输出哪个爬虫工具的结果:

  • $p1 - 第一个爬虫工具的结果(截图中的 SE::GoogleSE::Google),$p2 - 第二个爬虫工具的结果(截图中的 SE::BingSE::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 模板引擎文档。

⏩ 视频:结果文件命名

在本视频中,我们将展示几个结果文件命名的示例:

  1. 根据查询对结果文件进行编号。
  2. 结果文件编号 + 查询名称的一部分。
  3. 根据查询命名结果文件(如果查询是链接)。

查看可用结果

每个爬虫工具都有自己的一套结果,可以通过将鼠标悬停在爬虫工具上来查看可用结果列表,在弹出的提示框中将显示简单结果和数组列表,以及嵌套元素的列表:

弹出提示中的可用结果列表黄色 标记的是所有爬虫工具通用的结果:
  • $query - 格式化后传递给爬虫工具的查询
  • $query.orig - 原始查询(在文件或查询输入框中的原始样式)
  • $query.first - 使用嵌套数据抓取选项(Parse all resultsParse to level)时的第一个查询
  • $info.success - 关于该查询数据抓取是否成功的信息
  • $info.retries - 该查询使用的重试次数
  • $info.stats - 爬虫工具针对该查询的工作统计数据
  • $pages.$i.data - 包含来自服务器的原始响应的数组,以便自行提取额外信息
绿色 标记的是仅适用于爬虫工具 SE::BingSE::Bing 的结果:
  • $totalcount - 搜索结果的数量
  • $ads 包含元素 $link, $anchor, $visiblelink, $snippet, $position$page - 广告列表数组
  • $related.$i.key - 相关关键词列表数组
  • $serp 包含元素 $link, $anchor, $snippet, $cache - 搜索引擎主要结果数组
备注

请注意,对于数组,会明确指定变量 $i,这意味着有多个元素,可以通过索引(位置编号)访问它们,或者在循环中遍历每个元素。

提示

结果 $pages.$i.data 将自动更改为 $data,适用于那些不会在一次请求内“逐页翻页”的爬虫工具。例如 DeepL::TranslatorDeepL::Translator

结果展示

A-Parser 旨在抓取各种类型的信息,为此引入了 2 种结果类型:

  • 简单结果 (Flat)
  • 结果数组 (Array)

让我们以爬虫工具 SE::GoogleSE::Google 为例查看每种类型,搜索结果截图如下:

Google 搜索结果截图

简单结果

Simple results (简单结果) - 当一个查询对应一个结果时,例如:

  • 根据查询得到的结果数量 ($totalcount)
  • 查询是否为拼写错误 ($misspell,截图中未展示)

其他示例:

  • 爬虫工具 DeepL::TranslatorDeepL::Translator 中已翻译文本的值 ($translated)
  • 爬虫工具 Rank::MajesticSEORank::MajesticSEO 中的引用域名数量 ($domains)、信任流值 ($trustflow)、反向链接 ($backlinks) 等

单个结果保存在普通变量中(前缀 $ + 英文名称)

结果数组

结果数组 - 当一个查询对应一个结果列表时,列表中的每个元素又可以包含多个嵌套元素。以 Google 搜索结果为例 - 它在爬虫工具中由数组 $serp 表示,为了直观起见,我们使用表格记录前 5 个搜索结果:

链接 ($link)锚点 ($anchor)摘要 ($snippet)
http://www.speedtest.net/Speedtest.net by Ookla - The Global Broadband Speed TestTest your Internet connection bandwidth to locations around the world with this interactive broadband speed test from Ookla.
http://en.wikipedia.org/wiki/Test_cricketTest cricket - Wikipedia, the free encyclopediaTest 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 TestSaturday 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.aspPersonality test based on C. Jung and I. Briggs Myers type theoryHumanmetrics 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::GoogleSE::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 的每个元素,输出链接和锚点(中间用空格隔开),然后换行输出摘要,接着再换行两次,从而在结果之间形成一个空行。

使用模板引擎

输出变量

要使用模板引擎,需要插入标签 [% %],并在标签内部输入要执行的逻辑。

使用模板引擎输出 CMS使用模板引擎输出 CMS 的结果

遍历数组

要输出数组元素,需要使用 FOREACH 结构:

[% FOREACH i IN p1.list;    
i.cms _ "\n";
END %]
提示

有关模板引擎的更多信息和示例,请参阅 A-Parser 中模板工作的特性

示例

输出竞争程度

输出所有搜索引擎爬虫工具(SE::GoogleSE::GoogleSE::YandexSE::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::HTTPNet::HTTP 及其基础上的爬虫工具中,还可以额外输出:

  • $proxy - 执行查询时使用的代理

  • $headers - 响应头

  • $code - 响应代码

  • $reason - 响应状态

示例

以 JSON 格式输出变量值

对象的 .json 方法

输出查询的所有重定向

对于此任务,可以使用变量 $response,它允许获取查询的任何变量,包括所有之前的重定向。

结果格式:

$response.Redirects.format('$URI\n--> ')$response.URI

爬虫工具工作结果:

示例

使用模板引擎记录日期的 JSON 输出

示例显示了以 JSON 格式输出爬虫工具 Net::WhoisNet::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",
},
{}]
下载示例

如何将示例导入 A-Parser

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 新闻中

根据关键词检查网站是否出现在 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
下载示例

如何将示例导入 A-Parser

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::TagSocial::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
...
下载示例

如何将示例导入 A-Parser

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=

其他示例

常用模板示例