vba抓取网页数据(Scraping程序仅处理一种类型的请求:名为/的资源的GET)
优采云 发布时间: 2021-11-10 10:04vba抓取网页数据(Scraping程序仅处理一种类型的请求:名为/的资源的GET)
Scraping 程序只处理一种类型的请求:对名为 / 的资源进行 GET,它是 Stats::Controller 包中的屏幕截图和数据处理代码。供您检查的是 Plack/PSGI 路由设置,它位于源文件 scrape.pl 的顶部:
my
$router
= router
{
<br />
match
'/'
,
{ method
=>
'GET'
}
,
## noun/verb combo: / is noun, GET is verb
<br />
to
{ controller
=>
'Controller'
, action
=>
'index'
}
;
## handler is function get_index
<br />
# Other actions as needed
<br />
}
;
请求处理程序 Controller::get_index 只有高级逻辑,在 Util.pm 文件中的实用程序函数中保留了屏幕捕获和报告生成的详细信息,如下一节所述。
屏幕截图代码
回想一下,Plack 服务器向 Scraping 程序的 get_index 函数发送了一个对 localhost:5000/ 的 GET 请求。然后,该函数作为请求处理程序开始执行以下任务:检索要抓取的数据,抓取数据并生成最终报告。数据检索部分是一个实用函数,它使用 Perl 的 LWP::Agent 包从托管 data.html 文档的任何服务器检索数据。对于数据文件,Scraping 程序将调用实用函数extract_from_html 进行数据提取。
data.html 文档恰好是格式良好的 XML,这意味着可以使用 Perl 包(例如 XML::LibXML)通过显式 XML 解析来提取数据。然而,HTML::TableExtract 包是 HTML::TableExtract,因为它 HTML::TableExtract 绕过 XML 解析并且(用很少的代码)提供用于提取数据的 Perl 哈希。HTML 文档中的数据聚合通常出现在列表或表格中,而 HTML::TableExtract 封装 HTML ::TableExtract 表格是目标。这些是数据提取的三行关键代码:
my
$col_headers
= col_headers
(
)
;
## col_headers() returns an array of the table's column names
<br />
my
$te
= HTML
::
TableExtract
->
new
( headers
=>
$col_headers
)
;
<br />
$te
->
parse
(
$page
)
;
## $page is data.html
$col_headers 指的是 Perl 字符串数组,每个字符串都是 HTML 文档中的一个列标题:
sub col_headers
{
## column headers in the HTML table
<br />
[
"Area"
,
<br />
"MedianWage"
,
<br />
...
<br />
"BoostFromGradDegree"
]
;
<br />
}
在调用 TableExtract::parse 函数后,Scraping 程序将使用 TableExtract::rows 函数对提取的数据行(没有 HTML 标记的数据行)进行迭代。这些行(作为 Perl 列表)被添加到名为 %majors_hash 的 Perl 哈希中,如下所示:
收录提取数据的哈希将写入本地文件 rawData.dat:
ForeignLanguage 50000 35000 75000 3.5% 54% 101%
<br />
LiberalArts 47000 32000 70000 9.7% 41% 48%
<br />
...
<br />
Engineering 78000 54000 104000 8.2% 37% 32%
<br />
Computing 75000 51000 112000 5.1% 32% 31%
<br />
...
<br />
PublicPolicy 50000 36000 74000 2.3% 24% 45%
下一步是处理提取的数据。在这种情况下,Statistics::Descriptive 包将用于基本的统计分析。在上面的图 1 中,统计摘要显示在报告底部的单独表格中。
报告生成代码
Scraping 程序的最后一步是生成报告。Perl 有用于生成 HTML 的选项,包括 Template::Recall。顾名思义,该包从 HTML 模板生成 HTML,该模板混合了标准 HTML 标签和自定义标签,用作从后端代码生成的数据的占位符。模板文件是report.html,感兴趣的后端函数是Controller::generate_report。这就是代码与模板交互的方式。
报表文档(图1)有两张表。顶层表是迭代生成的,因为每一行都有相同的列(学习区域,第25个百分位收入等)。在每次迭代中,代码都会使用特定学习区域的值来创建哈希值:
my
%row
=
(
<br />
major
=>
$key
,
<br />
wage
=>
'$'
. commify
(
$values
[
]
)
,
## commify turns 1234 into 1,234
<br />
p25
=>
'$'
. commify
(
$values
[
1
]
)
,
<br />
p75
=>
'$'
. commify
(
$values
[
2
]
)
,
<br />
population
=>
$values
[
3
]
,
<br />
grad
=>
$values
[
4
]
,
<br />
boost
=>
$values
[
5
]
<br />
)
;
哈希键是 Perl 的裸词作为列表项,这样major 和wage 代表之前从HTML 数据文档中提取的数据值。对应的HTML模板如下:
[ === even === ]
<br />
<br />
['major']
<br />
['p25']
<br />
['wage']
<br />
['p75']
<br />
['pop']
<br />
['grad']
<br />
['boost']
<br />
<br />
[=== end1 ===]
自定义标签在方括号中。顶部和底部的标签分别标记了要渲染的模板区域的开始和结束。其他自定义标签标识后端代码的各种目标。例如,标识为主要的模板列将匹配以主要作为键的哈希条目。这是后端代码中的调用,它将数据绑定到自定义标签:
print OUTFILE $tr -> render ( 'end1' ) ;
引用$tr指向Template::Recall实例,OUTFILE是报表文件reportFinal.html,由模板文件report.html连同后端代码生成。如果一切顺利,reportFinal.html 文件就是用户在浏览器中看到的(见图 1).
爬虫利用优秀的Perl软件包,如Plack/PSGI、LWP::Agent、HTML::TableExtract、Template::Recall和Statistics::Descriptive来处理HTML::TableExtract的屏幕数据抓取任务。这些包可以很好地协同工作,因为每个包都针对特定的子任务。最后,可以扩展Scraping程序对提取的数据进行聚类:Algorithm::KMeans软件包适用于这种扩展,可以使用rawData.dat文件中的Algorithm::KMeans数据。
翻译自:
vba 数据捕获屏幕数据