Aqui está uma maneira de fazer isso com perl
usando os módulos LWP
, JSON
e Term::ANSIColor
. Term::ANSIColor
é um módulo perl central, mas os módulos LWP
e JSON
são CPAN . Eles são módulos muito comumente usados, então provavelmente estão disponíveis pré-empacotados para sua distro (por exemplo, no debian etc, apt-get install libjson-perl libwwww-perl
)
#!/usr/bin/perl
use strict;
use LWP::UserAgent;
use JSON;
use Term::ANSIColor;
my $bold = color('bold');
my $reset = color('reset');
my $base='https://uk.reuters.com'
foreach my $url (@ARGV) {
my $ua = LWP::UserAgent->new;
my $req = HTTP::Request->new(GET => $url);
my $res = $ua->request($req);
if ($res->is_success) {
foreach my $h ( @{ decode_json($res->content)->{headlines} }) {
print $bold, $h->{headline}, $reset, "\n", $base, $h->{url}, "\n\n";
};
} else {
die "Error processing '$url': ", $res->status_line, "\n";
}
}
Isso não precisa de curl
ou wget
ou de várias invocações de awk
e / ou cut
(essa fealdade foi o que me motivou a escrever uma resposta - como regra geral, se você está trabalhando grep
ou awk
em si mesmos, então você está fazendo errado. idem para canalizar cut
ou grep
para awk
- awk
pode fazer tudo o que os dois podem fazer e mais. Como pode perl
), ou qualquer outra coisa.
Salvar como, por exemplo ./bold-2nd.pl
, torne-o executável com chmod
e execute-o assim:
$ ./bold-2nd.pl https://uk.reuters.com/assets/jsonWireNews
RBS to pay $125 million to settle California mortgage bond claims
https://uk.reuters.com/article/uk-rbs-settlement/rbs-to-pay-125-million-to-settle-california-mortgage-bond-claims-idUKKBN1EH053
Driver charged with attempted murder over Australian vehicle attack
https://uk.reuters.com/article/uk-australia-attack/driver-charged-with-attempted-murder-over-australian-vehicle-attack-idUKKBN1EH044
EasyJet says other airlines interested in feeder flights from Tegel
https://uk.reuters.com/article/uk-air-berlin-m-a-easyjet/easyjet-says-other-airlines-interested-in-feeder-flights-from-tegel-idUKKBN1EH04W
[...]
Esta versão do script pode manipular vários URLs na linha de comando (é claro, todos eles precisam retornar os mesmos dados formatados em json ... ou pelo menos extremamente semelhantes em ambos os headline
e url
campo).
btw, eu fiz isso imprimir uma linha em branco entre cada artigo. Acho que isso é mais legível.
Se você quiser usar curl
para fazer a busca em vez do módulo perl LWP
, o script seria um pouco mais simples:
#!/usr/bin/perl
use strict;
use JSON;
use Term::ANSIColor;
my $bold = color('bold');
my $reset = color('reset');
my $base='https://uk.reuters.com'
undef $/;
my $json = <>; # slurp in entire stdin
foreach my $h ( @{ decode_json($json)->{headlines} }) {
print $bold, $h->{headline}, $reset, "\n", $base, $h->{url}, "\n\n";
};
Execute esta versão como:
$ curl -s https://uk.reuters.com/assets/jsonWireNew | ./bold-2nd.pl
Note que ambas as versões do script em negrito usam um analisador json para realmente analisar os dados do json, em vez de confiar em expressões regulares para procurar por linhas que correspondam a padrões específicos. Como já foi observado muitas vezes antes, a análise de json, ou html, ou xml, ou qualquer formato de dados estruturado similar com expressões regulares, não é confiável e é frágil. No caso simples, pode ser feito para funcionar, mas mesmo pequenas alterações no formato de entrada podem quebrar o script (por exemplo, se a Reuters parar de produzir json bastante impresso com feeds de linha entre cada elemento de dados e registro e começar a imprimir apenas uma linha de json, qualquer combinador de padrão regexp baseado em linha quebrará)
Finalmente, os dados do json buscados por curl
(ou LWP) são assim:
{ "headlines": [
{ "id": "UKKBN1EH044",
"headline": "Driver charged with attempted murder over Australian vehicle attack",
"dateMillis": "1514003249000",
"formattedDate": "3m ago",
"url": "/article/uk-australia-attack/driver-charged-with-attempted-murder-over-australian-vehicle-attack-idUKKBN1EH044",
"mainPicUrl": "https://s4.reutersmedia.net/resources/r/?m=02&d=20171223&t=2&i=1216634499&w=116&fh=&fw=&ll=&pl=&sq=&r=LYNXMPEDBM04W"
},
]}
Portanto, id
, dateMillis
, formattedDate
e mainPicURL
também estão disponíveis para impressão ou outro uso na variável perl $h
hashref, bem como os headline
e url
que estamos imprimindo.