perl 如何复制网页的文本内容

7bsow1i6  于 2023-10-24  发布在  Perl
关注(0)|答案(3)|浏览(161)

天气资料有ogimet网页,相信这些资料是免费的。网页提供一个索取地面观测资料的脚本,内容如下

curl "http://www.ogimet.com/cgi-bin/getsynop?block=123&begin=200912010000&end=200912040000" -o "your_desired_file_name"

我可以在我所在的地区使用这些数据。除此之外,我还想访问高空观测数据。没有提供访问这些数据的脚本。可以通过以下链接手动访问,例如在一个站点上

https://www.ogimet.com/display_sond.php?lang=en&lugar=63741&tipo=ALL&ord=DIR&nil=SI&fmt=html&ano=2021&mes=09&day=02&hora=19&anof=2021&mesf=09&dayf=03&horaf=19&send=send

这给了我文本内容在截图

figure附件.我想知道是否有可能复制的文本,一旦我到达这个页面,使用,例如.一个Perl脚本.不幸的是,我没有任何最低工作的例子,我可以尝试.

y0u0uwnf

y0u0uwnf1#

是的,你可以像这样从网页上收集(“刮”)数据。
通常情况下,您会使用LWP::UserAgentMojo::UserAgent等工具获取页面--从Web服务器检索带有该网页HTML的字符串,然后使用Mojo::DOMHTML::TreeBuilder等库解析HTML以提取感兴趣的数据
这里有很多关于使用这些工具(以及其他工具)的帖子。这里是一个在Perl.com article中使用Mojo::DOM的圆形示例。
如果网页使用JavaScript来显示你感兴趣的数据,那就另当别论了。这意味着从服务器下载到浏览器的HTML也包含JavaScript代码--程序--可以直接在浏览器中运行。当你点击(或悬停等)页面元素时,它们就会被触发,重写页面,而不必返回服务器。
这是一个非常(过度)简化的解释,但关键是库需要理解JavaScript,以便将最后一个页面交给你解析,否则你只能得到最后一个来自服务器的HTML,以及尚未运行的JS代码。但上面链接的主要库不知道任何JavaScript;它们只是通过HTTP到达服务器,并将服务器返回的内容交给你。
对于一个了解JavaScript的工具,我推荐Selenium,用于测试网页,但也非常适合这项工作,它本身是用JavaScript编写的。在Perl中使用它的一种方法是使用Selenium::Chrome(或::Firefox)和Selenium::Remote::Driver

cwxwcias

cwxwcias2#

下面是一个使用Mojo::DOM的例子:

use feature qw(say);
use strict;
use warnings;
use LWP::UserAgent;
use Mojo::DOM;

my $ua = LWP::UserAgent->new();
my $url = 'https://www.ogimet.com/display_sond.php?' .
  'lang=en&lugar=63741&tipo=ALL&ord=DIR&nil=SI&fmt=html' .
  '&ano=2021&mes=09&day=02&hora=19&anof=2021&mesf=09&dayf=03&horaf=19&send=send';
my $res = $ua->get( $url );
if (!$res->is_success) {
    die $res->status_line;
}
my $html = $res->content;
my $dom = Mojo::DOM->new($html);
my @tables_raw_txt = $dom->find('table')->map('all_text')->each;
say $tables_raw_txt[1];
say "--------------- TABLE DATA --------------\n";
say $tables_raw_txt[2];

输出

63741, Nairobi / Dagoretti (Kenya) 
ICAO index: HKNC. Latitude 01-18S. Longitude 036-45E. Altitude 1798 m.

--------------- TABLE DATA --------------

 TEMP/PILOT from 63741, Nairobi / Dagoretti (Kenya)
TTAA
02/09/2021 23:00->
TTAA 52231 63741 99822 14818 14003 70132 07008 20507 50584 03975
     01508 40756 15970 09018 30967 31160 21008 25094 41557 23506
     20241 53358 22511 15421 66958 14023 10658 76556 09013 88104
     76957 13519 77999 31313 47708 82323=

