爬虫抓取网页数据(Scraping程序仅处理一种类型的请求:名为/的资源的GET)

优采云 发布时间: 2022-03-28 18:11

  爬虫抓取网页数据(Scraping程序仅处理一种类型的请求:名为/的资源的GET)

  Scraping 程序只处理一种类型的请求:一个名为 / 的资源的 GET,它是 Stats::Controller 包中的屏幕抓取和数据处理代码。供您查看的是源文件 scrape.pl 顶部的 Plack/PSGI 路由设置:

  

my

$router

= router

{

<br />

    match

&#39;/&#39;

,

{ method

=>

&#39;GET&#39;

}

,  

## noun/verb combo: / is noun, GET is verb

<br />

    to

{ controller

=>

&#39;Controller&#39;

, action

=>

&#39;index&#39;

}

;

## 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&#39;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 />

   

return

[

"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  

=>

&#39;$&#39;

. commify

(

$values

[

]

)

,

## commify turns 1234 into 1,234

<br />

     p25  

=>

&#39;$&#39;

. commify

(

$values

[

1

]

)

,

<br />

     p75  

=>

&#39;$&#39;

. commify

(

$values

[

2

]

)

,

<br />

     population  

=>

$values

[

3

]

,

<br />

     grad  

=>

$values

[

4

]

,

<br />

     boost

=>

$values

[

5

]

<br />

)

;

  散列键是 Perl 的裸词,例如 major 和工资表示之前从 HTML 数据文档中提取的数据值的列表项。对应的HTML模板如下:

  

[ === even  === ]

<br />

<br />

   [&#39;major&#39;]

<br />

   [&#39;p25&#39;]

<br />

   [&#39;wage&#39;]

<br />

   [&#39;p75&#39;]

<br />

   [&#39;pop&#39;]

<br />

   [&#39;grad&#39;]

<br />

   [&#39;boost&#39;]

<br />

<br />

[=== end1 ===]

  自定义标签在方括号中。顶部和底部标签分别标记要渲染的模板区域的开始和结束。其他自定义标签标识后端代码的各种目标。例如,标识为major 的模板列将匹配以major 作为键的散列条目。以下是将数据绑定到自定义标签的后端代码中的调用:

   print OUTFILE $tr -> render ( &#39;end1&#39; ) ;

  引用 $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数据抓取屏幕数据

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线