爬虫抓取网页数据(Scraping程序仅处理一种类型的请求:名为/的资源的GET)
优采云 发布时间: 2022-03-28 18:11爬虫抓取网页数据(Scraping程序仅处理一种类型的请求:名为/的资源的GET)
Scraping 程序只处理一种类型的请求:一个名为 / 的资源的 GET,它是 Stats::Controller 包中的屏幕抓取和数据处理代码。供您查看的是源文件 scrape.pl 顶部的 Plack/PSGI 路由设置:
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 服务器将 GET 请求分派到 localhost:5000/ 到抓取程序的 get_index 函数。然后,此函数充当请求处理程序并执行以下操作:检索要抓取的数据、抓取数据并生成最终报告。数据检索部分是一个实用功能,它使用 Perl 的 LWP::Agent 包从托管 data.html 文档的任何服务器获取数据。使用数据文档,抓取程序将调用实用函数 extract_from_html 进行数据提取。
data.html 文档恰好是格式良好的 XML,这意味着可以使用 XML::LibXML 等 Perl 包通过显式 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 函数后,抓取程序将使用 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 中,统计摘要显示在报告底部的单独表格中。
报告生成代码
抓取程序的最后一步是生成报告。Perl 有生成 HTML 的选项,其中有 Template::Recall。顾名思义,此包从 HTML 模板生成 HTML,该模板混合了标准 HTML 标记和自定义标记,用作后端代码生成的数据的占位符。模板文件是report.html,感兴趣的后端函数是Controller::generate_report。这就是代码和模板交互的方式。
报表文档(图1)有两个表。顶层表是迭代生成的,因为每一行都有相同的列(学习区、第25个百分位收入等)。在每次迭代中,代码都会创建一个hash具有特定学习域的值:
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 和工资表示之前从 HTML 数据文档中提取的数据值的列表项。对应的HTML模板如下:
[ === even === ]
<br />
<br />
['major']
<br />
['p25']
<br />
['wage']
<br />
['p75']
<br />
['pop']
<br />
['grad']
<br />
['boost']
<br />
<br />
[=== end1 ===]
自定义标签在方括号中。顶部和底部标签分别标记要渲染的模板区域的开始和结束。其他自定义标签标识后端代码的各种目标。例如,标识为major 的模板列将匹配以major 作为键的散列条目。以下是将数据绑定到自定义标签的后端代码中的调用:
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数据抓取屏幕数据