Warum kann ich mit LWP::Simple keine Wikipedia-Seiten abrufen?
Frage
Ich versuche, Wikipedia-Seiten abzurufen LWP::Einfach, aber sie kommen nicht zurück.Dieser Code:
#!/usr/bin/perl
use strict;
use LWP::Simple;
print get("http://en.wikipedia.org/wiki/Stack_overflow");
druckt nichts.Aber wenn ich beispielsweise eine andere Webseite verwende http://www.google.com
, es funktioniert gut.
Gibt es einen anderen Namen, den ich verwenden sollte, um auf Wikipedia-Seiten zu verweisen?
Was könnte hier los sein?
Lösung
Anscheinend blockiert Wikipedia LWP::Simple-Anfragen: http://www.perlmonks.org/?node_id=695886
Folgendes funktioniert stattdessen:
#!/usr/bin/perl
use strict;
use LWP::UserAgent;
my $url = "http://en.wikipedia.org/wiki/Stack_overflow";
my $ua = LWP::UserAgent->new();
my $res = $ua->get($url);
print $res->content;
Andere Tipps
Sie können den UA auch einfach im LWP::Simple-Modul festlegen – importieren Sie einfach die Variable $ua und schon können Sie den zugrunde liegenden UserAgent ändern:
use LWP::Simple qw/get $ua/;
$ua->agent("WikiBot/0.1");
print get("http://en.wikipedia.org/wiki/Stack_overflow");
Ich habe dieses Problem mit gelöst LWP:RobotUA
anstatt LWP::UserAgent
.Sie können das Dokument unten lesen.Es gibt nicht viele Unterschiede, die Sie ändern sollten.
Weil Wikipedia die von LWP::Simple verwendete HTTP-Benutzeragentenzeichenfolge blockiert.
Wenn Sie versuchen, es zu verwenden, erhalten Sie die Antwort „403 verboten“.
Probieren Sie das Modul LWP::UserAgent aus, um dieses Problem zu umgehen, indem Sie das Agent-Attribut festlegen.
Sehen Sie sich auch die Mediawiki-bezogenen CPAN-Module an – diese sind für den Zugriff auf Mediawiki-Websites (zu denen auch Wikipedia gehört) konzipiert und bieten Ihnen möglicherweise mehr Schnickschnack als einfaches LWP.