TTBB
02/09/2021 23:00->
TTBB 52238 63741 00822 14818 11800 12407 22793 12006 33661 04001
     44645 02800 55614 02009 66589 01445 77568 00717 88552 00960
     99526 02366 11513 04160 22500 03975 33450 08773 44389 17571
     55380 17978 66349 21969 77300 31160 88284 33964 99255 40360
     11200 53358 22142 69558 33128 73757 44114 74556 55104 76957
     21212 00822 14003 11569 31016 22522 01503 33398 09019 44359
     08541 55277 24503 66211 25513 77134 12035 88108 15526 31313
     47708 82323 41414 7543/=

TTCC
02/09/2021 23:00->
TTCC 52237 63741 70867 72760 32520 88999 77999 31313 47708 82323=

TTDD
02/09/2021 23:00->
TTDD 5223/ 63741 11877 74556 22831 68956 33700 72760 21212 11908
     07010 22729 30529 33652 00000 44543 20020 31313 47708 82323=
tjvv9vkg

tjvv9vkg3#

  • OGIMET* 网站支持TXT格式的数据,需要使用 regex 来提取所需的数据。

如果Mojo::DOM模块不可用,则可以通过这种方式提取数据。
Perl脚本使用hash %params表示OP问题中指定的位置和日期。通过添加模块Getops::Long,每个参数都可以在命令行上单独调整。
注意:脚本接受一个参数 * 站id*

use strict;
use warnings;
use feature 'say';

use LWP::UserAgent;

my $station = shift;

my $url = 'https://www.ogimet.com/display_sond.php?';
my @params;
my %params = (
            'lang'  => 'en',     // language
            'lugar' => 63741,    // station
            'tipo'  => 'ALL',    // report type
            'ord'   => 'DIR',    // sort order
            'nil'   => 'SI',     // null report - SI (Yes)
            'fmt'   => 'txt',    // format
            'ano'   => 2021,     // year
            'mes'   => 9,        // month
            'day'   => 2,        // day
            'hora'  => 19,       // hour
            'anof'  => 2021,     // year
            'mesf'  => 9,        // month
            'dayf'  => 3,        // day
            'horaf' => 19,       // hour
            'send'  => 'send'
        );

$params{lugar} = $station if defined $station;

while( my($k,$v) = each %params ) {
    push @params, "$k=$v";
}

$url .= join('&',@params);

my $ua  = LWP::UserAgent->new();
my $res = $ua->get( $url );

if (!$res->is_success) {
    die $res->status_line;
}

my($data) = $res->content =~ m!<pre>(.*?)</pre>!gs;

say $data;

输出

##########################################################
# Query made at 09/04/2021 05:13:47 UTC
# Time interval: from 09/02/2021 19:00  to 09/03/2021 19:00  UTC
##########################################################

##########################################################
# 63741, Nairobi / Dagoretti (Kenya)
# IACO index: HKNC
# Latitude 01-18S. Longitude 036-45E. Altitude 1798 m.
##########################################################

##################################################
#  TEMP/PILOT from 63741, Nairobi / Dagoretti (Kenya)
##################################################
202109022300 TTAA 52231 63741 99822 14818 14003 70132 07008 20507 50584 03975
                  01508 40756 15970 09018 30967 31160 21008 25094 41557 23506
                  20241 53358 22511 15421 66958 14023 10658 76556 09013 88104
                  76957 13519 77999 31313 47708 82323=
202109022300 TTBB 52238 63741 00822 14818 11800 12407 22793 12006 33661 04001
                  44645 02800 55614 02009 66589 01445 77568 00717 88552 00960
                  99526 02366 11513 04160 22500 03975 33450 08773 44389 17571
                  55380 17978 66349 21969 77300 31160 88284 33964 99255 40360
                  11200 53358 22142 69558 33128 73757 44114 74556 55104 76957
                  21212 00822 14003 11569 31016 22522 01503 33398 09019 44359
                  08541 55277 24503 66211 25513 77134 12035 88108 15526 31313
                  47708 82323 41414 7543/=
202109022300 TTCC 52237 63741 70867 72760 32520 88999 77999 31313 47708 82323=
202109022300 TTDD 5223/ 63741 11877 74556 22831 68956 33700 72760 21212 11908
                  07010 22729 30529 33652 00000 44543 20020 31313 47708 82323=

相关问题